华为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 号必须落在 2000nat 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 类型区间 | 基本 2000 |
基本 2000 |
相同 |
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 是系统视图下的显式开启命令,不配就是不开。
被动模式(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 新手踩坑与注意事项
- NAT 配在内网口上——
nat outbound必须配在朝公网的出接口上,配在内网口不生效也不报错,这是排查时间最长的一类错误。 - 以为 NAT 的 ACL 是防火墙——
nat outbound引用的 ACL 只决定"哪些源地址被转换",不决定"放行还是丢弃",想封网段得上包过滤或安全策略。 - 忘开 ALG 导致 FTP 半瘫——能登录不能列目录,先查 ALG 是否开启,再去怀疑服务器。
- ACL 忘写 permit——华为与 H3C 的基本 ACL 末尾隐含拒绝所有,只建了 ACL 没写规则等于一条都不转。
- 地址池与接口地址冲突——
nat address-group里如果包含接口自身地址,转换会出现异常,地址池要用"额外的"公网地址。 - No-PAT 地址不够用——公网地址 5 个、内网 50 台,No-PAT 只能服务 5 台,超出部分默默失败,必须改用 NAPT。
- H3C 静态 NAT 忘了
nat static enable——命令配了、display也看得见,但流量就是不转,是 H3C 独有坑。 - 改完不
save——华为save要敲y确认,H3C 用save force,重启后配置全丢。 - NAT 后看不到真实源地址——设备日志里全是公网地址,追溯攻击源或审计上网行为时必须在设备上开 NAT 会话日志,否则记录里只剩一个出口地址。
- 以为 NAT 就是防火墙——NAT 只是地址复用加一层"外网不可寻址",真正要拦流量还得到第25~26章的安全策略上做。
- 大包不通就怀疑 NAT——先做 MSS 钳制排查一次,再回来查 NAT 表项,否则会在一张干净的表里空找。
- 会话老化参数乱改——为了"省会话表"把老化时间调得极短,结果是各种长连接应用随机断,NAT 表容量不够应该加内存或换设备,不是靠调老化时间糊弄。
14.8 本章小结
- NAT 分源 NAT(内网出外网)和目的 NAT(外网访内网服务器)两类,靠会话表记录五元组映射,会话老化了表项就没了。
- Easy IP 只借用接口地址,最省;NAPT 复用少量公网地址,最常用;No-PAT 一对一占用,地址充足且要求源端口不变时才用。
- 华为可以在接口下直接配(老式),也可以用
nat-policy(新式,防火墙必用);H3C 全部在接口下配,没有独立策略视图。 - 静态一对一:华为
nat static,H3Cnat 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。
自测题
- 内网有 100 台机器、只分到 1 个公网地址,应该用哪种 NAT?华为和 H3C 命令各怎么写?
- NAT Server 与静态一对一 NAT 的区别是什么?
- 内网访问外网正常,但外网访问内网的 FTP 服务器能登录不能列目录,最可能的原因?
- NAT 会话表里的表项老化了会有什么现象?为什么这会导致"视频看一会儿就卡"?
- 华为和 H3C 分别用哪条命令查看 NAT 会话表?
- 防火墙做 NAT 时,安全策略里的源地址写"转换前"还是"转换后"的地址?为什么?
- 用 Easy IP(本质是 NAPT 的特例,复用接口地址):华为
nat outbound 2000,H3Cnat outbound 2000,ACL 2000 放行192.168.10.0 0.0.0.255。 - NAT Server 是目的 NAT,只转换"外网访问进来"的流量目的地址和端口,用一个公网地址按端口区分多台服务器;静态一对一 NAT 是双向固定映射,内网地址与公网地址一一绑定,占用的公网地址不能被别人复用。
- FTP 主动模式下 PORT 命令携带内网地址,NAT 设备没有开启 ALG 改写载荷,客户端连不上数据端口。
- 表项消失后迟到的回包找不到对应映射被丢弃,表现为连接卡住或重传;视频流是长连接,长时间无流量后表项老化,新到的一段数据在设备上找不到映射就会丢包,于是画面卡顿。
- 华为
display nat session all;H3Cdisplay nat session table。 - 写"转换前"的源地址(内网私网地址)。因为防火墙处理顺序是目的转换 → 安全策略 → 源转换,走到安全策略那一步时源地址还没有被改写。
关于本书:《华为 / H3C 网络设备典型功能配置详解》—— 面向国内高校/企业网络环境, 华为 VRP 与 H3C Comware 双厂商并排配置的实操教材,共 43 章。 全书所有命令尽量有官方出处,查不到的显式标注「待核实」。 返回系列目录
本人保留对侵权者及其全家发动因果律武器的权利
版权提醒
如无特殊申明,本站所有文章均是本人原创。转载请务必附上原文链接:https://www.elliot98.top/post/huawei-h3c-book/14/。
如有其它需要,请邮件联系!版权所有,违者必究!