公网地址访问内部服务器时TCP三次握手不成功
一、 背景
在上图所示的网络中,PC 及Server属不同LAN,都是zone trust。为了让Internet用户能够访问到Server,FW上部署了NatServer:nat server global A.B.C.D inside 192.168.51.M也就是将公网地址A.B.C.D映射到192.168.51.M。完成上述配置后,Internet用户能够通过A.B.C.D这个公网IP访问Server。但是内网的PC在访问Server的时候,却存在一点问题:PC通过私有IP地址192.168.51.M能够访问Server的Web服务,但是当PC使用该服务器映射的公网地址A.B.C.D试图访问Server的时候,却发现始终无法成功。
二、 PC使用公网地址访问Server的过程
PC使用公网地址A.B.C.D试图访问Server,首先要建立TCP三次握手,报文的源IP地址为10.1.2.X,目的地址为A.B.C.D,数据包被送到网关防火墙。
防火墙由于部署了NAT server,因此将数据包的目的地址A.B.C.D转换成192.168.51.M,然后查路由表,发现网络吓一跳出口GE0/0/1。
防火墙将地址转换后的数据包发向Server。
Server收到数据包后,得回包吧,由于Server收到的这个数据包源地址为10.1.2.x,因此它在产生回程数据包的时候,回程数据包的目的地址就是10.1.2.x,而10.1.2.x又是本地网络内的节点,因此Server直接将这个源为192.168.51.M,目的地址为10.1.2.x的数据包发送给了PC,而不用再绕回防火墙。
PC在收到这个数据包的时候,发现数据包的源地址是192.168.51.M,这个地址是哪里冒出来的?它等候的是A.B.C.D的回程报文,可是现在却收到了192.168.51.M的数据包,它将该报文丢弃。
三、 原因
数据包没有绕回防火墙,导致PC收到的回程数据包源地址没有被正确的转换,从而TCP三次握手不成功。要解决这个问题,就需要让回程的流量能够回到防火墙,然后让防火墙将源地址转换成A.B.C.D再发给PC。
四、 解决方法
回程的流量能够回到防火墙,然后让防火墙将源地址转换成A.B.C.D再发给PC。
可以通过在防火墙上为PC创建一个NAT地址池,然后部署trust安全域内的源地址转换即可:
[FW] nat address-group 110.199.254.x
[FW] nat-policy zone trust
[FW-nat-policy-zone-trust] poliyc 10
[FW-nat-policy-zone-trust-10] policy source any
[FW-nat-policy-zone-trust-10] policy destination 192.168.51.M 0
[FW-nat-policy-zone-trust-10] action source-nat
[FW-nat-policy-zone-trust-10] address-group 1
五、 数据包交互的过程
PC使用公网地址A.B.C.D访问Server,首先要建立TCP三次握手,报文的源IP地址为10.1.2.x,目的地址为A.B.C.D,数据包被送到网关防火墙。
防火墙由于部署了nat server,于是首先将数据包的目的地址A.B.C.D转换成192.168.51.M,随后又发现还部署了源地址转换,要把源地址为10.1.2.x、目的地址为192.168.51.M的数据包进行源地址转换,将源地址转换成10.199.254.x。
防火墙将地址转换后的数据包发向Server:
服务器收到数据包后要发回程报文,回程报文的源地址为192.168.51.M,目的地址为10.199.254.x,这个数据包被发向了Server的网关192.168.5.1.254,最终到达防火墙。
防火墙收到这个数据包后,由于本地已经有了NAT的映射条目,因此将数据包的源地址192.168.51.M替换成A.B.C.D,将目的地址10.199.254.x替换成10.1.2.x。
防火墙将数据包转发给PC。
PC收到这个数据包后,发现正是自己期待的A.B.C.D的回包,因此TCP三次握手成功。