iptables状态匹配

这一章我们主要从细节上讲解状态匹配的工作原理,读完本章,你应该清醒的知道状态匹配是如何工作的。在这一节,我们还会通过一系列的例子来说明它的工作机制,希望这样能够加深你对状态的理解。

介绍

    状态机制是iptables中特殊的一部分,状态机制是一种连接跟踪机制,连接跟踪可以让Netfilter知道某个特定连接的状态。运行连接跟踪的防火墙称作带有状态机制的防火墙,以下简称为状态防火墙。状态防火墙比非状态防火墙要安全,因为它允许我们编写更严密的规则。

    在iptables里面,报文适合连接跟踪的四种状态相关,分别是NEW, ESTABLISHED, RELATED and INVALID。我们后面对一种状态都会深入探讨,通过使用—state参数我们就能够轻易的控制谁或者什么能够发起新的会话。所有连接跟踪都是通过内核中一个叫做conntrack的框架来实现,conntrack可以被编译进内核,也可以作为一个模块存在。大部分情况下,我们都需要也想要一个详细的连接跟踪而不是默认的这个。因此,这儿就会有更多的功能模块分别处理TCP/UDP/ICMP等协议。这些功能模块从报文里面提取一些特定信息来标志一个特定的连接。例如UDP流通过用他们的目睹地址,源地址,目的端口以及源端口组合来表示。

    连接跟踪的状态主要在两个地方被触发,一个是PREROUTING,另外一个数OUTPUT,他们分别对应外来报文和本级产生报文。例如我们从本级发送一个报
文,那么在OUTPUT链里面,它的状态会变成NEW,当我们接收到回应报文的时候,连接状态就PREROUTING处更改为ESTABLISHED,以此类推。加入第一个报文不是我们尝试的,那么在PREROUTING出就设置为NEW,然后我们发送回复的时候,在OUTPUT设置为ESTABLISHED。

连接跟踪实体

    我们先来简要的看一下连接跟踪的实体以及从/proc/net/ip_conntrack里面读出来的值。这里面包含了当前你连接跟踪数据库的所有实体。如果你的连接跟踪模块已经加载了,那么我们查看/proc/net/ip_conntrack(在高版本的linux系统中可以能是nf_conntrack文件)可能会得到如下结果:

tcp 6 117 SYN_SENT src=192.168.1.6 dst=192.168.1.9 sport=32775 \
dport=22 [UNREPLIED] src=192.168.1.9 dst=192.168.1.6 sport=22 \
dport=32775 [ASSURED] use=2

    conntrack模块维护的所有信息都包含在这个例子中了,通过它们就可以知道某个特定的连接处于什么状态。

    首先显示的是协议,这里是tcp,接着是十进制的6(译者注:tcp的协议类型代码是6)。

    之后的117是这条conntrack记录的生存时间,它会有规律地被消耗,直到收到这个连接的更多的包。那时,这个值就会被设为当时那个状态的缺省值。

    接下来的是这个连接在当前时间点的状态。上面的例子说明这个包处在状态 SYN_SENT,这个值是iptables显示的,以便我们好理解,而内部用的值稍有不同。SYN_SENT说明我们正在观察的这个连接只在一个方向发送了一TCP SYN包。再下面是源地址、目的地址、源端口和目的端口。其中有个特殊的词UNREPLIED,说明这个连接还没有收到任何回应。

    最后,是希望接收的应答包的信息,他们的地址和端口和前面是相反的。

用户空间状态

    根据协议的不同,报文在内核里面可能经历几个完全不同的状态。但是出了内核及用户空间,我们就只有前面介绍的4种状态了。这4种状态分别是NEW, ESTABLISHED, RELATED and INVALID. 它们主要是和状态匹配一起使用

State

Explanation

NEW

NEW状态表示这个报文是我们所看到的第一个报文,也意味着在连接跟踪系统里面,它马上就被匹配。例如我们发送一个SYN报文,它就是连接跟踪系统所看到的第一个报文,接着它将会被匹配。但是一些不是SYN的报文也有可能被认为是NEW状态,这样在某些情况下可能会导致一些问题,但是它对于我们重新恢复被其他防火墙关闭的连接很重要,或者说一个连接已经超时了,但是没有真正关闭。

