分析:NAT设备对数据包的影响
NAT是干什么的我就不多说废话了,免得大家拿砖头拍我,现在我就拿自己前几天做过的实验(实验中NAT设备的地址为192.168.11.250,PC的地址为192.168.0.2)向大家展示一下数据包在NAT前后的变化,以了解NAT的原理
首先我们查看一下NAT对TCP数据包的操作
下图是一个TCP包在NAT之前的样子
大家可以看到这个数据包的IP标识是15862(标识是用来分辨数据包的,一台主机发的包的标识依次递增),TTL是128 ,不分片,头部检验码为0x0702,源地址为192.168.0.2,目标地址为61.152.183..141 OK这是IP头部的信息!
对于TCP头部的信息,源端口1815,目标端口80,序列号是2856985904,确认号是0
这是NAT之后的同一个数据包,大家看出变化了吗?源IP地址是不是变成192.168.11.250了,同时因为更改了IP头部的数据,是不是IP的检验码也变化了!对于TCP 来说,源端口是不是也变化了,由1815变为2121,同时TCP的检验码也变了!
但是其它的选项值是不变的,如IP的标识号,前几次看到有人的文章说IP标识号也会被修改,很奇怪,是不是与NAT设备的厂商有关就不得而知了
以下是UDP的前后(UDP的包我选择了DNS报文)
对于UDP的处理,与前面的TCP的报文一样,只是改变了源地址,源端口及相应的校验码
对ICMP的处理,可能大家没有想过这个问题,这个也是在网络协议分析论坛上有前辈指出的,ICMP可不像TCP,UDP有端口,NAT设备是如何保证建立对应的NAT表呢?以下是我用最常的两种ICMP报文的演示,其中一个是请求报文,一个是响应报文
NAT之前的ICMP请求报文
ICMP NAT之前的响应报文
可以看到ICMP的请求与响应报文中有一个字段identifier 它们都是0300,这个值代表唯一主机,意思是同一台主机发出的所有的ICMP报文,它的identifier值都是一样的,不同主机的值不一样.
在identifier下面有一个序列号,这个是所发出的ICMP报文顺序的唯一标识
如你执行一个PING命令,发出四个请求包,这四个请求包每个都应有一个回应包,可是TCP/IP是一种非实时性的协议,不一定发出的第一个请求包所对应的响应包也能第一个回来,那么如何实现一对一对应呢,就是靠这个序列号,每一个请求包和它所对应的回应包的序列号是一样的
下图是NAT后的ICMP请求包
下图是NAT之后的ICMP回应包
从上图可以看到,NAT对ICMP报文做了以下改动
首先在IP层改动了源IP,及相应的校验码
在ICMP中,将identifier及相应的序列号都更改了,当然,更改后的idenfifier仍然标识唯一一主机,序列号仍然是一对一的关系,最后ICMP的校验码也更改了!
NAT对IP分片的影响
这个实验我用PING -l 3000 -t
-l代表是产生多大的PING包,现在我这边是3000byte的包(注意,这次我的本机IP为192.168.100.222 NAT设备地址为192.168.100.250)
NAT前的IP分片
OK,大家看到这个是NAT前的ICMP分片包,可以看到FLAG字段的more Fragments标志位为1,代表这是个分片包,IP的标识为11080
OK,源地址已经被转换了,所以对应的校验码也变了,其它什么也没变
好,现在我们明白了,NAT设备对分片仅仅起一个源地址转换作用!
好了,就先说到这儿吧,欢迎有人批评指正。
对PING包的NAT是如何进行呢ICMP没有端口如何建立NAT表。很多人都说是根据icmp.identifier字段进行NAT表的建立,其实只说对一半。对UNIX或者LINUX来说是正确的,但如今WINDOWS系统ICMP.identifier基本上是固定不变。同一台windows机器对多个目标地址发出的ping其ICMP.identifier是相同的。如何进行NAT呢。仔细观察会发现每个ping 包的ICMP.sequence是变化的(XP下ICMP.sequence是以256进行递增)
因此NAT设备对ping进行地址翻译是是结合ICMP.identifier、ICMP.sequence、IP.identifier等多个因素进行确定。
同一个ping 的request和reply中的ICMP.identifier、ICMP.sequence是不变的。