跳到正文
Lutong's Homepage

华为H3C实战 | 第14章 NAT 与地址转换

📚 本系列共 43 篇(第 14 / 43 篇) · 第二卷 路由与广域网篇 —— 让数据找到路

← 上一篇:第 13 章 IS-IS 协议配置详解  下一篇:第 15 章 PPP 与 PPPoE →


本章导读:公司内部每人一个分机号,外面只知道总机号——NAT 就是这套"总机转分机",把几乎无限的私网设备塞进有限的公网地址。本章讲清出方向 NAT、地址池,以及"NAT 配了却还是上不了网"的三层排查法。

本章结构:

  • 14.1 功能原理与业务场景 —— 总机/分机的比喻、RFC 1918 三个私网段、NAT 会话表(五元组映射)与报文的地址改写过程
  • 14.2 华为设备配置详解 —— 老式 AR 风格模板、逐行讲解,以及四个设计要点:为什么 nat outbound 后面 ACL 是必须的、地址池大小怎么估算、NAT 与安全策略谁先谁后、NAT 之后怎么审计
  • 14.3 H3C 设备配置详解 —— H3C 的 nat outbound 写法与逐行坑点对照
  • 14.4 命令对照表 —— 两家并排
  • 14.5 配置验证 —— display nat session / display nat outbound 看会话与规则命中
  • 14.6 排错与故障树 —— 三层排查:流量到没到出口 → 有没有建会话(ACL 匹配计数是否增长)→ 会话建了回包通不通
  • 14.7 新手踩坑 —— NAT 配在错误的接口方向、ACL 匹配不上却不报错
  • 14.8 本章小结 —— 要点清单 + 自测题

重点提示:内网不能上网,按 14.6 的三层从上往下走,先确认包有没有到出口设备。“NAT 看着配了但不生效"绝大多数是 ACL 没匹配上——看 display acl 2000 的匹配计数有没有涨,比反复看配置快得多。防火墙上做 NAT 还要注意策略顺序(第 26、27 章)。 关联章节:出口路由(默认路由指向运营商)见第 10 章;家庭/企业拨号拿到公网地址见第 15 章;防火墙上的 NAT 与安全策略顺序见第 27 章;BRAS 侧的地址转换见第 31 章。

14.1 功能原理与业务场景

14.1.1 这功能是干嘛的(通俗版)

想象一家只有一条对外电话线的公司。公司内部每个员工都有自己的分机号(101、102、103……),但外面的人只知道公司的总机号码。员工往外打电话,对方来电显示的都是公司总机;外面的人想找某个员工,得先打总机,由总机转到具体分机。总机那边还要记一笔账:刚刚 102 分机打了个电话出去、占的是总机哪条外线,等回拨进来的时候才知道该往哪个分机转。

网络地址转换(NAT,Network Address Translation)[10] 就是这套"总机转分机"的机制。内网每台电脑都有自己的私网地址(分机号,按 RFC 1918[3] 规划),互联网只认出口设备上那一个或少数几个公网地址(总机号)。内网访问外网时,出口路由器把报文的源地址换成公网地址,并记下"谁打出去的、占了哪个端口”;回包回来时,再按这份记录把地址换回私网地址。

如果没有 NAT,今天互联网的 IPv4 地址早就分完了:全球只有约 43 亿个 IPv4 地址,而联网设备远超这个数。NAT 用一份"地址复用"把几乎无限的私网设备塞进了有限的公网地址里,这就是它存在的第一价值。第二价值是安全:外网无法直接寻址内网主机,等于给内网加了一层门禁——当然这层门禁并不等于防火墙,真正要控流量还得上安全策略。

14.1.2 在网络里怎么落地(设计视角)

私有地址由 RFC 1918 规定,只用三个网段:10.0.0.0/8、172.16.0.0/12、192.168.0.0/16。这三个网段不允许在公网上路由,运营商设备见到源地址是私网的包会直接丢弃。因此企业内网要访问互联网,必须在出口做一次地址翻译。

NAT 设备维持一张会话表(Session Table),每条表项记录一个五元组映射。下图演示内网 PC 访问外网 Web 服务器时地址怎么被改写:

   内网 PC                                出口路由器                       互联网
 192.168.10.10                           两套地址                         一个公网地址
     |                                      |                                  |
     | 源:192.168.10.10:50000               |                                  |
     | 目的:203.0.113.5:443  --------------->  改写源地址与端口                  |
     |                                      源:172.16.0.2:1024                |
     |                                      目的:203.0.113.5:443 -------------> |
     |                                      |                                  |
     | <--------------------------------- 会话表查表回翻                    | <----- 回包
     |   目的:192.168.10.10:50000           |                                  |

会话表的关键字段是:协议、内网地址:端口、公网地址:端口、对端地址:端口、老化时间。一条 NAT 表项就是一个会话,会话老化(TCP 通常几百秒、UDP 更短)后表项消失,迟到的回包就再也翻不回去了——这是很多"NAT 配了但过一会儿就不通"“视频看一会儿就卡"问题的根源。

