↓ 跳过正文

NAT 回流:内网通过公网 IP 访问内网服务失败的原因与配置

·2767 字·6 分钟·
作者
闫工
十年运营商机房 IT 运维,CCIE。做数据中心网络架构、GPU 服务器与裸金属交付,顺手写点自研小工具。

📌 转载说明:本文首发于微信公众号《闫工的算力工具箱》 原文链接:https://mp.weixin.qq.com/s/YlE81yOldqT3x_-NDqfUIQ

适用场景:使用服务器公网 IP 端口访问内网服务器,外部用户访问正常、内网用户通过公网IP访问失败 涉及设备:华为 USG、Cisco ASA、Palo Alto 等具备 NAT 能力的防火墙 核心方案:在端口映射(目的 NAT)基础上增加域内源 NAT,使回程报文经过防火墙,形成对称路径 本文覆盖:故障根因、多厂商配置、验证方法、排错表与规划建议

— — —

概述
#

只要在防火墙上做了端口映射(NAT Server),就可能遇到这个问题:外部用户通过公网 IP 访问内网服务器一切正常,内网用户用同一个公网 IP 访问同一台服务器却打不开——它不是必然,但足够常见,尤其是在一些没有默认开启NAT Loopback的设备上。

是否触发,取决于防火墙对回程报文的处理策略:有的设备默认放行并自动完成地址转换,有的设备则严格按路由表转发,导致回程报文绕过防火墙、连接无法建立。这既是设备实现差异,也是配置策略差异。

这不是设备故障,也不是单纯的 Bug,而是 TCP/IP 协议栈与地址转换机制共同作用的结果——内网用户发出的请求经过了防火墙,但服务器的响应报文走了另一条路径,导致连接无法建立。该现象称为 NAT 回流(Hairpinning,又称域内 NAT、双向 NAT、U-Turn)。

解决目标是让回程报文也经过防火墙,形成对称路径。本文给出根因分析、主流防火墙配置方法与验证手段。

— — —

一、原理与背景
#

1.1 故障现象
#

访问来源目标地址结果
外部用户服务器公网 IP:端口✅ 正常
内网用户同一公网 IP:端口❌ 连接失败(SYN → SYN/ACK → RST)

典型抓包特征为 SYN 之后直接收到 RST,或客户端长时间无响应后超时。

NAT 回流:内网通过公网 IP 访问内网服务失败的原因与配置

图:内网主机 ping 服务器公网 IP 100% 丢包,而外部访问同一地址正常——NAT 回流的典型现象

1.2 根因:回包走了非对称路径
#

以内网主机访问 公网IP:端口 为例,完整过程如下:

  1. 内网主机发出请求,源地址为内网私网地址,目的地址为服务器公网 IP;
  2. 报文先到防火墙,防火墙执行目的 NAT,把目的地址转换为内网服务器的私网 IP;
  3. 服务器收到报文后,发现源 IP 与自己是同一网段的内网主机、目的 IP 是自己;
  4. 服务器判断无需经过网关,直接经二层交换机把响应发给内网主机,不经过防火墙;
  5. 内网主机收到「源 IP 是私网服务器地址、目的 IP 是自己」的响应,与之前发出的「目的 IP 为公网地址」的请求不匹配,连接建立失败。

问题的核心是路径不对称:请求经过防火墙,响应却走二层直达,导致会话状态无法对齐。

1.3 解决思路
#

在防火墙上再做一次源 NAT:把内网主机的源地址转换为防火墙或地址池中的某个地址(与服务器不在同一网段),使服务器认为回包需要经过网关,从而把响应发回防火墙。防火墙完成双向地址转换后,再把报文送回内网主机,形成对称路径。

1.4 关键术语
#

术语含义
NAT Server / 端口映射公网 IP:端口 → 内网服务器私网 IP:端口(目的 NAT)
域内 NAT(Intrazone NAT)在同一安全域内(如 trust→trust)执行 NAT,区别于跨域 NAT
双向 NAT(Bidirectional NAT)同时执行源 NAT 与目的 NAT
U-Turn / Hairpinning流量从同一接口进入并离开(Palo Alto 术语)

— — —

二、规划与准备
#

准备项内容
网络区域梳理内网客户端网段、服务器私网 IP、对外映射的公网 IP
设备信息确认防火墙品牌与软件版本(不同厂商配置命令差异较大)
基础 NAT 就绪① 出网源 NAT(easy-ip / 出接口地址);② 端口映射(NAT Server);③ 公网地址池
验证工具测试客户端、tcpdump、display firewall session table 等会话查看命令

