之前在 防火墙项目化实战的项目6:双向 NAT 中就已经讨论并实验过NAT回流(NAT Hairpin)问题:内网用户访问服务器的公网IP时,原有的上网规则(域间源 NAT)不会生效,原因在于防火墙内部的 NAT Server 匹配顺序在源 NAT 规则之前,NAT Server 提前将报文的目的 IP 转换为了内网 IP,导致其目的安全域变为了与源端相同的 DMZ 域,因此报文无法再命中原本去往 Untrust 域的源 NAT 规则
但和这次不同的是,这次实验用AR2220路由器作为网关,其NAT Server只能应用在特定接口(本例为WAN口),这导致内网用户通过服务器的公网IP来访问服务器时,由于入接口是路由器的LAN口,因此不会触发NAT Server规则,最终通信失败。下面介绍4种解决方案。
1. 基础拓扑
基础拓扑如下:

PC1和Server在同一个内网192.168.0.0/24中,网关为路由器AR1的g0/0/1接口(192.168.0.254),内网设备通过AR1上面的源NAT(Easy-IP)实现内网到外网的访问。也通过NAT Server将公网IP的80端口映射到服务器的内网IP的80端口,使外网用户可以访问内网Server。
1 | sysname GW |
内网PC1可以通过AR1的源NAT来ping通外网PC2
外网PC2可以通过AR1的NAT Server来访问内网Server的HTTP服务
PC1可以正常访问同内网的Server的HTTP服务(二层通信)

PC1无法通过内网服务器的公网IP来访问HTTP服务:
原因就是最上面说的,NAT Server只在AR1的WAN口触发,而LAN口收到PC1访问202.1.1.1:80的报文时,没有转换目的IP地址为服务器的192.168.0.2,而AR1又没有监听在80端口的服务,因此该请报文被AR1丢弃,不会再触发源NAT(NAT Server匹配顺序在源NAT之前)。
在AR1的LAN口上抓包,可以看到TCP连接没有建立,重传4次后也没有响应:

2. 解决方案
2.1. 方案1: 内网DNS
如果服务器支持用域名(1.cn)访问,那么最简单的方案就是在内网DNS服务器上添加域名映射的内网IP。内网用户使用内网DNS解析服务器域名时,就会得到服务器的内网IP地址,从而直接实现内网2层通信,不用再修改AR1。
DNS服务器同样使用内网的Server启动,并添加解析记录1.cn↔️192.168.0.2:

PC1把DNS服务器设为192.168.0.2即可:

通过域名即可访问:

如果使用AR1作为DNS服务器,则需要以下配置:
1 | dns proxy enable |

AR路由器(包括AR2200)不支持自身作为DNS服务器。AR路由器仅支持作为DNS客户端或DNS Proxy/Relay。
2.2. 方案2: NAT ALG + DNS Mapping
如果服务器支持用域名(1.cn)访问,但是内网没有DNS服务器,那么可以在AR1路由器上配置NAT ALG和DNS Mapping来实现将域名解析成服务器内网IP。
内网用户通过域名访问内网服务器时,发送域名请求到DNS Server,DNS Server将此域名对应的公网IP地址封装在回应报文中。在配置了DNS Mapping和ALG功能的情况下,路由器向内网用户转发DNS响应报文时,会通过查找NAT Server(dis nat server)规则,将其中封装的公网IP地址(202.1.1.1)转换为内网IP地址(192.168.0.2)。
AR1关键配置如下:
1 | nat alg dns enable |
PC1将DNS服务器设置为公网的202.1.1.3:

公网DNS服务器202.1.1.3添加域名1.cn的解析记录:

PC1可以通过1.cn访问服务器:


DNS Mapping规则如下:

2.3. 方案3: 双向NAT
开启DNS的NAT ALG后,所有的DNS报文都会上送到CPU处理,大量DNS报文容易拖慢设备性能。
并且如果服务器没有域名,那就只能通过双向NAT来解决内网用户访问服务器公网IP的问题了。
通过在路由器AR1的LAN口上同时配置源NAT和NAT Server,可以实现双向NAT。其中源NAT负责将PC1发出的报文的源IP地址(192.168.0.1)替换成和LAN口地址(192.168.0.254),NAT Server负责将报文的目的IP地址(202.1.1.1)替换成服务器的内网IP地址(192.168.0.2)。
不要再问为什么基础拓扑中已经有NAT Server和源NAT规则了还要再配一对,原因是他们只应用生效在WAN口,LAN口的报文不会触发NAT Server(LAN也不监听80端口)和源NAT规则(NAT Server直接丢弃了,按顺序匹配不到源NAT)。
关键配置如下:
1 | acl number 3000 |
注意,路由器的软件版本如果小于等于V200R003C00,将无法在LAN口配置NAT Server的目的地址为WAN口地址,会提示地址冲突:

在eNSP模拟器中,解决方案是使用下一节将介绍的策略路由。
这里再演示用eNSP Pro模拟器的AR6700路由器(软件版本为V600R025C10SPC100)进行测试,AR6700的NAT Server默认对所有开启了NAT功能的接口生效,源NAT规则也能根据源IP地址进行匹配,因此只需要在LAN口启用NAT功能,生效双向NAT。

