分享

(5)【有点儿意思系列03】解答:内网PC无法使用服务器NAT映射后的公网地址访问服务器的故障分析

 qweertt4747 2017-02-28
 博文“有点意思系列”其实就是给大家找点儿乐子,里头有个Case,关于“内网PC无法使用服务器NAT映射后的公网地址访问服务器的故障”,正好最近有个兄弟问到这个问题,所以稍做解析,这个案例虽然简单,但是具有一定的代表性(本例以华为防火墙做讲解,技术原理类似)。

【有点儿意思系列 <wbr>03】解答:内网PC无法使用服务器NAT映射后的公网地址访问服务器的故障分析

在上图所示的网络中,PC Station及Server同属一个LAN,网关都在防火墙FW的GE0/0/1口上,都是zone trust。为了让Internet用户能够访问到Server,FW上部署了Nat Server:
nat server global 200.1.1.100 inside 192.168.1.100
也就是将公网地址200.1.1.100映射到192.168.1.100。完成上述配置后,Internet用户能够通过200.1.1.100这个公网IP访问Server。但是内网的PC在访问Server的时候,却存在一点问题:PC通过私有IP地址192.168.1.100能够访问Server的Web服务,但是当PC使用该服务器映射的公网地址200.1.1.100试图访问Server的时候,却发现始终无法成功。我们来分析一下PC使用公网地址访问Server的过程:

【有点儿意思系列 <wbr>03】解答:内网PC无法使用服务器NAT映射后的公网地址访问服务器的故障分析


1)PC使用公网地址200.1.1.100 试图访问Server,首先要建立TCP三次握手,报文的源IP地址为192.168.1.1,目的地址为200.1.1.100,数据包被送到网关防火墙。
2) 防火墙由于部署了NAT server,因此将数据包的目的地址200.1.1.100转换成192.168.1.100,然后查路由表,发现192.168.1.0/24网络就是GE0/0/1口直连。
3) 防火墙将地址转换后的数据包发向Server。

【有点儿意思系列 <wbr>03】解答:内网PC无法使用服务器NAT映射后的公网地址访问服务器的故障分析


4) Server收到数据包后,得回包吧,由于Server收到的这个数据包源地址为192.168.1.1,因此它在产生回程数据包的时候,回程数据包的目的地址就是192.168.1.1,而192.168.1.1又是本地直连网络内的节点,因此Server直接将这个源为192.168.1.100,目的地址为192.168.1.1的数据包发送给了PC Station,而不用再绕回防火墙。
5) PC在收到这个数据包的时候,发现数据包的源地址是192.168.1.100,这个地址是哪里冒出来的?它等候的是200.1.1.100的回程报文,可是现在却收到了192.168.1.100的数据包,它将该报文丢弃。这就是为什么,PC无法通过服务器的NAT server映射的公网IP来访问服务器的原因。数据包没有绕回防火墙,导致PC收到的回程数据包源地址没有被正确的转换,从而TCP三次握手不成功。要解决这个问题,就需要让回程的流量能够回到防火墙,然后让防火墙将源地址转换成200.1.1.100再发给PC。
我们可以通过在防火墙上为PC创建一个NAT地址池,然后部署trust安全域内的源地址转换即可:
[FW] nat address-group 1 192.168.2.1 192.168.2.1        
[FW] nat-policy zone trust
[FW-nat-policy-zone-trust] policy 10
[FW-nat-policy-zone-trust-10] policy source 192.168.1.0  0.0.0.255
[FW-nat-policy-zone-trust-10] policy destination 192.168.1.100  0
[FW-nat-policy-zone-trust-10] action source-nat
[FW-nat-policy-zone-trust-10] address-group 1

完成上述配置后,我们再分析一下数据包交互的过程:

【有点儿意思系列 <wbr>03】解答:内网PC无法使用服务器NAT映射后的公网地址访问服务器的故障分析

1) PC使用公网地址200.1.1.100 访问Server,首先要建立TCP三次握手,报文的源IP地址为192.168.1.1,目的地址为200.1.1.100,数据包被送到网关防火墙。
2) 防火墙由于部署了nat server,于是首先将数据包的目的地址200.1.1.100转换成192.168.1.100,随后又发现还部署了源地址转换,要把源地址为192.168.1.0/24、目的地址为192.168.1.100的数据包进行源地址转换,将源地址转换成192.168.2.1,于是它将数据包的源地址进行转换。
3) 防火墙将地址转换后的数据包发向Server:

【有点儿意思系列 <wbr>03】解答:内网PC无法使用服务器NAT映射后的公网地址访问服务器的故障分析


4) 服务器收到数据包后要发回程报文,回程报文的源地址为192.168.1.100,目的地址为192.168.2.1,这个数据包被发向了Server的网关192.168.1.254也就是防火墙。

【有点儿意思系列 <wbr>03】解答:内网PC无法使用服务器NAT映射后的公网地址访问服务器的故障分析

5) 防火墙收到这个数据包后,由于本地已经有了NAT的映射条目,因此将数据包的源地址192.168.1.100替换成200.1.1.100,将目的地址192.168.2.1替换成192.168.1.1。
6) 防火墙将数据包转发给PC。
7) PC收到这个数据包后,发现正是自己期待的200.1.1.100的回包,因此TCP三次握手成功。




红茶三杯

网络工程 | 数据通信 | 项目管理
学习 沉淀 成长 分享
站点:http://

红茶三杯版权所有,转载请注明出处

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多