— — —

三、实施步骤
#

以华为防火墙(VRP)为例,在前三项基础 NAT 已配置的前提下,增加域内 NAT:

3.1 原有端口映射(目的 NAT)
#

nat server 0 protocol tcp global X.X.X.X 8080 inside 10.0.0.20 8080

3.2 创建公网地址池
#

# 公网或私网地址均可,关键是必须与服务器不在同一网段
nat address-group 1 X.X.X.X X.X.X.X

3.3 配置域内 NAT(trust 区域内做源 NAT)
#

nat-policy zone trust
 policy 1
  action source-nat
  policy source 10.0.0.0 mask 24        # 需要通过公网访问的内网主机网段
  policy destination X.X.X.X mask 32    # 映射的外网地址
  address-group 1                       # 源地址转换为地址池地址

3.4 若不生效
#

部分 VRP 版本需要额外处理:在源 NAT 规则中将目的区域显式指定为 untrust,并在目的地址中把外网 IP 一并纳入,使转换路径被正确匹配。不同版本行为存在差异,以现场 display firewall session table 的实际命中情况为准。

3.5 其他厂商配置要点
#

厂商关键动作
Cisco ASA先开启 same-security-traffic permit intra-interface 允许流量从同一接口进出,再配置 nat (inside,inside) source dynamic <内网> interface destination static <公网对象> <私网对象>
Palo Alto配置 U-Turn NAT:源区 trust、目的区 untrust、目的地址为公网 IP;转换页同时做目的地址转换(到私网)与源地址转换(Dynamic IP/Port,出接口地址)

— — —

四、验证
#

4.1 业务验证
#

在内网主机上访问公网 IP:端口,确认页面或服务可正常打开;同时确认外部用户访问不受影响。

4.2 会话表验证
#

# 华为:应能同时看到源 NAT 与目的 NAT 后的地址
display firewall session table

NAT 回流:内网通过公网 IP 访问内网服务失败的原因与配置

图:会话表中可同时看到源 NAT 与目的 NAT 后的地址,说明双向转换已生效

4.3 抓包验证
#

# 确认回包经由防火墙(而非服务器二层直连返回)
tcpdump -i <内网接口> host <服务器私网IP>

正常情况下应能抓到经防火墙中转的会话;若抓到的是服务器直接发往内网主机的回包,说明源 NAT 未生效。

— — —

五、常见问题与排错
#

现象可能原因处置
内网访问公网 IP 一直转圈 / SYN 后 RST仅配置了 NAT Server,未配置域内源 NAT增加 trust 区域内源 NAT,使回包经过防火墙
配置域内 NAT 后仍不生效规则方向或目的区域不匹配,或版本差异显式指定目的区域与公网目的地址;以会话表核对是否命中
外部用户也访问不了误改了入向 NAT 或安全策略回退变更,仅新增域内 NAT,保留原端口映射
防火墙丢弃非对称流量回包未经过防火墙源 NAT 必须把源地址转换为与服务器不同网段的地址
安全策略拦截 trust→trust部分型号默认不控制同域流量,但显式策略可能拦截放行 trust 到 trust(或到 local)的相关规则

— — —

六、安全与规范
#

  1. 最小暴露:仅对确需内网访问的业务启用 NAT 回流,避免把全部内网流量引入防火墙转发路径。
  2. 策略收敛:源/目的地址与端口尽可能精确匹配,不使用过宽的范围。
  3. 变更窗口:NAT 策略变更属网络高风险操作,须在变更窗口执行并准备回退方案。
  4. DNS 分流优先:若内网有 DNS,优先用内网 DNS 把域名解析到私网 IP(split DNS),从源头避免回流需求,比 NAT 回流更简洁可靠。

📌 规划建议:NAT 回流是「兜底」方案。规划阶段若能让内网用户直接使用私网地址或通过内网 DNS 解析访问,应优先采用,减少防火墙转发负担与排错复杂度。

— — —

参考
#

  • Palo Alto 官方:如何配置 U-Turn NAT(Hairpinning)
  • 华为企业技术支持:Bidirectional NAT(域内 NAT + NAT Server 示例)
  • Cisco:ASA Hairpinning 与 intra-interface 通信配置

相关文章