按转换对象分,NAT 只有两大类,其余花样都是这两类的组合:

类型 转换什么 典型用途 谁发起 例子
源 NAT(SNAT) 报文源 IP(和/或端口) 内网访问互联网 内网主机 Easy IP、NAPT
目的 NAT(DNAT) 报文目的 IP(和/或端口) 外网访问内网服务器 外网主机 NAT Server、静态一对一

源 NAT 再按"用的是接口地址还是地址池"“改不改端口"细分,这就是新手最容易绕晕的地方:

名称 转换后源地址 是否改端口 地址消耗 典型场景
Easy IP 出接口自身地址 改 0 个额外地址 小微出口,只有 1 个公网 IP
NAPT(地址池复用) 地址池中的地址 改 少量公网地址服务大量主机 中型企业
No-PAT 地址池中的地址 不改 一对一占用 需要保持源端口不变的业务

判断用哪种有个简单办法:先数公网地址有几个、内网主机有几台,再问业务是否要求源端口不变。绝大多数场景答案是 Easy IP。

再看内外网互访时地址怎么变。外网用户访问内网 Web 服务器时,报文的目的地址被替换:

  外网用户                       出口路由器(公网 172.16.0.2)              内网服务器
      |                                   |                             192.168.10.80
      | 目的:172.16.0.2:80  ------------->  目的地址改写                 |
      |                                   | 目的:192.168.10.80:80 ------> |
      |                                   |                              |
      | <----------------------------- 源地址改写回公网地址 <------------ | 回包
      |  源:172.16.0.2:80                 |                              |

注意这张图和上一张图的区别:源 NAT 改的是源地址,目的 NAT 改的是目的地址。两者可以在同一台设备上共存,比如同一个公网地址既做 Easy IP 让内网出去、又做 NAT Server 让外网进来。

为什么真实企业里常常要配"两层 NAT”。先说常见误解:很多人以为 NAT 只配在出口路由器上一处。实际中大型网络里常见两层——出口路由器做一次 Easy IP,内网某几个部门或某个合作方接入区再做一次 NAT。原因通常有三个:一是两个单位的私网地址段撞了(都是 192.168.10.0/24),合并时必须有一侧先翻译;二是某些业务方的地址段不归自己管,不允许出现在全局路由表里;三是把"地址转换"当成一种隔离手段,让合作方的源地址在主干上不可见。

两层 NAT 的代价是排错难度成倍上升:一台主机访问失败的排查路径要跨两台设备,每台都有独立的会话表,而且两台的老化时间不一致时会出现"上层还有表项、下层已经老化"的诡异现象。给新手的建议是:能单层就单层,不得不用两层时,把两台的地址转换规则、会话老化时间、日志都统一命名和统一记录,否则半年后没人看得懂。

适用版本:华为 VRP V200R019 及以上(AR6000/USG6000E 系列);H3C Comware V7(R2610 及以上)。

14.2 华为设备配置详解

14.2.1 命令行基础速览(本章会用到的那几条)

华为把 NAT 分成两种配置风格,新手最容易混:

  • 老式(接口下直接配):nat outbound、nat server,直接写在公网接口下。AR 系列路由器最常用,也是最容易讲清楚的一种。
  • 新式(NAT 策略):nat-policy 视图里写规则,按源地址/源区域/目的区域匹配,再指定转换动作。防火墙(USG6000E)必须走这套,路由器的较新版本也支持。

本章主线用老式风格讲透原理,NAT 策略只给骨架和踩坑点。

在敲任何命令之前,先花十分钟把下面这张"作战地图"填完——这一步省掉,后面排错能多花十倍时间:

要确认的事 在哪看 填什么 填错的后果
公网地址有几个、是静态还是动态 运营商合同 / 设备接口 个数 = ___,形态 = 静态/PPPoE/DHCP 按静态规划了地址池,实际是动态地址,池子全失效
朝公网的接口是哪个 display interface brief 接口名 = ___ 配到内网口上,NAT 静默不生效
内网有哪些网段要上网 交换机 VLAN 规划 网段清单 = ___ 漏一个网段,那批人集体上不了网
哪些内部服务要对外发布 业务方提供 服务名 / 内网IP / 端口 = ___ 端口写错,外网访问到空服务
内网服务器自己的网关是否指向出口 服务器上 ipconfig / ip route 网关 = ___ 外部请求进来了,回包找不到门
是否需要二层 NAT 是否存在地址段冲突 是/否 不做,合并后地址撞车;乱做,排错翻倍

下面这张表是本章会用到的命令速览:

