日历

栏目分类

统计信息

  • 访问量:4630
  • 日志数:19
  • 书签数:8
  • 建立时间:2006-09-17
  • 更新时间:2006-11-07

最新评论

RSS订阅

  • RSS 2.0
信心源自实力,努力成就未来!

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一下





TAG: ICMP_PAT 个人原创

TrackBack 删除 anal sex 引用于anal sex, 发布于2007-01-15 10:56:40
anal sex
我来说两句

-5 -3 -1 - +1 +3 +5

Open Toolbar