📌 转载说明:本文首发于微信公众号《闫工的算力工具箱》 原文链接: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,或客户端长时间无响应后超时。

图:内网主机 ping 服务器公网 IP 100% 丢包,而外部访问同一地址正常——NAT 回流的典型现象
1.2 根因:回包走了非对称路径#
以内网主机访问 公网IP:端口 为例,完整过程如下:
- 内网主机发出请求,源地址为内网私网地址,目的地址为服务器公网 IP;
- 报文先到防火墙,防火墙执行目的 NAT,把目的地址转换为内网服务器的私网 IP;
- 服务器收到报文后,发现源 IP 与自己是同一网段的内网主机、目的 IP 是自己;
- 服务器判断无需经过网关,直接经二层交换机把响应发给内网主机,不经过防火墙;
- 内网主机收到「源 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 80803.2 创建公网地址池#
# 公网或私网地址均可,关键是必须与服务器不在同一网段
nat address-group 1 X.X.X.X X.X.X.X3.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 与目的 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)的相关规则 |
— — —
六、安全与规范#
- 最小暴露:仅对确需内网访问的业务启用 NAT 回流,避免把全部内网流量引入防火墙转发路径。
- 策略收敛:源/目的地址与端口尽可能精确匹配,不使用过宽的范围。
- 变更窗口:NAT 策略变更属网络高风险操作,须在变更窗口执行并准备回退方案。
- 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 通信配置