ESTABLISHED

ESTABLISHED状态表示在双向都看到流量了,并且会持续匹配 。ESTABLISHED状态其实很容易理解,要想进入ESTABLISHED状态,一个机器只需要发送一个报文,然后收到相应的应答报文。只要接受到一个应答,状态就会从NEW变成ESTABLISHED,即使接收到的是ICMP的错误报告。

RELATED

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

INVALID

INVALID意味着这个报文不能被识别或者它没有任何状态。导致这个的原因可能有很多种,例如内存不足或和返回的ICMP没有匹配上任何连接。一般而言,在这种状态下丢包是一个很好的选择。

UNTRACKED

UNTRACKED状态,简单的说,报文在raw表里面被NPTRACK target进行了标记,然后这个报文在连接跟踪表里面的状态就是UNTRACKED。这也就是说所有RELATED的链接都看不到,一些特殊情况我们需要仔细考虑,例如相关的ICMP报文需要特殊处理。

 这些状态可以—state 选项和在一起完成基于状态的报文匹配,这么做让我们的连接跟踪系统不可思议的强健和高效。以前,我们需要打开所有1024以上的端口让报文进行我们本地网络,但是有了连接跟踪系统之后,就再也没有必要打开所有的端口了。因为我们只需要打开我们所希望的返回端口。

TCP连接

    TCP连接通过三次握手来初始化,这样我们就建立和协商了一个实际数据发送的连接。整个会话是通过SYN报文开始的,接着回应一个SYN/ACK报文,最后给予ACK报文通知连接已经建立起来。现在我们就能够通过这个连接发送数据了,最大的问题是连接跟踪系统是怎么参与这个问题,答案马上就来。

    正如用户所想的,连接跟踪对于所有的连接类型工作流程都是一致的,我们仔细看一下下面的图片,并且观察连接的状态变化。你可能已经看出来了,连接跟踪系统并没有严格的遵从用户观点的TCP状态变化。一旦它看到第一个报文,那么连接状态就是NEW,接着一旦收到回应包,连接的状态就变成ESTABLISHED。

    假如你稍微多思考一会,你就应该理解为什么这么做了。通过这个特殊的实现方式,我们就可以让NEW和ESTABLISHED状态的报文离开本地主机,但是只有我们希望的报文才能发送到我们主机,即转化成ESTABLISHED状态,其他报文都被丢掉,这样的工作方式很完美。反过来,如果在连接建立的整个过程中,连接的状态都是NEW,那么我们就不能够阻止外部网络发送给我们的报文。因为我们必须要能够容许NEW状态的报文一次次的回复本机,从而完成三次握手,这样我们就不能起到防火墙的作用

    当一个TCP连接关闭的时候,这个连接会进入TIME_WAIT状态,这个状态的默认时间是2分钟。这样确保报文在连接关闭的时候,哦能够完全通过我们的规则检查。另外就是可以看作一个缓冲,这样报文即使在某几个拥塞的路由器里面也能够最终到达我们防火墙或者连接的另一端。
   

UDP连接

    从用户的角度,    UDP连接与TCP连接基本一致。

    

ICMP连接

    ICMP报文更谈不上算是一个有状态的流了,他们仅仅用于控制并却从来不建立任何连接,但是还是有4种ICMP的报文会期望收到应答报文,所以他们会有两种状态。这两种状态分别是NEW和ESTABLISHED。我们所说的四种特殊ICMP报文就是Echo/Timestamp/Information/Fianly address mask,另外timestamp和information request都已经被废弃了,所以这些的请求报文有可能被丢弃。但是Echo和Address mask这两种报文都应该得到足够的支持。

默认连接

    在一些特定情况下,连接跟踪不知道如何处理一个未知协议,在我们不认识或者我们不了解这个报文的协议工作机制时候就会发生这种情况。在这些情景里,我们用一个默认当作来处理这个报文。例如NETBLT、MUX、EGP等等,默认行为看起来很像UDP连接,第一个报文认为是NEW,收到应答就会设置连接为ESTABLISHED。

Creative Commons License
This work is licensed under a Creative Commons Attribution-ShareAlike 3.0 Unported License.
永久连接: http://www.nfvschool.cn/?p=279
标签:

发表评论