`
lovnet
  • 浏览: 6713661 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
文章分类
社区版块
存档分类
最新评论

iptables中对TCP,UDP,ICMP非常不错的阐述

 
阅读更多

数据包在用户空间的状态

就象前面说的,包的状态依据IP所包含的协议不同而不同,但在内核外部,也就是用户空间里,只有4种 状态:NEWESTABLISHEDRELATEDINVALID。它们主要是和状态匹配一起使用。下面就简要地介绍以下这几种状态:

NEW说明这个包是我们看到的第一个包。意思就是,这是conntrack模块看到的某个连接第一个包,它即将被匹配了。比如,我们看到一个SYN 包,是我们所留意的连接的第一个包,就要匹配它。第一个包也可能不是SYN包,但它仍会被认为是NEW状态。这样做有时会导致一些问题,但对某些情况是有非常大的帮助的。例如,在 我们想恢复某条从其他的防火墙丢失的连接时,或者某个连接已经超时,但实际上并未关闭时。

ESTABLISHED已经注意到两个方向上 的数据传输,而且会继续匹配这个连接的包。处于ESTABLISHED状态的连接是非常容 易理解的。只要发送并接到应答,连接就是ESTABLISHED的了。一个连接要从NEW变 为ESTABLISHED,只需要接到应答包即可,不管这个包是发往防火墙的,还是要由防 火墙转发的。ICMP的错误和重定向等信息包也被看作是ESTABLISHED,只要它们是我 们所发出的信息的应答。

RELATED是个比较麻烦的状态。当一 个连接和某个已处于ESTABLISHED状态的连接有关系时,就被认为是RELATED的了。换句话说,一个连接要想 是RELATED的,首先要有一个ESTABLISHED的连接。这个ESTABLISHED连接再产生一个主连接之外的连接,这 个新的连接就是RELATED的了,当然前提是conntrack模块要能理解RELATED。ftp是个很好的例子,FTP-data 连接就是和FTP-control有RELATED的。还有其他的例子,比如,通过IRC的DCC连接。有了这个状态,ICMP应 答、FTP传输、DCC等才能穿过防火墙正常工作。注意,大部分还有一些UDP协议都依赖这个机制。这些协议 是很复杂的,它们把连接信息放在数据包里,并且要求这些信息能被正确理解。

INVALID说明数据包不能被识别属于 哪个连接或没有任何状态。有几个原因可以产生这种情况,比如,内存溢出,收到不知属于哪个连接的ICMP 错误信息。一般地,我们DROP这个状态的任何东西。

这些状态可以一起使用,以便匹配数据包。这可以使我们的防火墙非常强壮和有效。以前,我们经常打 开1024以上的所有端口来放行应答的数据。现在,有了状态机制,就不需再这样了。因为我们可以只开放那 些有应答数据的端口,其他的都可以关闭。这样就安全多了。


TCP 连接

本节和下面的几节,我们来详细讨论这些状态,以及在TCP、UDP和ICMP这三种基本的协议里怎样操作它 们。当然,也会讨论其他协议的情况。我们还是从TCP入手,因为它本身就是一个带状态的协议,并且具有 很多关于iptables状态机制的详细信息。

一个TCP连接是经过三次握手协商连接信息才建立起来的。整个会话由一个SYN包开始,然后是一个 SYN/ACK包,最后是一个ACK包,此时,会话才建立成功,能够发送数据。最大的问题在于连接跟踪怎样控制 这个过程。其实非常简单。

默认情况下,连接跟踪基本上对所有的连接类型做同样的操作。看看下面的图片,我们就能明白在连接 的不同阶段,流是处于什么状态的。就如你看到的,连接跟踪的代码不是从用户的观点来看待TCP连接建立 的流程的。连接跟踪一看到SYN包,就认为这个连接是NEW状态,一看到返回的SYN/ACK包,就认为连接是 ESTABLISHED状态。如果你仔细想想第二步,应该能理解为什么。有了这个特殊处理,NEW和ESTABLISHED包 就可以发送出本地网络,且只有ESTABLISHED的连接才能有回应信息。如果把整个建立连接的过程中传输的 数据包都看作NEW,那么三次握手所用的包都是NEW状态的,这样我们就不能阻塞从外部到本地网络的连接 了。因为即使连接是从外向内的,但它使用的包也是NEW状态的,而且为了其他连接能正常传输,我们不得 不允许NEW状态的包返回并进入防火墙。更复杂的是,针对TCP连接内核使用了很多内部状态,它们的定义在RFC 793 - Transmission ControlProtocol的21-23页。但好在我们在用 户空间用不到。后面我们会详细地介绍这些内容。


正如你看到的,以用户的观点来看,这是很简单的。但是,从内核的角度看这一块还有点困难的。我们 来看一个例子。认真考虑一下在/proc/net/ip_conntrack里,连接的状态是如何 改变的。

tcp 6 117 SYN_SENTsrc=192.168.1.5 dst=192.168.1.35 sport=1031 \

dport=23 [UNREPLIED]src=192.168.1.35 dst=192.168.1.5 sport=23 \

dport=1031 use=1

从上面的记录可以看出,SYN_SENT状态被设置了,这说明连接已经发出一个SYN包,但应答还没发送过 来,这可从[UNREPLIED]标志看出。

tcp 6 57 SYN_RECVsrc=192.168.1.5 dst=192.168.1.35 sport=1031 \

dport=23src=192.168.1.35 dst=192.168.1.5 sport=23 dport=1031 \

use=1

现在我们已经收到了相应的SYN/ACK包,状态也变为SYN_RECV,这说明最初发出的SYN包已正确传输,并 且SYN/ACK包也到达了防火墙。 这就意味着在连接的两方都有数据传输,因此可以认为两个方向都有相应的 回应。当然,这是假设的。

tcp 6 431999ESTABLISHED src=192.168.1.5 dst=192.168.1.35 \

sport=1031 dport=23src=192.168.1.35 dst=192.168.1.5 \

sport=23 dport=1031use=1

现在我们发出了三步握手的最后一个包,即ACK包,连接也就进入ESTABLISHED状态了。再传输几个数据 包,连接就是[ASSURED]的了。

下面介绍TCP连接在关闭过程中的状态。


如上图,在发出最后一个ACK包之前,连接(指两个方向)是不会关闭的。注意,这只是针对一般的情 况。连接也可以通过发送关闭,这用在拒绝一个连接的时候。在RST包发送之后,要经过预先设定的一段时 间,连接才能断掉。

连接关闭后,进入TIME_WAIT状态,缺省时间是2分钟。之所以留这个时间,是为了让数据包能完全通过 各种规则的检查,也是为了数据包能通过拥挤的路由器,从而到达目的地。

如果连接是被RST包重置的,就直接变为CLOSE了。这意味着在关闭之前只有10秒的默认时间。RST包是不 需要确认的,它会直接关闭连接。针对TCP连接,还有其他一些状态我们没有谈到。下面给出一个完整的状 态列表和超时值。

内部状态

State

Timeout value

NONE

30 minutes

ESTABLISHED

5 days

SYN_SENT

2 minutes

SYN_RECV

60 seconds

FIN_WAIT

2 minutes

TIME_WAIT

2 minutes

CLOSE

10 seconds

CLOSE_WAIT

12 hours

LAST_ACK

30 seconds

LISTEN>

2 minutes


这些值不是绝对的,可以随着内核的修订而变化,也可以通过/proc/sys/net/ipv4/netfilter/ip_ct_tcp_*的变量更改。这些默认值都是经过实践 检验的。它们的单位是jiffies(百分之一秒),所以3000就代表30秒。

NOTE:注意状态机制在用户空间里的部分不会查看TCP包的标志位(也就是说TCP标志对它而言是透明 的)。如果我们想让NEW状态的包通过防火墙,就要指定NEW状态,我们理解的NEW状态的意思就是指SYN包, 可是iptables又不查看这些标志位。这就是问题所在。有些没有设置SYN或ACK的包,也会被看作NEW状态的。这样的包可能会被冗余防火墙用到,但对只有一个防火墙的网络是很不利的(可能会被攻击哦)。那我 们怎样才能不受这样的包的影响呢?你可以使用未设置SYN的NEW状态包里的命令。还有一个办法,就是安装patch-o-matic里的tcp-window-tracking扩展功能,它可以使防火墙能根据TCP的一些标志位来进行状态跟踪。

UDP连接

UDP连接是无状态的,因为它没有任何的连接建立和关闭过程,而且大部分是无序列号的。以某个顺序收 到的两个数据包是无法确定它们的发出顺序的。但内核仍然可以对UDP连接设置状态。我们来看看是如何跟 踪UDP连接的,以及conntrack的相关记录。


从上图可以看出,以用户的角度考虑,UDP连接的建立几乎与TCP的一样。虽然conntrack信息看起来有点 儿不同,但本质上是一样的。下面我们先来看看第一个UDP包发出后的conntrack记录。

udp 17 20src=192.168.1.2 dst=192.168.1.5 sport=137 dport=1025 \

[UNREPLIED]src=192.168.1.5 dst=192.168.1.2 sport=1025 \

dport=137 use=1

从前两个值可知,这是一个UDP包。第一个是协议名称,第二个是协议号,第三个是此状态的生存时间, 默认是30秒。接下来是包的源、目地址和端口,还有期待之中回应包的源、目地址和端口。[UNREPLIED]标 记说明还未收到回应。

udp 17 170src=192.168.1.2 dst=192.168.1.5 sport=137 \

dport=1025src=192.168.1.5 dst=192.168.1.2 sport=1025 \

dport=137 use=1

一旦收到第一个包的回应,[UNREPLIED]标记就会被删除,连接就被认为是ESTABLISHED的,但在记录里 并不显示ESTABLISHED标记。相应地,状态的超时时间也变为180秒了。在本例中,只剩170秒了,10秒后, 就会减少为160秒。有个东西是不可少的,虽然它可能会有些变化,就是前面提过的[ASSURED]。要想变为 [ASSURED]状态,连接上必须要再有些流量。

udp 17 175src=192.168.1.5 dst=195.22.79.2 sport=1025 \

dport=53src=195.22.79.2 dst=192.168.1.5 sport=53 \

dport=1025 [ASSURED]use=1

可以看出来,[ASSURED]状态的记录和前面的没有多大差别,除了标记由[UNREPLIED]变成[ASSURED]。如 果这个连接持续不了180秒,那就要被中断。180秒是短了点儿,但对大部分应用足够了。只要遇到这个连接 的包穿过防火墙,超时值就会被重置为默认值,所有的状态都是这样的。

ICMP 连接

ICMP也是一种无状态协议,它只是用来控制而不是建立连接。ICMP包有很多类型,但只有四种类型有应 答包,它们是回显请求和应答(Echo request and reply),时间戳请求和应答(Timestamp request and reply),信息请求和应答(Information request and reply),还有地址掩码请求和应答(Address mask request and reply),这些包有两种状态,NEWESTABLISHED。时间戳请求和信息请求已经废除不用了,回显请求还是常用的,比如ping命令就用的到,地址掩码请 求不太常用,但是可能有时很有用并且值得使用。看看下面的图,就可以大致了解ICMP连接的NEWESTABLISHED状态了。


如图所示,主机向目标发送一个回显请求,防火墙就认为这个包处于NEW状态。 目标回应一个回显应答,防火墙就认为包处于ESTABLISHED了。当回显请求被发送 时,ip_conntrack里就有这样的记录了:

icmp 1 25src=192.168.1.6 dst=192.168.1.10 type=8 code=0 \

id=33029 [UNREPLIED]src=192.168.1.10 dst=192.168.1.6 \

type=0 code=0 id=33029use=1

可以看到,ICMP的记录和TCP、UDP的有点区别,协议名称、超时时间和源、目地址都一样,不同之处在 于没有了端口,而新增了三个新的字段:type,code和id。字段type说明ICMP的类型。code说明ICMP的代 码,这些代码在附录ICMP类型里有说明。id是ICMP包的ID。每个ICMP包被发送时都被分配一个ID,接受方把同样的ID 分配给应答包,这样发送方能认出是哪个请求的应答。

[UNREPLIED]的含义和前面一样,说明数的传输只发生在一个方向上,也就是说未收到应答。再往后,是 应答包的源、目地址,还有相应的三个新字段,要注意的是type和code是随着应答包的不同而变化的,id和 请求包的一样。

和前面一样,应答包被认为是ESTABLISHED的。然而,在应答包之后,这个ICMP 连接就不再有数据传输了。所以,一旦应答包穿过防火墙,ICMP的连接跟踪记录就被销毁了。

以上各种情况,请求被认为NEW,应答是ESTABLISHED。 换句话说,就是当防火墙看到一个请求包时,就认为连接处于NEW状态,当有应答 时,就是ESTABLISHED状态。

PS:注意,应答包必须符合一定的标准,连接才能被认作established的,每个传输类型都是这样。

ICMP的缺省超时是30秒,可以在/proc/sys/net/ipv4/netfilter/ip_ct_icmp_timeout中修改。这个值是比较合适 的,适合于大多数情况。

ICMP的另一个非常重要的作用是,告诉UDP、TCP连接或正在努力建立的连接发生了什么,这时ICMP应答 被认为是RELATED的。主机不可达和网络不可达就是这样的例子。当试图连接某台机 子不成功时(可能那台机子被关上了),数据包所到达的最后一台路由器就会返回以上的ICMP信息,它们就 是RELATED的,如下图:


我们发送了一个SYN包到某一地址,防火墙认为它的状态是NEW。但是,目标网络 有问题不可达,路由器就会返回网络不可达的信息,这是RELATED的。连接跟踪会认 出这个错误信息是哪个连接的,连接会中断,同时相应的记录删除会被删除。

当UDP连接遇到问题时,同样会有相应的ICMP信息返回,当然它们的状态也是RELATED,如下图:


我们发送一个UDP包,当然它是NEW的。但是,目标网络被一些防火墙或路由器所 禁止。我们的防火墙就会收到网络被禁止的信息。防火墙知道它是和哪个已打开的UDP连接相关的,并且把 这个信息(状态是RELATED)发给它,同时,把相应的记录删除。客户机收到网络被 禁止的信息,连接将被中断。

分享到:
评论

相关推荐

    Iptables 中文指南

    2.1. 哪里能取得iptables 2.2. 内核配置 2.3. 编译与安装 2.3.1. 编译 2.3.2. 在Red Hat 7.1上安装 3. 表和链 3.1. 概述 3.2. mangle 表 3.3. nat 表 3.4. Filter 表 4. 状态机制 4.1. 概述 4.2. ...

    iptables指南1.1.19电子书

    iptables指南1.1.19电子书 译者序 关于作者 如何阅读 必备知识 本文约定 1. 序言 1.1. 为什么要写这个指南 1.2. 指南是如何写的 1.3. 文中出现的术语 2. 准备阶段 2.1. 哪里能取得iptables 2.2. 内核配置 ...

    Iptables 指南 1.1.19

    4.4. TCP 连接 4.5. UDP 连接 4.6. ICMP 连接 4.7. 缺省的连接操作 4.8. 复杂协议和连接跟踪 5. 保存和恢复数据管理规则 5.1. 速度 5.2. restore的不足之处 5.3. iptables-save 5.4. iptables-restore 6. 规则是...

    nf-hipac-0.9.2

    iptables,象更多的包过滤,使用一个简单的包分类算法,对线性的穿过一个链中的每一个包在进行匹配(非)一个规则。明显的,这个方法缺乏效率。 nf-HiPAC ,提供一个新颖包分类的架构。当查找每一个包的时候使用一个...

    构筑Linux防火墙之IPtables的概念与用法

    因此,conntrack中有许多用来处理TCP、UDP或ICMP协议的部件。这些模块从数据包中提取详细的、唯一的信息,因此能保持对每一个数据流的跟踪。这些信息也告知conntrack流当前的状态。例如,UDP流一般由他们的目的地址...

    minimal-iptables:一组最小的 iptables 规则,仅接受 HTTPS 和 SSH 作为输入

    允许已经建立的 tcp 和 udp 连接 icmp (ping) 请求和回复 FORWARD - 无(默认 DROP) OUTPUT -all(信任内部用户) 滴滴 显然,它会丢弃所有其余的东西。 服务器配置 文件iptables.up.server.rules包含基本服务器...

    SNAT网关Lvs-snat.zip

    支持tcp、udp、icmp 增加redirect next hop功能,用于特殊选路需求和链路故障切换 性能非常好,根据lvs性能接近 目前不支持ipv6 snat ip pool选择算法支持hash(sip),hash(sip,dip),hash(sip,dip,sport,dport) ...

    Linux防火墙.pdf

    书中全面阐述了iptables防火墙,并详细讨论了如何应用psad、fwsnort、fwknop 3个开源软件最大限度地发挥iptables检测和防御攻击的效力。大量真实例子以及源代码更有助于读者理解安全防御的原理、技术和实际作。 ...

    Conntracker:防火墙嗅探器。 实时,低开销地分析所有iptables(netfilter / xtables)或nf_tables现有流,并以可消耗的方式进行通知。-C/C++开发

    连接跟踪器/防火墙规则指示器解决日志TCP,UDP和ICMP IPv4 / IPv6流的问题。 了解主机(或防火墙)中的网络流量; 创建适当的iptables(或nf_tables)规则; 怪罪防火墙行为(接受/拒绝); 优化防火墙规则; 编译...

    新浪-云计算新员工培养-运维工程师.doc

    iptables [-t filter] [-AI INPUT,OUTPUT,FORWARD] ...[-p tcp,udp.icmp,all] [-s ip/nerwork] [--sport ports] [-d ip/network] [--dport ports] [-j ACCEPT DROP REJECT REDIRECT MASQUERADE LOG

    Jay's Iptables Firewall-开源

    [不再维护] Jay的Iptables防火墙是一个脚本,支持多个(外部/内部)接口,TCP / UDP / ICMP控制,伪装,合成洪水控制,欺骗控制,端口转发,VPN(vtund),ToS,拒绝主机, ZorbIPTraff

    firewall-rules:快速而肮脏的 IPtables 防火墙脚本

    您需要修改 4 行: tcp_ports_in=() tcp_ports_out=() udp_ports_in=() udp_ports_out() 语法: tcp_ports_in=(80 443) 端口 IN 是需要打开服务器上的服务才能访问的端口ex. Apache Webserver - TCP 80 443 端口 ...

    Myra Canyon:网络控制和报告-开源

    对第2层(mac),第3层(ipv4,ipv6),第4层(icmp,tcp,udp)和第7层(专用)进行深度数据包检查。 网络流量摘要和所有检查的流量层以1秒的间隔存储在数据库中。 然后,挖掘该数据库以驱动Apache / PHP Web界面...

    iptables权威指南

    2.1.哪里能取得iptables............................................................................................................................................8 2.2.内核配置...........................

    Linux常见面试题,应对面试分享

    **TCP和UDP协议的区别** **tcp有哪些控制位,分别是什么意思** **你是用过哪些Linux命令** **Linux 系统安全优化与内核优化** **经常使用shell脚本做什么** **软连接与硬链接的区别** **怎么查看文件** **IOS...

    基于Linux 的防火墙技术研究

    TCP/UDP 头中的源端口号;同时,内核会记录下 此替换.当外部的返回包到来时(送往防火墙主机 的临时端口),服务器能自动识别它,将此返回包 的IP 地址和端口号替换成内部主机的地址和端 口号,发给内部主机。分组过滤...

    avengers_cctf1:CS 430 CCTF 存储库

    *扩展您的监控软件,以便您可以自动获取有关 TCP 数据、TCP SYN、UDP 和 ICMP 以及总计类别中发送到服务器的数据包和字节数的统计信息,以便您可以诊断各种 DDoS 攻击。 确保软件监控正确的接口。 监控非常重要...

    DeltaProxyForwarder:GFW

    执行程序,测试效果dpGateway testip="x.x.x.x"iptables -I zone_lan_forward -p tcp -d $testip -j QUEUEiptables -I FORWARD -t filter -p icmp --icmp-type ttl-exceeded -j DROPtestip为被墙reset封锁的ip,这

    softap_ap6212a0_tinav2.1_验证通过_旧版本的系统_20170915_1223没有外层目录.7z

    < > UDP-Lite protocol connection tracking support < > Amanda backup protocol support < > FTP protocol support < > H.323 protocol support < > IRC protocol support < > NetBIOS name service protocol...

Global site tag (gtag.js) - Google Analytics