PC1

Server
PC2

1 | sysname GW |
pc1可以通过ar的snat访问外网的pc2


Easy-IP模式的源NAT,会匹配完路由表后使用该条流量最终的出接口的IP地址作为最终的源IP地址,因此源地址转成了202.1.1.1:
外网pc2可以通过ar的nat Server来访问内网Server的HTTP服务
pc1可以通过服务器的公网IP访问内网服务器

PC1发出报文的的源地址192.168.0.1被转换为192.168.0.254,目的地址202.1.1.1被转换为192.168.0.2:
转换规则为:最初发出的报文的IP头为192.168.0.1➡️202.1.1.1,到了路由器后首先触发NAT Server规则,此时为192.168.0.1➡️192.168.0.2,接着匹配源NAT(规则名为snat),源NAT为Easy-IP模式,Easy-IP会使用该条流量最终的出接口的IP地址作为源IP地址,对于该路由器,路由表中如下:
1 | [GW]dis ip routing-table |
目的地址 192.168.0.2 匹配直连路由 192.168.0.0/24,出接口为 Vlanif10,下一跳为 192.168.0.254,因此Easy-IP转换源地址后为192.168.0.254➡️192.168.0.2,至此完成了去程的NAT双向转换。回程路由同理。
具体过程推荐阅读官方文档:https://support.huawei.com/hedex/hdx.do?docid=EDOC1100594114&id=ZH-CN_TOPIC_0000002640960496
注意,如果直接是192.168.0.1➡️192.168.0.2,是不会触发源NAT转换的:
原因是二者属于同一网段,在没有触发NAT Server规则的前提下,不会触发源NAT规则。
2.4. 方案4: 策略路由
当服务器只支持用IP访问,并且路由器软件版本小于等于V200R003C00时(不支持配置该接口下的NAT Server的目的地址为其他接口已有的地址),只能通过流策略重定向网络的方式来实现内网PC通过内网服务器的公网IP地址访问。
PC源地址通过源NAT转换为公网IP发给外网的AR2,AR2再将数据流量发回到网关路由器AR1(源目的IP都为AR1,因此会转发会去)。数据流达到AR1后,NAT Server生效,目的地址转换为WEB服务器私网地址。WEB服务器回应报文达到AR1后,根据NAT Server表项将数据流的源地址转换为WEB服务器的公网地址,外网AR2会再将数据流发回到AR1,AR1根据之前的源NAT表项将数据流的目的地址转换为私网IP,再将数据流发送给内网用户PC:

具体分析如下:

🔴 去程流量(PC1 访问 Server 公网 IP):
- PC1 ➡️ AR1
- 源地址:
192.168.0.1:4392 - 目的地址:
202.1.1.1:80
- AR1 ➡️ AR2(匹配 ACL 3000 触发 PBR 重定向,从 GE0/0/2 发出触发
nat outbound 2000转换源 IP)
- 源地址:
202.1.1.1:4392 - 目的地址:
202.1.1.1:80
- AR2 ➡️ AR1(AR2 查路由表发回网关 AR1)
- 源地址:
202.1.1.1:4392 - 目的地址:
202.1.1.1:80
- AR1 ➡️ Server(从外网口重新进入 AR1,触发
nat server转换目的 IP)
- 源地址:
202.1.1.1:4392 - 目的地址:
192.168.0.2:80
🔵 回程流量(Server 回应 PC1):
- Server ➡️ AR1
- 源地址:
192.168.0.2:80 - 目的地址:
202.1.1.1:4392
- AR1 ➡️ AR2(目的地址为
202.1.1.1,再次匹配 ACL 3000 触发 PBR 重定向到 AR2)
- 源地址:
192.168.0.2:80 - 目的地址:
202.1.1.4392
- AR2 ➡️ AR1(AR2 查路由表发回网关 AR1)
- 源地址:
192.168.0.2:80 - 目的地址:
202.1.1.1:4392
- AR1 ➡️ PC1(重新进入 AR1 外网口,查找 NAT 会话表还原源与目的 IP)
- 源地址:
202.1.1.1:80 - 目的地址:
192.168.0.1:4392
关键配置如下:
1 |
|

- ACL 3000 不能指定目的端口80,因为流策略p1应用在LAN口的入方向上,限定目的端口为 80,会导致服务器发出的随机目的端口回应报文无法匹配策略路由重定向给 202.1.1.4,进而打断了反向 NAT 转换。
- 重定向的下一跳设备必须用真实路由器(如 AR2),不能填写 PC 等无三层转发功能的终端设备(例如PC2)。
- 流行为之所以关联了NQA,是为了通过NQA的ICMP请求发起的ARP请求来获取202.1.1.4的MAC地址,因为经过测试,AR1由于没有202.1.1.4的MAC地址,最终无法路由重定向到202.1.1.4。
完成配置后即可正常访问:

在AR1和AR2之间抓包可以看到相同的源目的IP地址的三次握手,http连接,四次挥手:

3. 参考
https://support.huawei.com/enterprise/zh/knowledge/KB1000021808
https://support.huawei.com/enterprise/zh/knowledge/EKB1000064011