用途 华为命令 视图 说明
建地址池(老式) nat address-group 1 172.16.0.10 172.16.0.20 系统视图 一条命令建组并给地址范围
建地址池(新式) nat address-group 1 → section 0 172.16.0.10 172.16.0.20 系统视图 进组视图后分节添加
Easy IP nat outbound 2000 接口视图 只带 ACL,直接用接口地址
NAPT 复用地址池 nat outbound 2000 address-group 1 接口视图 多内网映射到少公网地址,转换端口
No-PAT nat outbound 2000 address-group 1 no-pat 接口视图 只换地址不换端口,一对一占用
NAT Server nat server protocol tcp global 172.16.0.2 80 inside 192.168.10.80 80 接口视图 外网访问内网服务器
用接口地址发布 nat server protocol tcp global current-interface 80 inside ... 接口视图 公网地址动态变化时用
静态一对一 nat static global 172.16.0.3 inside 192.168.10.30 系统视图 双向固定映射
查看会话 display nat session all 任意视图 排错第一命令
FTP ALG nat alg ftp enable 系统视图 否则主动模式 FTP 列表卡住

14.2.2 完整配置模板(AR 路由器,老式风格)

场景:企业出口 AR6140-16G4XG,内网 192.168.10.0/24 从 GigabitEthernet0/0/0 接入,GigabitEthernet0/0/1 上行到运营商,公网地址 172.16.0.2/24(示例用文档专用段,实网换成运营商分配的真实地址)。内网有 Web 服务器 192.168.10.80 需要对外发布,还有一台 FTP 服务器 192.168.10.21。

# 进入系统视图并改名
system-view
sysname HUAWEI

# 内网接口配置
interface GigabitEthernet0/0/0
 ip address 192.168.10.1 255.255.255.0
 quit

# 公网接口配置
interface GigabitEthernet0/0/1
 ip address 172.16.0.2 255.255.255.0
 quit

# 默认路由指向运营商网关
ip route-static 0.0.0.0 0.0.0.0 172.16.0.1

# 用基本 ACL 圈定允许上网的内网网段
acl number 2000
 rule 5 permit source 192.168.10.0 0.0.0.255
 quit

# 公网接口上启用 Easy IP,直接借用接口地址
interface GigabitEthernet0/0/1
 nat outbound 2000
 quit

# 发布内网 Web 服务器到公网,端口 80 对 80
interface GigabitEthernet0/0/1
 nat server protocol tcp global 172.16.0.2 80 inside 192.168.10.80 80
 quit

# 发布内网 FTP 服务器,端口 21 对 21
interface GigabitEthernet0/0/1
 nat server protocol tcp global 172.16.0.2 21 inside 192.168.10.21 21
 quit

# 打开 FTP 应用层网关,否则主动模式 FTP 列目录会卡住
nat alg ftp enable

# 保存(不 save,重启即丢)
save

如果公网给了不止一个地址,想把这些地址池复用给内网(NAPT),把 nat outbound 2000 那条换成地址池版本即可:

# 创建一个地址池,成员是运营商额外给的公网地址段
nat address-group 1
 section 0 172.16.0.10 172.16.0.20
 quit

# 公网接口上调用地址池,实现多对少的 NAPT 转换
interface GigabitEthernet0/0/1
 nat outbound 2000 address-group 1
 quit

如果某台设备需要固定占用一个公网地址、且要求源端口不被改写(比如某些老系统做端口白名单认证),用 No-PAT 并配合静态一对一:

# No-PAT:只换地址不换端口,一台内网主机占一个公网地址
interface GigabitEthernet0/0/1
 nat outbound 2001 address-group 1 no-pat
 quit

# 静态一对一:内网 192.168.10.30 永远用公网 172.16.0.3
nat static global 172.16.0.3 inside 192.168.10.30

14.2.3 逐行讲解

命令 作用 新手常填错的地方
acl number 2000 + rule 5 permit source ... 规定哪些内网地址允许被转换 ACL 号必须落在 20002999 的基本 ACL 区间;写成高级 ACL(30003999)也能被 nat outbound 引用,但匹配逻辑按五元组走,新手容易误伤
nat outbound 2000 不带地址池 = Easy IP 只在朝公网的出接口上配,配在内网口不生效,而且默认不报错
nat outbound 2000 address-group 1 带地址池 = NAPT 忘写 no-pat 时默认就是 NAPT,同时转换 IP 和端口
nat outbound 2000 address-group 1 no-pat No-PAT,只换 IP 不换端口 公网地址数少于内网主机数时不够用,超出部分会话建不成功
nat server protocol tcp global ... inside ... 目的 NAT,发布服务器 写在公网接口下;global 后面写 current-interface 表示"用本接口地址”
nat static global 172.16.0.3 inside 192.168.10.30 双向固定一对一 系统视图下配,不需要 ACL;公网地址不能是接口自身地址
nat alg ftp enable 打开 FTP 的 ALG 系统视图;不开的话 FTP 主动模式能登录但不能列目录

为什么 nat outbound 后面 ACL 是必须的。华为的 nat outbound 允许不带 ACL,但那就等于"所有从该接口出去的流量都转换"。风险有两个:一是每位从公网进来的回包也被当成转换对象,会话混乱;二是将来加了第二个内网段时无法区别对待。所以规范写法是永远带一个基本 ACL,明确圈定"哪些内网网段允许上网"。

