内网服务器无法通过公网地址访问映射到公网的内网服务
内网服务器无法通过公网地址访问映射到公网的内网服务
- 问题现象
- 问题原因
- 解决方法
- 总结
前几天遇到一个网络问题,在这里做下记录,希望能帮助到有相同问题的朋友。
问题现象
网络拓扑如上所示,服务器1和服务器2在同一内网,网段均为192.168.101.0/24,出口防火墙上有一个固定公网ip,地址是124.5.5.5。
服务器1上运行了一个业务系统,地址是192.168.101.111:80,然后在出口防火墙上做了映射,将其映射到了124.5.5.5:10080,此时,外部网络环境中可以正常访问124.5.5.5:10080,但是在内网环境中,如服务器2上,无法访问124.5.5.5:10080。也就是说内网服务器上无法通过映射后的公网地址访问内网服务。
问题原因
分析一下ip报文流转过程中的源目地址变化,就可以发现问题所在。
服务器2访问124.5.5.5:10080时,源地址192.168.101.222目的地址124.5.5.5;
报文到达出口防火墙后,会做一次地址转换,将目的地址转换为内网地址192.168.101.111,此时源地址192.168.101.222目的地址192.168.101.111;
报文一步步到达服务器1后,服务器1做出响应,源目地址转换,此时源地址192.168.101.111目的地址192.168.101.222;
这时候,服务器1发现目的地址为同网段,报文会由服务器1通过接入交换机直接发送给服务器2;
服务器2检查报文,发现源地址是192.168.101.111,并没有与之匹配的会话(服务器2发送出去的报文目的地址是124.5.5.5),此时服务器2会丢弃这个报文,这就导致了访问不通。
解决方法
要解决这个问题,只需要使得服务器1收到的ip报文中,源地址为公网地址124.5.5.5即可,这样的话,服务器1回复的报文就变为源地址192.168.101.111目的地址124.5.5.5,报文会经过防火墙后再回到服务器2,完成整个通信过程。
要实现以上操作,只需要在防火墙上配置一条源NAT,将源目网段192.168.101.0/24的报文,源地址转换为124.5.5.5,并将该条SNAT应用到防火墙与核心交换机相连的那个接口上。
总结
做完以上配置后,服务器2(192.168.101.222)通过124.5.5.5:10800访问服务器1(192.168.101.111:80)时,网络流量的流转及地址变化如下:
1.数据包从S2发出
源地址:192.168.101.222:随机端口(假设为54321)
目的地址:124.5.5.5:10800
路径:S2 → 接入交换机 → 汇聚交换机→ 核心交换机 → 防火墙(内网接口)
2.防火墙处理(入口方向)
a.目的NAT(DNAT)
规则:将 124.5.5.5:10800映射到192.168.101.111:80
转换后数据包:
源地址:192.168.101.222:54321
目的地址:192.168.101.111:80
b. 源NAT(SNAT)
规则:源目均为192.168.101.0/24的流量,源地址转换为124.5.5.5
转换后数据包:
源地址:124.5.5.5:54321(端口可能保持不变或变化)
目的地址:192.168.101.111:80
路径:防火墙 → 核心交换机→ 汇聚交换机 → 接入交换机 → S1
3.S1 处理请求并响应
接收的数据包:
源地址:124.5.5.5:54321
目的地址:192.168.101.111:80
响应数据包:
源地址:192.168.101.111:80
目的地址:124.5.5.5:54321
路径:S1 → 接入交换机 → 汇聚交换机→ 核心交换机 → 防火墙(内网接口)
4.防火墙处理(出口方向)
反向NAT(基于连接跟踪):
反向DNAT:将目的地址124.5.5.5:54321还原为192.168.101.222:54321
反向SNAT:将源地址192.168.101.111:80还原为124.5.5.5:10800
转换后响应包:
源地址:124.5.5.5:10800
目的地址:192.168.101.222:54321
路径:防火墙 → 核心交换机 → 汇聚交换机 → 接入交换机 → S2
5.S2 接收响应
最终数据包:
源地址:124.5.5.5:10800
目的地址:192.168.101.222:54321
S2 视角:认为与124.5.5.5:10800通信成功,整个过程透明