在前面的文中讲过了iptables防火墙连接状态中的ESTABLISHED状态()。除了这个状态之外,iptables还有以下状态,且听我慢慢道来。实验的网络结构以下图为准。
以下图为例为说明什么是NEW的状态,首先需要知道的是NEW与协议无关,其所指的是每一条连接中的第一个数据包,如下图所示,客户端主机使用TCP 50000连接服务端的TCP 22,这个连接中的第一个数据包的状态就是NEW;其它的例如客户端使用TCP 50001连接至服务端的TCP 22;客户端的UDP 50000连接至服务端的UDP 53;还有客户端对服务器端发出的ICMP数据包,以上这些例子中的第一个数据包的状态都是NEW。
在Windows系统上有一个tracert的命令,它可以帮助我们检测两台主机之间总共经过了多少路由。它的工作原理其实很简单,主要利用了TTL值的存活时间。这个TTL值是指数据包在网络上能存活的时间,早期以秒为单位,现在改为“所能跨越的路由器的跳数”。
以下图为例说明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地址。