关于 NAT 策略(新式)。如果你用的是 USG6000E 防火墙,或者想按"源区域→目的区域"精细控制、想让 NAT 和安策在同一套规则体系里表达,就走 NAT 策略。华为 NAT 策略的骨架是 nat-policy 视图 + 命名规则 + 匹配条件 + 转换动作:

# 进入 NAT 策略视图,创建一条按名字标识的规则
nat-policy
 rule name nat_lan_to_wan

  # 匹配内网网段
  source-address 192.168.10.0 mask 255.255.255.0

  # 匹配从 trust 区域到 untrust 区域的流量
  source-zone trust
  destination-zone untrust

  # 动作:源地址转换为 Easy IP
  action source-nat easy-ip
  quit
 quit

在防火墙上还要注意一个顺序问题:报文进入防火墙后的处理顺序是"目的地址转换 → 安全策略 → 源地址转换"。

这条顺序直接决定了安全策略里地址该写哪一个,两句话记死:

NAT 类型 在安全策略之前还是之后 安全策略里该写哪个地址
源 NAT(内网访问公网) 安全策略之后 源地址写转换前的内网私网地址
目的 NAT(公网访问内网服务器 / NAT Server) 安全策略之前 目的地址写转换后的私网地址(即服务器真实的私网 IP),不是对外发布的公网地址

口诀:「源看转换前,目的看转换后」。

依据:华为官方《什么是安全策略》词条原文——「目的NAT转换在安全策略检查之前,因此安全策略中的目的地址需要指定为NAT转换之后的地址;源NAT转换在安全策略检查之后,因此安全策略中的源地址需要指定为NAT转换之前的地址。」这是新手在防火墙上配 NAT 失败的头号原因,十次里有六次是安全策略匹配条件写反了——尤其是 NAT Server 那条,绝大多数人会本能地把公网地址填进安全策略,结果流量在 NAT 之前就被策略丢掉了。详见第 27 章。

⚠ 版本差异:nat-policy 规则下的动作关键字,经华为官方维护宝典核实,USG6000E/USG6000/USG9500 系写法为 action source-nat easy-ip 与 action source-nat address-group <地址池名>。AR 路由器上另有以接口方式配置的 nat outbound 体系(本章 13.2.2 的主线),两者不要混用。上线前仍建议敲 nat-policy → rule name test → action ? 用问号补全确认本机实际支持的取值。

出处:华为 USG6000E/USG6000/USG9500 维护宝典 · 配置NAT (原文示例:[sysname-policy-nat-rule-policy_nat1] action source-nat address-group addressgroup1)

14.2.4 华为侧的四个设计要点

配完命令只是"能跑",要在生产环境不翻车,还得想清楚下面四件事。

要点一:地址池大小怎么估算。用 Easy IP 时不用管,一个地址扛住一个企业的常见规模没问题——理论上一个公网地址有约 6.4 万个端口可用,按每人同时 200 个会话算,能撑几百人。但如果业务里有大量到同一目的地址、同一端口的连接(比如内网所有人同时开同一个 SaaS 应用),端口复用会撞号,表现为"连接偶发失败",这时候就得扩到多个公网地址的地址池。

要点二:NAT 与安全策略谁先谁后。前文说过顺序是"目的转换 → 安策 → 源转换"。由此推出两条实践结论:一是"外网访问内网服务器"的安全策略里,目的地址要写内网服务器的私网地址(因为目的转换已经先做完了),写公网地址反而匹配不上;二是"内网访问外网"的安全策略里,源地址要写内网私网地址(源转换还没做)。这两条记反了,就是最典型的"策略写了、日志里显示命中、但业务不通"。

要点三:NAT 之后怎么审计。NAT 把所有人的流量都变成同一个出口地址,日志里自然分不清是谁。要在设备上开 NAT 会话日志(nat log 相关配置,具体命令视版本而定),并把日志送到日志服务器,这样才能从"公网地址 + 端口"反查回"内网地址"。这一项在等保测评里经常被直接问到。

要点四:NAT 与路由的关系。配了 NAT 不等于配了路由。NAT 只改报文的地址字段,改完之后报文还要按路由表走。很多人配完 nat outbound 发现还是不通,一查是忘写默认路由,或者内网 PC 的网关指错。记住:NAT 管"变成谁",路由管"往哪走",两件事缺一不可。

14.3 H3C 设备配置详解

H3C Comware V7 的 NAT 全部在接口视图下配置,没有独立"NAT 策略"视图(常规路由场景)。地址池用 nat address-group 进组视图后用 address 添加成员,这一点跟华为的老式一条命令写完不同,需要多敲两行。

前置场景与上一节完全一致:MSR3610-X1 做出口,内网 192.168.10.0/24 从 GigabitEthernet1/0/1 接入,公网是 GigabitEthernet1/0/2,地址 172.16.0.2/24。

# 进入系统视图并改名
system-view
sysname H3C

# 内网接口配置
interface GigabitEthernet1/0/1
 ip address 192.168.10.1 255.255.255.0
 quit

