信心源自实力,努力成就未来!
Ping包是如何穿越PAT设备的
2006-09-26 18:51:08 / 天气: 晴朗
/ 心情: 高兴
/ 置顶(1)
/ 个人分类:个人原创
[前言]
下午,俺还在为俺那头大的方案烦恼的时候,一个朋友从MSN上问了俺一个问题“ICMP报文是如何穿越PAT设备的”。
俺想这个问题还不简单,ICMP报文肯定是根据里面某个字段作的转换,当报文返回的时候根据这个字段记录再转换回去
没想到,这位朋友:“嘿嘿,你确定?你有根据?”
俺顿时就愣住了。俺于是决定做个Testing看看这个Ping的ICMP报文是如何穿越PAT设备的.
[背景]
ICMP=Internet Control Message Protocol Internet控制报文协议
用于传递一些错误信息以及一些控制信息,往往被认为是Ip层的一个组成部分
其实从结构上讲ICMP报文在底层还是采取的IP封包的,所以我们可以简单认为
ICMP报文要比IP报文高那么一点点 :)
Ping一个非常有用的TCP/IP工具,用于测试远程主机是否可达。
Ping使用的是ICMP里面的回显请求(Echo Request)和回显响应(Echo Reply)两种报文
原理就是你扔一个Echo Request报文给对端,对端如果收到了这个报文,它就会把这个报文原封不动
(其实就是改个类型)给你扔回来(Echo Reply)。
ICMP Echo Request/Reply报文格式
------------------------------------------------------------------------------
| Type (0 or 8) | Code (0) | Checksum |
------------------------------------------------------------------------------
| Identifier | Sequence Number |
------------------------------------------------------------------------------
| Options |
------------------------------------------------------------------------------
[测试环境]
PCA-------------------Router----------------------PCB
在Router上启用NAT(PAT)
PCA 10.1.7.177/24
PCB 192.168.1.23
Router配置
int f0/0
ip add 10.1.7.122 255.255.255.0
ip nat outside
int f0/1
ip add 192.168.1.1 255.255.255.0
ip nat inside
access-list 9 permit 192.168.0.0 0.0.255.255
ip nat inside source list 9 int f0/0 overload
[测试过程]
在Router上打开
debug ip nat detailed
在PCA,PCB上开Sniffer类软件抓取ICMP报文
从PCB
ping 10.1.7.177 -t
从PCA上可以看到
ping过来的icmp echo request报文的IP地址全部变成了router f0/0的接口地址10.1.7.122
Identifer和Sequence Number与PCB上抓到的报文一致
(Identifer为0x0400=1024)
在router上
sh logging看到
debugg的nat信息
同时
sh ip nat tran可以看到
TEST3640#sh ip nat tran
Pro Inside global Inside local Outside local Outside global
icmp 10.1.7.122:1024 192.168.1.23:1024 10.1.7.177:1024 10.1.7.177:1024
//后面的1024即为Identifer的值,说明PAT转换的时候,除了修改IP的Source IP Address(IP源地址)外,还修改了
//ICMP Echo里面的Identifer的值,PAT设备通过这个Identifer对应表对返回的报文进行修改
[后记]
在测试的时候发现一个比较有趣的现象就是。。卖个关子后面讲。。
"Unix系统在实现Ping程序的时候是把ICMP报文的标识符字段设置成发送进程的ID号,这样即使在同一台主机上同时运行多个
Ping程序实例,Ping也可以识别出返回的信息"
以上摘自TCP/IP详解 卷1:协议
在我抓获的报文中我发现不管我在我的XP机器上开多少个Ping的窗口
我这边发出去的ICMP报文里面的Identifier始终都不变,哪怕我重启了我的机器
看来Windows对这块的实现和UNIX存在很大的差异,就和Windows的Tracert与UNIX下的Traceroute的区别
Windows对多窗口的(多个Ping的实例)下是通过Sequence Number来识别的。
而且这个Sequence Number是递增的,如果你的机器重启,这个数字会重置成1(看来Bill在里面维护了一个
Counters)。
*我还发现不同的Windows机器可能其Identifer也不一样,比如我的一直都是0x400而一个同事的XP是0x300
我们的win2k Server确是0x500
*Sequence Number字段的大小是16bit的,也就是说最大应该是0xffff
不知道如果超出这个数值windows会如何处理。因为时间的关系我也没有测试这个
有兴趣的朋友可以try一下
引用链接
推荐
收藏
导入论坛
等级(0)
编辑
管理
查看(274)
评论(0)
评分(0/0)
TAG:
ICMP_PAT
个人原创