故障现象:

公网用户访问内网WEB服务器正常;

内网的普通用户通过内网地址访问正常,但无法通过公网IP进行正常访问

网络环境介绍:

环境 地址 端口号
内网用户IP 192.168.10.10/24      随机
web服务器 192.168.100.100/24 80 
公网IP地址 100.100.100.100/24
内网网关 192.168.10.254/24

基础配置:

网络缺省路由:

 ip route-static 0.0.0.0 0.0.0.0 172.16.10.10

防火墙源SNAT (进行上网)

内网所有地址 any -------SNAT-----> 100.100.100.100 

防火墙目的DNAT(公网 IP 映射内网服务器)

内网web服务器192.168.100.100:80  ---------DNAT----->100.100.100.100:80

原因分析:

假如是192.168.10.10通过申请的域名访问192.168.100.100的web服务。这里假设访问的源端口是10000,目标端口是80,数据包分析如下:

1、C2主机发起web请求.因为通过域名访问的,DNS解析服务正常,那么访问目标就是100.100.100.100:80

        流量方向:  192.168.10.10:10000----->100.100.100.100:80

2、数据包最终会被路由到防火墙上,防火墙检查访问的目的地址,匹配到它的端口映射策略,将目标地址改为对192.168.100.100的访问,建立起一个针对目标ip地址转换的NAT会话表

        流量方向:192.168.10.10:10000------>192.168.100.100:80

3、然后数据包到会被转发到192.168.100.100服务器上并会响应192.168.10.10主机的请求,将上述访问的源目ip地址及端口进行倒转,并将数据包交给它的网关处理,图中就是R1路由器

        流量方向:192.168.100.100:80------>192.168.10.10:10000

4、R1路由器检查访问者的源ip和目标ip地址,发现目标ip地址是192.168.10.10,是R1路由器一个可路由的内网ip地址,就会将数据包直接路由到C2主机上(流量来回路径不一致)

        C2主机接收到数据包,检查数据包的源ip和端口是192.168.100.100:80,发现其本身并没有这样一个http会话与之相匹配,就是说C2主机并没有主动发起对192.168.100.100:80的访问,发起的是对100.100.100.100:80的访问,那么C2主机就会丢弃这个数据包,导致内网用户通过域名或者公网ip地址访问自己的内网服务器不通的现象。

          流量方向:192.168.100.100:80------>192.168.10.10:10000

        该问题的根本原因:R1 路由器收到响应报文后,发现报文目的 IP 为内网可直路由网段,会直接在内网二层 / 三层转发,不会将报文上送防火墙做 NAT 及转发处理。此现象并非设备 BUG,而是TCP/IP 协议栈的固有工作机制,所有开启端口映射的网络设备均存在该逻辑,无法规避,除非重构网络协议体系。在现有 TCP/IP 框架下,该问题具备成熟可行的解决方案。部分家用或轻量化设备无需手动配置端口回流,本质是设备在配置端口映射时,后台自动兜底处理了回流场景。但企业级专业设备极少默认自带该机制,多需人工手动配置适配,这也正是企业设备高定制性、高扩展性的设计体现。

问题解决方案

192.168.10.10访问192.168.100.100:80的时候,不走内网路由,再做一次回流的NAT映射即可。

此处以华为防火墙USG6000系列展示:

配置 NAT Server(端口映射)

首先配置基础的服务器映射,并指定 no-reverse 或允许任意区域访问

# 进入系统视图
system-view

# 配置 NAT Server,将公网 IP 映射到私网 Web 服务器
# 假设映射 Web 服务 (端口 80)
firewall zone trust
 nat server protocol tcp global 100.100.100.100 80 inside 192.168.100.100 80

配置 NAT 回流策略

在华为防火墙上,通常需要在 Trust 区域(内网区域)的接口出方向或入方向应用 NAT 策略。最简单的方法是使用 nat hairpin enable(部分旧版本)或通过配置 NAT 策略实现。

推荐方法(基于 NAT 策略):
需要配置一条策略,当流量从 Trust 区域进入,且目的是公网 IP 时,同时做源转换和目的转换。

# 1. 定义一个地址集(可选,但推荐),包含服务器的公网IP
ip address-set WEB_PUBLIC type object
 address 0 100.100.100.100 mask 32

# 2. 定义一个地址集,包含内网客户端
ip address-set LAN_CLIENT type object
 address 0 192.168.10.0 mask 24

# 3. 配置 NAT 策略
nat-policy
 rule name Hairpin_Web
  # 匹配条件:源区域是 Trust,目的区域也是 Trust(因为流量不出去)
  source-zone trust
  destination-zone trust
  # 源地址是内网客户端
  source-address address-set LAN_CLIENT
  # 目的地址是服务器的公网 IP
  destination-address address-set WEB_PUBLIC
  # 动作:进行源地址转换(Easy-IP,转换为出接口IP)
  # 注意:NAT Server 会自动处理目的地址转换
  action source-nat easy-ip

配置安全策略

必须允许 Trust 到 Trust 的流量通过防火墙。

security-policy
 rule name Permit_Hairpin
  source-zone trust
  destination-zone trust
  source-address 192.168.10.0 mask 24
  # 注意:这里的目的地址必须填写服务器的真实内网 IP,因为 NAT 策略先于或同时于路由查找
  destination-address 192.168.100.100 mask 32
  service http  # 或你需要的服务
  action permit

会话表(验证NAT生效)

可看到内网 IP(如 192.168.10.10)转换为 100.100.100.100: 80

Logo

openEuler 是由开放原子开源基金会孵化的全场景开源操作系统项目,面向数字基础设施四大核心场景(服务器、云计算、边缘计算、嵌入式),全面支持 ARM、x86、RISC-V、loongArch、PowerPC、SW-64 等多样性计算架构

更多推荐