# 公网接口配置
interface GigabitEthernet1/0/2
 ip address 172.16.0.2 255.255.255.0
 quit

# 默认路由指向运营商
ip route-static 0.0.0.0 0.0.0.0 172.16.0.1

# 基本 ACL:H3C 也是 2000~2999 区间
acl basic 2000
 rule 5 permit source 192.168.10.0 0.0.0.255
 quit

# 公网接口上配置 Easy IP,不带地址池即用接口地址
interface GigabitEthernet1/0/2
 nat outbound 2000
 quit

# 发布内网 Web 服务器
interface GigabitEthernet1/0/2
 nat server protocol tcp global 172.16.0.2 80 inside 192.168.10.80 80
 quit

# 发布内网 FTP 服务器
interface GigabitEthernet1/0/2
 nat server protocol tcp global 172.16.0.2 21 inside 192.168.10.21 21
 quit

# 保存
save force

需要地址池复用时,H3C 是先建组再添加成员,注意是 address 而不是 section:

# 创建地址组 1 并进入组视图
nat address-group 1
 address 172.16.0.10 172.16.0.20
 quit

# 公网接口调用地址组,实现 NAPT
interface GigabitEthernet1/0/2
 nat outbound 2000 address-group 1
 quit

H3C 的静态一对一用 nat static outbound,参数顺序是"内网地址 公网地址",而且必须在接口上再使能一次:

# 全局配置一对一静态转换:内网 192.168.10.30 固定用公网 172.16.0.3
nat static outbound 192.168.10.30 172.16.0.3

# 在公网接口上使能这条静态转换,漏了这行不生效
interface GigabitEthernet1/0/2
 nat static enable
 quit

对外发布也可以用 current-interface 关键字,表示"用本接口地址",适合公网地址由 DHCP 或 PPPoE 动态获取的场景:

# 用公网接口自身地址做映射,不写死 IP
interface GigabitEthernet1/0/2
 nat server protocol tcp global current-interface 8080 inside 192.168.10.80 80
 quit

如果多台服务器想对外提供一个入口、由设备做负载分担,H3C 还提供 nat server-group:

# 建立内部服务器组,添加两台 Web 服务器作为成员
nat server-group 1
 inside ip 192.168.10.80 port 80 weight 5
 inside ip 192.168.10.81 port 80 weight 5
 quit

# 公网接口上把 80 端口映射到该服务器组
interface GigabitEthernet1/0/2
 nat server protocol tcp global 172.16.0.2 80 inside server-group 1
 quit

⚠ 版本差异:H3C 的 nat static 系列命令在 V5 与 V7 中写法不同,V7 要求接口上 nat static enable 才生效,这点比华为更容易漏。V5 老设备提示:V5 的地址池语法是 nat address-group <组号> <起始地址> <结束地址>,近似华为的老式写法。

14.3.1 逐行讲解与坑点对照

H3C 的配置整体比华为多一层"进组视图",但有三个地方比华为更容易翻车,下面逐条对照:

命令 作用 与华为的差异 / 坑点
acl basic 2000 建基本 ACL 华为写 acl number 2000;H3C 可以写 acl basic 2000 或 acl number 2000,两种都能进,但带 basic 更明确,不容易误建高级 ACL
nat address-group 1 建组并进入组视图 华为老式一条写完,H3C 必须再 address 加成员,漏掉这一步组内是空的,nat outbound 会匹配不到地址
address 172.16.0.10 172.16.0.20 往组里加地址段 多个不连续地址段要分多行 address 加,地址段之间不能重叠
nat outbound 2000 Easy IP 与华为一致,不带地址组即用接口地址
nat outbound 2000 address-group 1 NAPT 与华为一致,注意 address-group 是组号不是组名
nat server protocol tcp global ... inside ... 内部服务器 与华为一致;current-interface 关键字两家都支持
nat static outbound 内网 公网 静态一对一 参数顺序与华为相反:华为是 global 公网 inside 内网,H3C 是"内网在前、公网在后",抄错了不报错但不生效
nat static enable 接口使能静态转换 H3C 独有,华为不需要;忘敲这行是 H3C 静态 NAT 配了不生效的第一大原因

H3C 特有的一点:NAT 与 ACL 的先后。H3C 的设备把 ACL 引用到 nat outbound 后,ACL 只负责"哪些源地址要被转换",不负责"放行还是丢弃"。也就是说,即使 ACL 里写了 rule deny,被拒的地址也不会被丢包,只是"不做转换"而已,报文照样按原地址往外发。这一点经常误导新手——他们以为在 NAT 的 ACL 里 deny 掉某个网段就能禁它上网,实际上必须去包过滤(packet-filter)里拒才行。华为同理:nat outbound 引用的 ACL 是"匹配是否转换",不是"安全过滤"。

14.4 华为 / H3C 命令对照表

