天天看点

内网服务器做了映射还是无法用公网访问,内网PC无法使用服务器NAT映射后的公网地址访问服务器的故障分析...

记得很早之前有帮大学同学处理过一个内网PC无法使用服务器NAT映射后的公网地址访问服务器的故障,记得红茶三杯老师有篇博文有做过很详细的分析,现转载过来分享给大家,原文如下:

关于“内网PC无法使用服务器NAT映射后的公网地址访问服务器的故障”,正好最近有个兄弟问到这个问题,所以稍做解析,这个案例虽然简单,但是具有一定的代表性(本例以华为防火墙做讲解,技术原理类似)。

内网服务器做了映射还是无法用公网访问,内网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的过程:

内网服务器做了映射还是无法用公网访问,内网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。

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

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

内网服务器做了映射还是无法用公网访问,内网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:

内网服务器做了映射还是无法用公网访问,内网PC无法使用服务器NAT映射后的公网地址访问服务器的故障分析...

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

内网服务器做了映射还是无法用公网访问,内网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://blog.sina.com.cn/vinsoney