前言

  在前面的文中讲过了iptables防火墙连接状态中的ESTABLISHED状态(http://waringid.blog.51cto.com/65148/512140)。除了这个状态之外,iptables还有以下状态,且听我慢慢道来。实验的网络结构以下图为准。

iptables防火墙的连接状态_第1张图片

 NEW

  以下图为例为说明什么是NEW的状态,首先需要知道的是NEW与协议无关,其所指的是每一条连接中的第一个数据包,如下图所示,客户端主机使用TCP 50000连接服务端的TCP 22,这个连接中的第一个数据包的状态就是NEW;其它的例如客户端使用TCP 50001连接至服务端的TCP 22;客户端的UDP 50000连接至服务端的UDP 53;还有客户端对服务器端发出的ICMP数据包,以上这些例子中的第一个数据包的状态都是NEW。

iptables防火墙的连接状态_第2张图片

RELATED

  在Windows系统上有一个tracert的命令,它可以帮助我们检测两台主机之间总共经过了多少路由。它的工作原理其实很简单,主要利用了TTL值的存活时间。这个TTL值是指数据包在网络上能存活的时间,早期以秒为单位,现在改为“所能跨越的路由器的跳数”。

iptables防火墙的连接状态_第3张图片

iptables防火墙的连接状态_第4张图片

  以下图为例说明tracert工具是如何查询最左边Host1和最右边主机Host2隔了多少路由器。首先tracert工具会送出第一个数据包,这个数据包的目的地址是最右边的主机的IP,并且刻意将这个数据包的TTL值设定为1,接着,这个数据包被送到第一台的路由器H1,而第一台路由器H1在收到这个数据包后,会将数据包内的TTL值减1,因此,这个数据包的TTL值变为0,而这个值代表这个数据包的生命周期已尽,所以第一台路由器H1会丢弃这个数据包,并且返回一个ICMP(type 11 Time to live exceeded)数据包给Host1主机,以告诉Host1“你送出的数据包因生命周期已尽,故已遭丢弃”。这样,tracert就可以从这个数据包得知第一台路由器H1的IP地址。

  接着tracert会送出第二个数据包,不过,这个数据包的TTL值会刻意指定为2,接着,第二个数据包送到第一台路由器H1,第一台路由器收到这个数据包后,会将其TTL减1,这时数据包内的TTL值变为1,因为TTL值不为0,所以生命周期未尽,因此,第一台路由器H1会将这个数据包传给第二台路由器H2。不过,当第二台路由器H2把数据包内的TTL值减1后,这个数据包内的TTL值变为0,代表这个数据包的生命周期已尽,因此,第二台路由器H2会丢掉这个数据包,并且回送一个ICMP type 11(Time to live exceeded)传给发送主机Host1,以告诉Host1“你送出的数据包因生命周期已尽,故已遭丢弃”。这样,tracert就可以从这个数据包得知第二台路由器H2的IP地址。

  紧接着,tracert会再送出第三个数据包,不过,这个数据包的TTL值会刻意指定为3,接着,第三个数据包送到第一台路由器H1,第一台路由器h1收到这个数据包后,会将其TTL减1,这时数据包内的TTL值变为2,因为TTL值不为0,所以生命周期未尽,因此,第一台路由器H1会将这个数据包传给第二台路由器H2。不过,当第二台路由器h2把数据包内的TTL值减1后,这个数据包内的TTL值变为1,因为TTL值不为0,所以生命周期未尽,因此,第二台路由器h2会将这个数据包传给第三台路由器H3。当第三台路由器H3把数据包内的TTL值减1后,这个数据包内的TTL值变为0,代表这个数据包的生命周期已尽,因此,第三台路由器H3会丢掉这个数据包,并且回送一个ICMP type 11(Time to live exceeded)传给发送主机Host1,以告诉Host1“你送出的数据包因生命周期已尽,故已遭丢弃”。这样,tracert就可以从这个数据包得知第三台路由器H3的IP地址。最后tracert工具就可以收集到整条路径上的路由器的数量以及IP各为多少。

iptables防火墙的连接状态_第5张图片

  看完tracert的工作原理后,我们可以看看什么数据包的状态会是RELATED。以上图为例,最后状态返回的“Destination reached!”这个数据包的状态就是RELATED状态,RELATED状态的数据包的意思是指“被动产生的响应数据包,而且这个数据包不属于现在任何连接的数据包”。例如,上图中Host1主机发出的是TCP协议的包(状态一),只因生命周期已尽被路由器H1丢弃,TCP协议的数据包是面向连接的,而路由器H1返回给Host1主机的是ICMP数据包,很明显这是另外一个数据连接,而这个数据包之所以会产生,完全是因为第一条连接的关系,而且这个数据包不属于现有任何一条连接的数据包。

  需要说明的是,上例以ICMP包为例说明,实际上RELATED状态的数据包与“协议”无关,“只要回应回来的是因为本机先送出的一个数据包导致另一个连接的产生,而这一条新连接上的所有数据包都是属于RELATED状态的数据包”。

INVALID 

  INVALID状态包指不属于ESTABLISHED、NEW、RELATED这三种,通常将其视为恶意的数据包而丢弃。

  关于INVALID状态的测试可以借助于NMAP这个强大的扫描器来实现。对于NMAP的一切可能访问它的主页了解,该工具属于开源软件,支持Windows平台(http://nmap.org/)。

  可以通过设置以下命令来实现。

截图05

iptables防火墙的连接状态_第6张图片   

  有关TCP/IP协议的连接状态可参考RFC 793(http://www.ietf.org/rfc/rfc793.txt),需注意的是该协议的连接状态和iptables的四种连接状态切不可混为一谈,那不是同一概念。

  TCP SYN扫描相对来说不张扬,不易被注意到,因为它从来不完成TCP 连接。它也不像Fin/Null/Xmas,Maimon 和Idle 扫描依赖于特定平台,而可以应对任何兼容的TCP 协议栈。它还可以明确可靠地区分 open(开放的), closed(关闭的),和filtered(被过滤的) 状态它常常被称为半开放扫描,因为它不打开一个完全的TCP 连接。它发送一个SYN 报文,就像您真的要打开一个连接,然后等待响应。SYN/ACK 表示端口在监听(开放),而RST (复位)表示没有监听者。如果数次重发后仍没响应,该端口就被标记为被过滤。如果收到ICMP 不可到达错误(类型3,代码1,2,3,9,10,或者13),该端口也被标记为被过滤。

iptables防火墙的连接状态_第7张图片

NEW状态测试

  测试环境如前面交代,更详细的说明可参考“iptables中state模块的连接状态”(http://waringid.blog.51cto.com/65148/512140)。

  其中test1主机的IP地址为11.0.0.200,开放ssh服务,防火墙设定如下所示开放所有服务:

截图11

iptables防火墙的连接状态_第8张图片

  test2主机ip地址为173.16.0.200,iptables设定将output链设为阻止,同时在这种情况下ping网关和使用ssh连接test1主机。如下所示:

截图16

iptables防火墙的连接状态_第9张图片

iptables防火墙的连接状态_第10张图片

  可以看到上述的指令执行后无法ping通test1主机,而当开放NEW状态后再看看结果,如下所示:

截图17

iptables防火墙的连接状态_第11张图片

iptables防火墙的连接状态_第12张图片

iptables防火墙的连接状态_第13张图片

iptables防火墙的连接状态_第14张图片

  可以看到上述指令执行后可以正常获取系统相关的服务请求。证明iptables执行了正确的拦截操作。

RELATED测试

  结构如上述测试一样,其中test1主机开放所有服务,而test2主机(173.16.0.200)上做以下设定,当执行traceroute指令时无法返回正确的数据包:

截图18

iptables防火墙的连接状态_第15张图片

iptables防火墙的连接状态_第16张图片

  现在开放RELATED状态后看结果,如下图所示:

截图19

iptables防火墙的连接状态_第17张图片

  可以看到设定后traceroute可以正确返回,但是ping和ssh操作是不成功的,这也就是RELATED的特色。

  关于iptables的四种状态其实有着各种各样的应用,这里只是简单地说明各状态所适用的环境,具体的应用有机会再放上来。