功能 华为(VRP) H3C(Comware V7) 差异说明
建地址池 nat address-group 1 172.16.0.10 172.16.0.20 nat address-group 1 → address 172.16.0.10 172.16.0.20 华为一条带范围,H3C 进组视图加成员
Easy IP nat outbound 2000 nat outbound 2000 相同
NAPT 复用 nat outbound 2000 address-group 1 nat outbound 2000 address-group 1 相同
No-PAT nat outbound 2000 address-group 1 no-pat 同类写法带 no-pat 参数 参数位置一致,以设备补全为准
NAT Server nat server protocol tcp global 172.16.0.2 80 inside 192.168.10.80 80 同左写法 相同
用接口地址发布 nat server protocol tcp global current-interface 80 inside ... nat server protocol tcp global current-interface 80 inside ... 相同
静态一对一 nat static global 172.16.0.3 inside 192.168.10.30(系统视图) nat static outbound 192.168.10.30 172.16.0.3 + 接口 nat static enable H3C 参数顺序是内网在前,且要接口使能
策略式 NAT nat-policy → rule name → action source-nat 无独立策略视图,全部在接口下 架构差异最大的一处
查看会话表 display nat session all display nat session table 命令名不同
查看地址池 display nat address-group display nat address-group 相同
ACL 类型区间 基本 20002999、高级 30003999 基本 20002999、高级 30003999 相同

14.5 配置验证

验证 NAT 要分三步:先看配置挂上了没有,再看表项生效没有,最后看真实流量有没有转换。

第一步,确认接口上的 NAT 配置挂上了,用 display nat outbound:

display nat outbound

期望看到类似输出,说明 ACL 2000 已绑定、工作在 Easy IP 模式:

 NAT Outbound Information:
 ------------------------------------------------------------------
 Interface              Acl      Address-group/IP/Interface    Type
 GigabitEthernet0/0/1   2000     172.16.0.2                    easyip
 ------------------------------------------------------------------

如果 Type 列显示 address-group,说明走的是地址池版本;显示 easyip 说明是 Easy IP。

第二步,看 NAT Server 表项有没有生效,用 display nat server:

display nat server

期望输出里能看到公网地址/端口与内网地址/端口的对应关系,Config status 为 Active:

 NAT Server Information:
 ------------------------------------------------------------------
 Interface       : GigabitEthernet0/0/1
 Protocol        : 6(TCP)
 Global IP/port  : 172.16.0.2/80
 Inside IP/port  : 192.168.10.80/80
 Config status   : Active
 ------------------------------------------------------------------

第三步才是真正的证据。让内网 PC 开个网页,然后在设备上执行:

display nat session all

期望看到源地址已经从 192.168.10.x 变成了 172.16.0.2,并且带端口转换:

  Protocol     : TCP
  Source       : 192.168.10.10:50000 -> 172.16.0.2:1024
  Destination  : 203.0.113.5:443
  State        : ESTABLISHED

这里 -> 左边是原始地址、右边是转换后地址。如果这一行都没有,说明流量根本没到 NAT 这一层,不是 NAT 的问题。

H3C 上验证命令只差名字,判断标准完全一样:

display nat outbound
display nat server
display nat session table

看 ACL 有没有匹配上也很关键,匹配计数一直不涨就说明包没打到这里:

# 华为:查看 ACL 2000 各规则的匹配次数
display acl 2000

# H3C:同样查看 ACL 2000 的匹配计数
display acl 2000

14.6 排错与故障树

NAT 出问题,按"流量有没有到出口设备 → 能不能转换 → 转换后能不能回来"三层排查。故障树如下:

内网不能上网
 ├─ 1. 出口设备有没有收到这个包?
 │   ├─ 接口 down → display interface Brief
 │   ├─ 没有默认路由 → display ip routing-table
 │   └─ 内网 PC 网关没指对 → 在 PC 上 ipconfig 确认
 ├─ 2. 收到包但没建会话?
 │   ├─ ACL 没匹配上 → display acl 2000,看匹配计数是否增长
 │   ├─ NAT 配在了错误的接口 → display nat outbound,看 Interface 列
 │   └─ 安全策略挡住了(防火墙)→ display security-policy rule all
 ├─ 3. 会话建了但回包不通?
 │   ├─ 内网没有回程路由 → display ip routing-table 192.168.10.0
 │   ├─ 公网地址与内网地址重叠 → display nat address-group
 │   └─ 会话老化太快 → display nat session aging-time
 └─ 4. NAT Server 外网访问不了?
     ├─ 公网地址不是本机接口地址且未做引流 → 加黑洞路由
     ├─ ALG 未开启(华为常见;H3C 缺省已开)→ display nat alg
     └─ 内网服务器自身没配网关
