- 设备A: 192.168.1.100
- 设备B: 192.168.1.200
- NAT设备: 192.168.1.1 123.123.123.123
如果A和B都想ping 114.114.114.114,
大家都知道ping是基于ICMP的,是没有端口的,那么这样是怎么来实现的呢???
没有端口,那就创造端口,首先ICMP的报文格式如下
在A发送ICMP报文的时候,会根据(Type+Code)的值生成源端口号,根据Identifier的值生成目的端口号,即发送到路由器的报文如下:
源报文:
源IP | 源端口 | 目的IP | 目的端口 |
192.168.1.100 | (Type+Code) | 114.114.114.114 | Identifier |
在路由器上进行SNAT,源IP更改后ICMP报文中的Identifier会改变,记作IDENTIFIER。这时候的报文如下:
源IP | 源端口 | 目的IP | 目的端口 |
123.123.123.123 | IDENTIFIER | 114.114.114.114 | Identifier |
Nat表
源IP | 源端口 | 协议 | 目的IP | 目的端口 |
192.168.1.100 | (Type+Code) | ICMP | 123.123.123.123 | IDENTIFIER |
在web服务器C收到ICMP请求后,生成ICMP响应报文,响应报文中的(Type+Code)会作为源端口,IDENTIFIER作为目的端口
源报文
源IP | 源端口 | 目的IP | 目的端口 |
114.114.114.114 | (Type+Code) | 123.123.123.123 | IDENTIFIER |
报文到达路由器后,根据NAT表中,查询目的IP和目的端口为123.123.123.123和IDENTIFIER的信息。将目的IP和目的端口换为
192.168.1.100 和(Type+Code),这样报文就可以成功的到达A了。
所以ICMP报文的NAT大致是根据ICMP报文的字段,形成伪端口,然后根据TCP报文的流程来处理。
以上是个人查阅资料后总结,有不正确的,还请指出。
转载请注明:爱开源 » ICMP报文如何通过NAT来地址转换