ICMP报文如何通过NAT来地址转换

在搭建NSX环境的过程,起先没有在Edge路由器上设置NAT,导致VM无法访问外网。经查阅资料后发现,需要配置NAT,配置完SNAT后,比较疑惑的是没有配置DNAT,响应包是怎么把数据包中目的地址修改为VM的地址呢???

抱着这个疑惑,查阅了各种资料后,大致了解其原理,下面将举例子进行介绍

例如:局域网内的A:192.168.0.2/24   B:192.168.0.3/24

路由器两块网卡:192.168.0.1/24      188.10.1.2(公网地址)

           Intenet上web 服务器C: 200.10.2.1

比如A想访问C的web服务,便会发送HTTP请求,请求的源IP、源端口、目的IP和目的端口如下

源IP源端口目的IP目的端口
192.168.0.254333200.10.2.180

当HTTP请求达到路由器的时候,回进行SNAT转换,转换的结果如下

源IP源端口目的IP目的端口
188.10.1.254333200.10.2.180

这时候路由器上的NAT表回添加一行

源IP源端口协议目的IP目的端口
192.168.0.254333HTTP188.10.1.254333

解释一下:NAT表通常是五元组,源IP和源端口就是发送HTTP请求的IP和端口,即A的IP和端口,而目的IP和目的端口则是指转换后的IP地址和端口,即进行SNAT后的源IP和源端口。

当Web服务器C收到HTTP请求后,会发送响应报文,报文的信息如下:

源IP源端口目的IP目的端口
200.10.2.180188.10.1.254333

当报文到达路由器后,会参照NAT表进行DNAT,参考依据,会在NAT表中查找目的IP和目的端口为188.10.1.2和54333的一行,然后用192.168.0.2和54333替换目的IP和目的端口,替换后的报文信息如下:

源IP源端口目的IP目的端口
200.10.2.180192.168.0.254333

然后发往局域网内的A。通过浏览器呈现web网页。

以上就是局域网内机器访问外网的一个流程。从这个流程中可以得出,尽管只配置SNAT,但是在进行源地址和源端口转换的时候,会在路由器的NAT表中插入一行,当响应报文到达路由器的时候,参照NAT表中的信息,进行目的地址和目的端口的转换,所以在不配置DNAT的时候,目的地址和目的端口仍然可以被转换。但是这个过程,只能是局域网内的用户发起请求,响应报文的目的地址和目的端口才会被转换为局域网地址。外网的主机是不能直接访问局域网中的主机的

当局域网中的A和B都想访问C的web服务器,这时候会怎么转换,如果A和B的源端口不同时,就直接将源IP地址转换为路由器的公网地址。如果A和B的源端口也相同,这时候就要将源端口也要替换,例如:A和B都是通过54333端口访问C的web服务。

A:

原报文

源IP源端口目的IP目的端口
192.168.0.254333200.10.2.180

SNAT后的报文

源IP源端口目的IP目的端口
188.10.1.254333200.10.2.180

NAT表

源IP源端口协议目的IP目的端口
192.168.0.254333HTTP188.10.1.254333

B:

原报文

源IP源端口目的IP目的端口
192.168.0.354333200.10.2.180

SNAT后的报文

源IP源端口目的IP目的端口
188.10.1.254334200.10.2.180

NAT表

源IP源端口协议目的IP目的端口
192.168.0.354333HTTP188.10.1.254334

这样就可以根据端口号的不同,将响应报文发送给正确的主机。

问题来了,如果A和B都想ping C,大家都知道ping是基于ICMP的,是没有端口的,那么这样是怎么来实现的呢???

没有端口,那就创造端口,首先ICMP的报文格式如下

   类型(Type)   代码(Code)检验和(Checksum)
                              标识符(Identifier)序列号(Sequence number)
                                                 选项(Option)

在A发送ICMP报文的时候,会根据(Type+Code)的值生成源端口号,根据Identifier的值生成目的端口号,即发送到路由器的报文如下:

源报文:

源IP源端口目的IP目的端口
192.168.0.2(Type+Code)200.10.2.1Identifier

在路由器上进行SNAT,源IP更改后ICMP报文中的Identifier会改变,记作IDENTIFIER。这时候的报文如下:

源IP源端口目的IP目的端口
188.10.1.2IDENTIFIER200.10.2.1Identifier

Nat表

源IP源端口协议目的IP目的端口
192.168.0.2(Type+Code)ICMP188.10.1.2IDENTIFIER

在web服务器C收到ICMP请求后,生成ICMP响应报文,响应报文中的(Type+Code)会作为源端口,IDENTIFIER作为目的端口

源报文

源IP源端口目的IP目的端口
200.10.2.1(Type+Code)188.10.1.2IDENTIFIER

报文到达路由器后,根据NAT表中,查询目的IP和目的端口为188.10.1.2和IDENTIFIER的信息。将目的IP和目的端口换为

192.168.0.2和(Type+Code),这样报文就可以成功的到达A了。

所以ICMP报文的NAT大致是根据ICMP报文的字段,形成伪端口,然后根据TCP报文的流程来处理。

以上是个人查阅资料后总结,有不正确的,还请指出。

  • 15
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值