症状 可能原因 排查命令
内网完全不能上网 ACL 写成 deny、ACL 号写错 display acl 2000
一部分网段能上网一部分不能 ACL 只放行了部分网段 display nat outbound
能 ping 通但开网页不行 安全策略只放行 ICMP,或 MTU 问题 ping -s 1400 分段测试
上网突然全断、过会儿又好了 会话表满或老化过快 display nat session verbose
FTP 能登录不能列目录 ALG 未开启(华为常见;H3C 缺省已开) display nat alg
外网用公网地址访问不了服务器 NAT Server 没写、或公网地址不在接口上 display nat server
内网用公网地址访问自己的服务器不通 未支持 NAT 天回环(hairpin) 改用内网地址访问
配了地址池但一点不转换 地址池包含接口自身地址 display nat address-group

两个最容易踩的深层坑。

第一个是 NAT 天回环(hairpin)。内网 PC 想用"公网地址 + 端口"访问内网的自己的服务器,报文从内网口进来、又要从内网口出去,源和目的都在内网侧。多数设备默认不处理这种"同侧进出"的转换,表现就是内网怎么都打不开,外网却正常。解决办法要么是从架构上避免(内网用内网地址访问,或配 DNS 分视图),要么在设备上开启 hairpin 支持(不同型号支持程度差别很大)。华为还有 nat dns-map 思路,可以做到私网用户通过域名访问同私网的服务器时,设备把 DNS 应答里的公网地址改写成私网地址。

第二个是 FTP 与特殊协议为什么要 ALG。FTP 主动模式下,服务器会用 PORT 命令在载荷里告诉客户端"请连我这个 IP:端口"。如果服务器是内网地址,它填的就是私网 IP,外网客户端当然连不上。ALG(应用层网关,Application Layer Gateway)就是让 NAT 设备深入检查载荷,把里面的私网地址和端口改写掉。

两家的 ALG 命令不同,而且缺省状态也不一样,这是最容易误判"我明明没配过为什么能用/不能用"的地方:

项目 华为(VRP) H3C(Comware V7)
开启命令 nat alg ftp enable(系统视图) nat alg ftp(系统视图)
查询状态 display nat alg display nat alg
FTP ALG 缺省状态 需按版本确认 缺省开启
全部开启 — nat alg all

H3C 的官方命令参考写得很清楚:nat alg { all | dns | ftp | h323 | icmp-error | ils | mgcp | nbt | pptp | rsh | rtsp | sccp | sip | sqlnet | sunrpc | tftp | xdmcp },并且"缺省情况下,DNS、FTP、ICMP 差错报文、PPTP、RTSP 协议类型的 NAT ALG 功能处于开启状态"——也就是说 H3C 上 FTP ALG 默认就是开的,通常不需要你手动配。所以 H3C 上遇到 FTP 列表卡住,第一反应不该是"去开 ALG",而应该先怀疑别的(安全策略放行、服务器被动端口范围等)。

反之在华为上,nat alg ftp enable 是系统视图下的显式开启命令,不配就是不开。

出处:H3C 01-NAT配置 、H3C 15-NAT命令

被动模式(PASV)因为由客户端主动连服务器开的端口,相对友好,但端口随机,防火墙策略要放开范围。 一个真实的排障实例(把上面的故障树走一遍)。

现象:某小公司上午换了一台出口路由器,配完 Easy IP 后,内网 PC 能打开部分网站,但访问某个视频平台一直转圈;微信能发文字不能发文件;重启路由器后短暂恢复,过十几分钟又不行。

按故障树走:

第一步,先确认流量有没有到设备。在出口路由器上 display interface GigabitEthernet0/0/1 看公网口收发包计数,发现出方向包数正常增长、但不等于入方向,说明去包出去了、回包没回来或者回来没翻回去。再看 display ip routing-table 0.0.0.0 确认默认路由在。

第二步,确认会话表。display nat session all 里能找到到视频平台的表项,但发现大量表项状态卡在 SYN_SENT,说明三次握手没完成。此时如果只看"能有会话",很容易误判成 NAT 没问题——实际上会话建了但转换后不通,正是故障树第三层的特征。

第三步,查转换后能不能回来。用 display nat outbound 确认 Easy IP 挂在了 GigabitEthernet0/0/1 上、类型显示 easyip。再查内网回程:display ip routing-table 192.168.10.0 有直连路由,没问题。

第四步,终于发现问题所在:这是典型的 MTU 与 PMTU 问题。视频和微信文件传输走大包,路径 MTU 发现(PMTUD)依赖 ICMP “需要分片"报文,而这个报文的源地址可能是中间某台设备,NAT 后对应的会话不一定存在,于是丢包;再加上部分运营商设备屏蔽 ICMP,PMTUD 彻底失效,表现为"小包通、大包不通、长连接一会儿卡”。处理办法是在公网口上调整 TCP MSS,把 MSS 限制在 MTU 减去 IP 头和 TCP 头之后的合理值(以太网 MTU 1500 时 MSS 1460,若上行链路的实际 MTU 更小则相应下调)。

这个实例要说明的是三件事:一是故障树的分层不能跳,二是"NAT 有会话"不等于"NAT 正常",三是要知道除了地址转换,还有 MTU/MSS 这类"看起来不像 NAT 问题"的 NAT 相关故障。

14.7 新手踩坑与注意事项

  1. NAT 配在内网口上——nat outbound 必须配在朝公网的出接口上,配在内网口不生效也不报错,这是排查时间最长的一类错误。
  2. 以为 NAT 的 ACL 是防火墙——nat outbound 引用的 ACL 只决定"哪些源地址被转换",不决定"放行还是丢弃",想封网段得上包过滤或安全策略。
  3. 忘开 ALG 导致 FTP 半瘫——能登录不能列目录,先查 ALG 是否开启,再去怀疑服务器。
  4. ACL 忘写 permit——华为与 H3C 的基本 ACL 末尾隐含拒绝所有,只建了 ACL 没写规则等于一条都不转。
  5. 地址池与接口地址冲突——nat address-group 里如果包含接口自身地址,转换会出现异常,地址池要用"额外的"公网地址。
  6. No-PAT 地址不够用——公网地址 5 个、内网 50 台,No-PAT 只能服务 5 台,超出部分默默失败,必须改用 NAPT。
  7. H3C 静态 NAT 忘了 nat static enable——命令配了、display 也看得见,但流量就是不转,是 H3C 独有坑。
  8. 改完不 save——华为 save 要敲 y 确认,H3C 用 save force,重启后配置全丢。
  9. NAT 后看不到真实源地址——设备日志里全是公网地址,追溯攻击源或审计上网行为时必须在设备上开 NAT 会话日志,否则记录里只剩一个出口地址。
  10. 以为 NAT 就是防火墙——NAT 只是地址复用加一层"外网不可寻址",真正要拦流量还得到第25~26章的安全策略上做。
  11. 大包不通就怀疑 NAT——先做 MSS 钳制排查一次,再回来查 NAT 表项,否则会在一张干净的表里空找。
  12. 会话老化参数乱改——为了"省会话表"把老化时间调得极短,结果是各种长连接应用随机断,NAT 表容量不够应该加内存或换设备,不是靠调老化时间糊弄。

14.8 本章小结

  • NAT 分源 NAT(内网出外网)和目的 NAT(外网访内网服务器)两类,靠会话表记录五元组映射,会话老化了表项就没了。
  • Easy IP 只借用接口地址,最省;NAPT 复用少量公网地址,最常用;No-PAT 一对一占用,地址充足且要求源端口不变时才用。
  • 华为可以在接口下直接配(老式),也可以用 nat-policy(新式,防火墙必用);H3C 全部在接口下配,没有独立策略视图。
  • 静态一对一:华为 nat static,H3C nat static outbound 且必须接口 nat static enable。
  • 验证三件套:display nat outbound 看配置、display nat server 看映射、display nat session all 看真实转换。
  • FTP 类协议离不开 ALG;内网用公网地址回访自己有 hairpin 问题。

一条配置速记口诀:先 ACL 圈源,再 outbound 挂口;池子有地址放地址池,没地址就 Easy IP;进来看 server,出去看 outbound;验证先看配置表,再看会话表;不通先查路由,再查安策,最后查 ALG。

自测题

  1. 内网有 100 台机器、只分到 1 个公网地址,应该用哪种 NAT?华为和 H3C 命令各怎么写?
  2. NAT Server 与静态一对一 NAT 的区别是什么?
  3. 内网访问外网正常,但外网访问内网的 FTP 服务器能登录不能列目录,最可能的原因?
  4. NAT 会话表里的表项老化了会有什么现象?为什么这会导致"视频看一会儿就卡"?
  5. 华为和 H3C 分别用哪条命令查看 NAT 会话表?
  6. 防火墙做 NAT 时,安全策略里的源地址写"转换前"还是"转换后"的地址?为什么?
  1. 用 Easy IP(本质是 NAPT 的特例,复用接口地址):华为 nat outbound 2000,H3C nat outbound 2000,ACL 2000 放行 192.168.10.0 0.0.0.255。
  2. NAT Server 是目的 NAT,只转换"外网访问进来"的流量目的地址和端口,用一个公网地址按端口区分多台服务器;静态一对一 NAT 是双向固定映射,内网地址与公网地址一一绑定,占用的公网地址不能被别人复用。
  3. FTP 主动模式下 PORT 命令携带内网地址,NAT 设备没有开启 ALG 改写载荷,客户端连不上数据端口。
  4. 表项消失后迟到的回包找不到对应映射被丢弃,表现为连接卡住或重传;视频流是长连接,长时间无流量后表项老化,新到的一段数据在设备上找不到映射就会丢包,于是画面卡顿。
  5. 华为 display nat session all;H3C display nat session table。
  6. 写"转换前"的源地址(内网私网地址)。因为防火墙处理顺序是目的转换 → 安全策略 → 源转换,走到安全策略那一步时源地址还没有被改写。

关于本书:《华为 / H3C 网络设备典型功能配置详解》—— 面向国内高校/企业网络环境, 华为 VRP 与 H3C Comware 双厂商并排配置的实操教材,共 43 章。 全书所有命令尽量有官方出处,查不到的显式标注「待核实」。 返回系列目录