华为H3C实战 | 第27章 防火墙 NAT 与部署模式
📚 本系列共 43 篇(第 27 / 43 篇) · 第四卷 设备与安全篇 —— 路由器与防火墙
← 上一篇:第 26 章 防火墙安全区域与基本策略 下一篇:第 28 章 防火墙双机热备 →
本章导读:NAT 是"公司前台"——出去的改寄件人,进来的改收件人。本章重点不是 NAT 怎么配,而是NAT 和安全策略谁先谁后:目的地址看转换后、源地址看转换前,这一条写反了,策略永远不命中。
本章结构:
- 27.1 功能原理与业务场景 —— SNAT / DNAT / 双向 NAT 各管什么,报文处理的"先会话→再目的 NAT→再策略→最后源 NAT"四步顺序,Easy IP / NAPT / No-PAT / Smart NAT 怎么选
- 27.2 华为设备配置详解 —— NAT 策略、NAT Server、地址池与黑洞路由的完整模板
- 27.3 H3C 设备配置详解 —— H3C 侧对应写法与差异标注
- 27.4 华为 / H3C 命令对照表
- 27.5 配置验证 —— NAT 会话表、地址池使用率、Server-map 表怎么看
- 27.6 排错与故障树 —— “外网访问不到服务器"“内网上不了网"“时通时不通"的分支定位
- 27.7 新手踩坑与注意事项
- 27.8 本章小结
重点提示:任何"NAT 配了但不通"的问题,先回 27.1.3 对一遍地址——安全策略里的目的地址必须是转换后的私网地址。多公网 IP 的现场,别一股脑塞进源 NAT 地址池,先读 27.1.4 最后一段再决定。老设备的 nat outbound 写法和本本 nat-policy 不能混用。
关联章节:防火墙区域与安全策略见第 26 章;NAT 的协议机制与私网地址规划见第 14 章;防火墙上的 IPS 与安全策略挂载关系见第 29 章。
27.1 功能原理与业务场景
27.1.1 这功能是干嘛的(通俗版)
NAT(Network Address Translation,网络地址转换)的通俗理解是公司前台。
公司内部员工(内网地址)在办公室里可以随便称呼彼此,但对外寄信时不能写自己的工位号(外网不认内网地址),于是所有寄出去的信都写上「某某大厦 203 室,前台转交」。对方的回信也寄到前台,前台根据登记表找到是哪个员工的,转交给他。这张登记表就是NAT 转换表(在防火墙上叫会话表 / Server-map 表)。
源 NAT(SNAT):员工往外寄信,前台把「寄件人」改成公司地址。目的是「让别人看到的是公司,不是你本人」,同时节省公网地址。 目的 NAT(DNAT,端口映射 / NAT Server):外面的人寄信到前台,前台根据「收件人」改成某个具体员工。目的是「让外面的访问能到达里面的服务器」。 双向 NAT:两份都改,寄件人和收件人同时换,用在「内外网络地址冲突」或者「要修正返回路径」的场景。
27.1.2 在网络里怎么落地(设计视角)
一个典型的防火墙出口,左右两侧地址完全不对等:
内网 192.168.10.0/24 Internet
| |
PC 192.168.10.100 Host 198.51.100.88
| |
+--------[ 防火墙 ]---------------+
GE1/0/3 (trust) GE1/0/1 (untrust)
192.168.10.1 203.0.113.10
DMZ 192.168.30.0/24
服务器 192.168.30.10
|
GE1/0/4 (dmz) 192.168.30.1
这里有三条业务流,各自对应一种 NAT:
| 业务 | 方向 | NAT 类型 | 转换内容 |
|---|---|---|---|
| 内网 PC 上网 | trust → untrust | 源 NAT | 源 192.168.10.100 → 203.0.113.10 |
| 外网访问 DMZ Web | untrust → dmz | 目的 NAT(NAT Server) | 目的 203.0.113.10:8080 → 192.168.30.10:80 |
| 服务器主动对外更新 | dmz → untrust | 源 NAT | 源 192.168.30.10 → 203.0.113.10 |
第二行是重点:外网用户访问的是「防火墙的公网地址 + 8080 端口」,但实际服务在「DMZ 服务器的内网地址 + 80 端口」,中间做了两次转换(地址 + 端口)。这就是端口映射的本质。
27.1.3 全章最核心的知识:NAT 与安全策略的先后顺序
这个问题如果搞错,你会陷入「策略明明放行了但就是不通」的无限循环。先把顺序刻进脑子:
报文到达防火墙
|
v
+-----------------+
| 1. 查会话表 | 已有会话 → 直接按会话转发,跳过后续
+-----------------+
|
v
+-----------------+
| 2. 目的 NAT 转换 | ← 先做!NAT Server / 目的 NAT 在这一步
+-----------------+
|
v
+-----------------+
| 3. 安全策略匹配 | ← 用「转换后」的目的地址匹配策略
+-----------------+
|
v
+-----------------+
| 4. 源 NAT 转换 | ← 后做!源 NAT 在这一步
+-----------------+
|
v
报文发出
记住这个口诀:目的地址看「转换后」,源地址看「转换前」。
- 目的 NAT 在策略之前:所以安全策略里写的目的地址必须是转换后的私网地址(
192.168.30.10),不是外网用户看到的公网地址(203.0.113.10:8080)。 - 源 NAT 在策略之后:所以安全策略里写的源地址必须是转换前的私网地址(
192.168.10.100),不是转换后的公网地址。
华为官方的表述是:「目的 NAT 转换在安全策略检查之前,因此安全策略中的目的地址需要指定为 NAT 转换之后的地址;源 NAT 转换在安全策略检查之后,因此安全策略中的源地址需要指定为 NAT 转换之前的地址。」
写反了会怎样? 一个具体反例:外网用户访问 203.0.113.10:8080,你配的策略是「untrust → dmz,目的地址 203.0.113.10,放行 tcp 8080」。看起来完全合理,但永远不命中——因为流量在过策略时,目的地址已经被改成 192.168.30.10、端口改成 80 了。策略里的 203.0.113.10:8080 匹配不到任何报文,命中计数一直是 0,你看着这条「明明配了的」策略就会开始怀疑人生。
同理,源 NAT 场景:内网 192.168.10.0/24 做 Easy IP 出网,你在策略里写源地址为 203.0.113.10(转换后的),永远不命中。必须写 192.168.10.0/24。
27.1.4 NAT 的几种工作方式
| 方式 | 华为命令关键字 | 一对几 | 转换地址/端口 | 典型场景 |
|---|---|---|---|---|
| Easy IP | action nat easy-ip |
多对一 | 出接口地址 + 端口 | 最常见,出口只有一个公网地址 |
| NAPT(地址池 PAT) | action nat address-group N |
多对多 | 池内地址 + 端口 | 有多个公网地址,需要分摊 |
| No-PAT | 地址池 + no-pat |
一对一 | 只换地址不换端口 | 需要保留源端口,如双向访问场景 |
| Smart NAT | 地址池 + smart-nat |
混合 | 自动预留地址做 PAT | 特殊场景,初学不用深究 |
Easy IP 是第一选择,因为 99% 的企业只有一个公网 IP,而且它不需要维护地址池、不需要配黑洞路由,接口地址改了它自动跟着变。No-PAT 的坑最多:它不换端口,所以每个内网地址都要独占一个公网地址,且必须配黑洞路由防止路由环路。
四种方式的选择,可以用三个问题快速决策:
| 问题 | 选 Easy IP | 选 NAPT 地址池 | 选 No-PAT |
|---|---|---|---|
| 有几个公网 IP? | 1 个 | 2 个及以上 | 2 个及以上 |
| 有没有「必须保留源端口」的业务? | 无 | 无 | 有(如某些老式应用、IP 白名单对接) |
| 能不能接受 NAT 日志难追踪? | 可以 | 可以(可分摊,较易追踪) | 可以(一对一,最好追踪) |
「必须保留源端口」是什么业务? 典型例子有两个:一是对接某些老式金融/医疗系统,对方要求「源端口必须固定」;二是某些需要被对方按源端口识别的协议。这类需求很少,但一旦碰上,Easy IP 和 NAPT 都解决不了,只能用 No-PAT。
还有一个反直觉的结论:公网 IP 多于一个时,不一定非要上地址池。如果多出来的公网地址是用来做「外网访问不同服务」的(每个服务一个地址),那这些地址应该拿去做 nat server,而不是做源 NAT 的地址池。源 NAT 用 Easy IP 就够了,其他公网地址省下来做端口映射和 VPN,资源利用率更高。 很多现场把三个公网 IP 全塞进地址池做 NAPT,结果服务器发布还得再做映射,白白浪费两个地址。
适用版本:华为 USG6000E(VRP V500R005 及以上);H3C F1000 系列(Comware V7 R8860 及以上)。注意:本章的「NAT 策略」写法是华为下一代防火墙(USG6000 系列及以上)的方式;老一代设备的 NAT 配置挂在接口上(
nat outbound/nat server),与本章的nat-policy写法不能混用。在同一台设备上,一旦用nat-policy方式组织源 NAT,就不要再在接口上叠加nat outbound,否则两条转换逻辑会互相干扰。
27.2 华为设备配置详解
27.2.1 命令行基础速览
NAT 相关的四个命令族:
| 命令族 | 代表命令 | 作用 |
|---|---|---|
| 地址池 | nat address-group NAME → section 0 A B |
建地址池,为 NAT 提供公网地址 |
| 源 NAT 策略 | nat-policy → rule name X → action nat easy-ip |
决定谁出网时做源转换 |
| NAT Server | nat server name X protocol tcp global ... |
目的 NAT / 端口映射 |
| 目的 NAT 策略 | 目的 NAT 相关的策略视图 | 更灵活的目的 NAT(非 Server 场景) |
| 查看 | display firewall session table / display firewall server-map |
验证 |
27.2.2 完整配置模板(源 NAT + NAT Server + 安全策略)
这一套配置把「内网上网」和「外网访问 DMZ Web」两件事同时完成,是中小企业最常见的需求组合。读的时候特别注意「NAT 策略与安全策略的地址对应关系」——每段配置的注释都标明了「为什么这个地址这么写」。
# 基础:接口、区域、路由(第26章已讲过,这里简写)
system-view
sysname FW-EGRESS
interface GigabitEthernet1/0/1
description TO-ISP
ip address 203.0.113.10 255.255.255.0
quit
interface GigabitEthernet1/0/3
description TO-OFFICE
ip address 192.168.10.1 255.255.255.0
quit
interface GigabitEthernet1/0/4
description TO-DMZ
ip address 192.168.30.1 255.255.255.0
quit
firewall zone untrust
add interface GigabitEthernet1/0/1
quit
firewall zone trust
add interface GigabitEthernet1/0/3
quit
firewall zone dmz
add interface GigabitEthernet1/0/4
quit
ip route-static 0.0.0.0 0.0.0.0 203.0.113.1
接下来是源 NAT 策略,让内网和 DMZ 服务器都能出网:
# 源 NAT:内网与 DMZ 访问 Internet 时转换为出接口地址(Easy IP)
nat-policy
rule name SNAT_OFFICE
description office-to-internet
source-zone trust
destination-zone untrust
source-address 192.168.10.0 24
action nat easy-ip
quit
rule name SNAT_DMZ
description dmz-to-internet
source-zone dmz
destination-zone untrust
source-address 192.168.30.0 24
action nat easy-ip
quit
quit
然后是 NAT Server,把公网地址的 8080 端口映射到 DMZ 服务器的 80 端口:
# 目的 NAT(NAT Server):外网 203.0.113.10:8080 → 内网 192.168.30.10:80
nat server WEB_8080 protocol tcp global 203.0.113.10 8080 inside 192.168.30.10 80
如果想让外网的 80 端口直接访问服务器(可以用接口当前地址,不需要写死 IP):
# 用出接口当前地址做映射,适合公网地址是动态获取的场景
nat server HTTP protocol tcp global current-interface 80 inside 192.168.30.10 80
注意:上一条用的是写死的公网地址 203.0.113.10,这一条用 current-interface 表示「出接口当前地址」。两者不能同时指向同一个端口——如果已经用 global 203.0.113.10 8080 映射过一次,再对同一地址的同一端口配 current-interface,会出现地址端口冲突,设备会报错或后者不生效。
最后是安全策略。这是全章的重点——注意地址怎么写:
# 安全策略:源地址写转换前,目的地址写转换后
security-policy
rule name TRUST_TO_UNTRUST
description office-surf
source-zone trust
destination-zone untrust
source-address 192.168.10.0 24
action permit
quit
# 内网访问 DMZ 服务器(目的地址写私网地址)
rule name TRUST_TO_DMZ
source-zone trust
destination-zone dmz
source-address 192.168.10.0 24
destination-address 192.168.30.10 32
service http
action permit
quit
# 外网访问 DMZ Web:目的地址写转换后的私网地址与端口!
rule name UNTRUST_TO_DMZ_WEB
description publish-web-8080
source-zone untrust
destination-zone dmz
destination-address 192.168.30.10 32
service http
action permit
quit
quit
save
看清楚 UNTRUST_TO_DMZ_WEB 这条:目的地址写的是 192.168.30.10(私网),端口写的是 80(真实的服务器端口),既不是外网用户访问的 203.0.113.10,也不是 8080。这就是 26.1.3 那句口诀的直接应用:目的 NAT 在策略之前,所以策略看到的是转换后的地址。
27.2.3 逐行讲解
| 命令 | 作用 | 新手常填错的地方 |
|---|---|---|
nat-policy → rule name SNAT_OFFICE |
建源 NAT 规则 | 只建规则不配 action nat,规则不起作用 |
source-zone trust / destination-zone untrust |
指定 NAT 生效的方向 | NAT 规则的方向与安全策略方向必须一致 |
source-address 192.168.10.0 24 |
指定要转换的源 | 写成公网地址,永远不匹配 |
action nat easy-ip |
用出接口地址做转换 | 写成不存在的地址池编号,规则失效 |
nat server ... global 203.0.113.10 8080 inside 192.168.30.10 80 |
端口映射 | global 和 inside 写反,映射方向颠倒 |
global current-interface |
用接口当前地址映射 | 以为它会动态变化,其实要配合接口地址动态获取才有意义 |
安全策略目的地址 = 192.168.30.10 32 |
用转换后地址匹配 | 写成 203.0.113.10,策略永不命中 |
三个需要展开的细节:
第一,NAT 策略与安全策略是两份独立的配置,必须都配。 很多人以为配了 NAT 策略就不用配安全策略了,其实两者是串联的:NAT 策略决定「怎么转换」,安全策略决定「让不让过」。只配 NAT 不配策略,报文照样被丢;只配策略不配 NAT,报文能出去但源地址还是私网,公网回不来。
第二,nat server 与「目的 NAT 策略」是两种实现方式。 nat server 是一行命令完成端口映射,最简单直接,适合「固定公网 IP → 固定服务器」这种一对一的场景。目的 NAT 策略(destination-nat)则可以做更复杂的条件匹配(比如根据源地址范围决定映射到哪台服务器)。初学者先掌握 nat server,够用。
第三,nat server 会自动生成 Server-map 表项,而 Easy IP 不会。 Server-map 是「预先写好的映射关系」,不依赖真实流量触发:
# 查看 Server-map 表项(配置 nat server 后自动生成)
display firewall server-map
对每一条 nat server,会生成两条 Server-map:正向(把公网目的地址转成私网目的地址,供外网访问时用)和反向(把服务器的私网源地址转成公网源地址,让服务器能主动出网)。反向条目的存在意味着:配了 nat server 后,服务器通常不需要再单独配源 NAT 就能上网——这是很多人不知道的一个便利。
27.2.4 黑洞路由:为什么必须配
当 NAT 地址池中的公网地址与出接口地址不在同一个网段时,必须配黑洞路由。原因是一个「路由环路」:
外网用户访问 NAT 地址池里的 203.0.114.100
→ 上游路由器查路由,把报文发给防火墙(因为路由器认为这个网段应该防火墙处理)
→ 防火墙收到,发现没有匹配的 Server-map(或连接已关闭)
→ 防火墙按默认路由,把报文又发回上游路由器
→ 上游路由器又发回来
→ 环路!报文在两台设备之间反复横跳,直到 TTL 耗尽
解决办法是告诉防火墙「这个地址就归我,别再往外发了」,把报文丢弃:
# 给 NAT 地址池专用网段配黑洞路由,防止路由环路
ip route-static 203.0.114.100 255.255.255.255 NULL0
还有一种情况:地址池地址与出接口同网段,不会产生环路,但公网大量访问会引发防火墙发大量 ARP 请求(因为防火墙会尝试解析这个地址的 MAC),消耗资源。这种情况配黑洞路由能省资源。判断标准简化成一句话:只要用了地址池,就配黑洞路由,不亏。
Easy IP 不需要黑洞路由,因为转换后的地址就是接口地址本身,本来就在接口上。
27.2.5 双向 NAT 与域内 NAT
双向 NAT 的典型场景是:外网用户访问内网服务器,但内网服务器所在网段与防火墙之间有额外的三层设备,需要同时修正源地址才能让回程正确。做法是把 nat server 与 nat inbound(入方向目的转换)或额外的源 NAT 规则组合。
一个更常见的场景叫域内 NAT(也叫 NAT hairpin / 内网用户用公网地址访问内网服务器):
内网 PC 192.168.10.100 → 访问 203.0.113.10:8080 → 期望访问 DMZ 的 192.168.30.10:80
问题在于:PC 发出的报文目的地址是 203.0.113.10,防火墙会认为是「要出去」,于是不做 Server-map 转换,报文直接出公网,绕一圈回来或者直接失败。
解决方法是配一条 trust → trust(同区域)的策略 + nat server 的 hairpin 支持:
# 域内 NAT:允许内网用户用公网地址访问内网服务器
security-policy
rule name TRUST_TO_TRUST_HAIRPIN
source-zone trust
destination-zone trust
source-address 192.168.10.0 24
destination-address 192.168.30.10 32
action permit
quit
quit
nat server HTTP protocol tcp global 203.0.113.10 8080 inside 192.168.30.10 80
核实结果:我在华为官方文档全文里检索 hairpin 相关命令,华为侧 0 命中——nat hairpin enable 是 H3C 的命令(H3C 官方 NAT 配置指导有原文),华为防火墙上没有这个开关。
华为侧实现「内网用户用公网地址访问内部服务器」依靠的是 Server-map 表 + 域内(trust → trust)安全策略,不需要额外开关:内网用户访问公网地址时,如果该地址存在 NAT Server 映射,防火墙按 Server-map 把它转换到私网服务器。所以华为侧只要配 nat server + 域内策略即可。
仍然推荐的做法是改 DNS:让内网用户直接解析到服务器私网地址,绕开这个问题。这比依赖 hairpin 行为更简单、也更可预测。
这个坑的价值在于: 很多企业在上线后才发现「外网能访问、内网反而访问不了这个网站」,然后怀疑是 NAT 配错了。实际上是「去程」和「回程」路径不一致导致的。改 DNS 让内网用户解析到私网地址,是比配 hairpin 更简单可靠的方案——能用 DNS 解决就别用 NAT 绕,这是运维的省事原则。
27.2.6 部署模式:路由模式 / 透明模式 / 混杂模式
防火墙的网络部署模式决定了「设备在网络里以什么身份存在」:
| 模式 | 工作原理 | 优点 | 缺点 | 适用 |
|---|---|---|---|---|
| 路由模式(三层) | 接口配 IP,做路由转发 | 功能完整(NAT/VPN 都能用) | 要改网络地址规划 | 绝大多数新部署 |
| 透明模式(二层) | 接口不配 IP,桥接转发 | 不需要改地址规划,插上就能用 | NAT、部分 VPN 受限 | 改造存量网络、不想动规划 |
| 混杂模式 | 部分接口路由、部分接口透明 | 灵活 | 配置复杂、排障难 | 特殊过渡场景 |
路由模式是默认模式,前面所有例子都是这个模式。
透明模式的价值一句话说清:「我不想改网络规划,只想在不影响任何人的前提下把一台防火墙塞进去」。这时防火墙的两个接口工作在二层,上下游设备在同一个网段,互相直接通信,防火墙像一根「带安检功能的网线」。
诚实说明核实结果:我用华为官方文档全文(含 USG6000E 维护宝典、AR 命令参考,共 2500 万字)检索 firewall mode 与 transparent 相关命令,没有找到部署模式切换的 CLI 命令原文。上一版我写的接口视图 firewall mode transparent 属于推测,已删除,不提供未经验证的命令。
已确认的事实:USG6000E 确实支持路由模式与透明模式两种部署(Web 界面的「网络 > 接口 > 模式」可以切换),但这部分在公开文档里主要是 Web 界面描述,CLI 命令需以具体版本的产品文档为准。实操建议:部署模式在设备初始化时按向导选择,运行中切换需按对应版本手册操作并做好配置备份——模式切换通常涉及配置清空或重启。
⚠ 待核实:待核实 USG6000E 部署模式切换的 CLI 命令(是否在接口视图
firewall mode/ 系统视图切换),以及运行中切换是否需要重启与配置备份,需查 USG6000E 具体版本产品文档
透明模式的几个硬性限制,必须提前知道,否则配到一半才发现不行:
- 透明模式下不能做 NAT(至少不能做常规的源/目的 NAT,因为地址空间没变)。因此「透明模式 + 内网出口上网」这个组合基本不成立。
- 透明模式下管理接口必须单独规划。业务口不配 IP,管理要靠独立的管理口或带外管理。
- 透明模式下部分 VPN 功能受限,IPSec 站点到站点通常仍可用,但 SSL VPN 这类「终结在设备上」的服务会受限。
- 透明模式对二层协议(STP、LLDP)有影响,设备可能会拦截或透传这些报文,需要确认。
混杂模式是「有的接口路由、有的接口透明」。它的存在是为了解决过渡期需求,但配置复杂度上升很多:同一台设备上两套转发平面并存,策略、路由、NAT 都要分情况考虑。如果不是明确需要,不要用混杂模式。
27.2.7 NAT ALG:为什么 FTP 和 SIP 会「配了 NAT 也不通」
NAT 的模型有个天然缺陷:它只改 IP 头里的地址,改不了应用层载荷里携带的地址。有些协议会把 IP 和端口写在数据包里(FTP 的 PORT/PASV 命令、SIP 的 SDP 体、RTSP 的 SETUP 报文),NAT 改了 IP 头,载荷里还是私网地址,对端就找不到人。
ALG(Application Level Gateway,应用层网关) 就是专门修这个问题的:它深入应用层,把载荷里的地址也一并改写。
# 查看当前 ALG 的使能状态
display nat alg
输出会列出 dns / ftp / rtsp / sip / pptp 等协议各自的 Enabled/Disabled 状态。默认不是全开的,具体开哪些以设备为准。
实际运维里,ALG 是一把双刃剑:
- 该开的时候不开:内网有个 FTP 服务器要通过端口映射对外提供下载,外网用户连得上控制连接但列不出目录(因为 PASV 返回的是私网地址)。这时候必须开 FTP ALG,或者在防火墙上用「固定端口范围 + 映射整个端口段」的方式绕开。
- 不该开的时候开了:某些版本的 ALG 有兼容性问题,开了反而导致 SIP 电话注册失败、FTP 传输卡死。遇到这类问题,经验做法是「先关 ALG,让终端改用加密/隧道协议」,而不是死磕 ALG。
判断方法:一个协议「控制连接能建立、但数据/媒体流不通」,就优先怀疑 ALG。这类问题的统一表现是「TCP 握手成功、登录成功、但传不了数据」,很容易被误判成带宽问题或服务器问题。
27.2.8 完整的验证流程
外网访问内网服务器的验证要四层做:
# 第1层:确认 NAT Server 配置存在且正确
display nat server
# 第2层:确认 Server-map 表项已生成(正向+反向)
display firewall server-map
# 第3层:从外网发起访问,同时在防火墙上看到会话
display firewall session table
# 第4层:确认策略命中
display security-policy rule name UNTRUST_TO_DMZ_WEB
第 2 层是最能定位问题的一层:display firewall server-map 里如果连正向条目都没有,说明 nat server 配置本身有问题(地址写错、冲突、或没生效);有 Server-map 但会话表里没会话,说明策略拦了;有会话但业务不通,说明服务器或回程路径有问题。这个「三层递进」的排障逻辑,比一上来就抓包高效得多。
27.3 H3C 设备配置详解
27.3.1 H3C 的 NAT 模型与关键词差异
H3C 的 NAT 配置挂在接口上,而不是像华为那样有独立的 nat-policy 视图。这是两家最根本的结构差异:
| 概念 | 华为 | H3C |
|---|---|---|
| 源 NAT 配置位置 | 独立 nat-policy 视图,按策略规则组织 |
接口视图下 nat outbound |
| 目的 NAT(Server) | nat server 系统视图下 |
接口视图下 nat server |
| ACS 匹配 | 策略里直接写区域和地址 | 用 ACL 指定地址范围,接口上引用 ACL |
| 按区域控制 | NAT 策略里写 source-zone |
不在 NAT 命令里写区域,由接口归属隐式决定 |
理解了这个差异,就理解了 H3C NAT 配置的全部逻辑:「在哪个接口上配置,就收哪个接口的流量」。在出外网的接口上配 nat outbound,就是「从这个接口出去的报文做源转换」;在这个接口上配 nat server,就是「从这个接口进来的报文做目的转换」。
27.3.2 完整配置模板(源 NAT + 内部服务器)
# 基础:接口、安全域、路由
system-view
sysname F1000-EGRESS
interface GigabitEthernet1/0/1
description TO-ISP
ip address 203.0.113.10 24
quit
interface GigabitEthernet1/0/3
description TO-OFFICE
ip address 192.168.10.1 24
quit
interface GigabitEthernet1/0/4
description TO-DMZ
ip address 192.168.30.1 24
quit
security-zone name trust
import interface GigabitEthernet1/0/3
quit
security-zone name untrust
import interface GigabitEthernet1/0/1
quit
security-zone name dmz
import interface GigabitEthernet1/0/4
quit
ip route-static 0.0.0.0 0 203.0.113.1
源 NAT 用 Easy IP,先建 ACL 圈定要转换的源网段,再在出接口上引用:
# 两条 ACL 分别圈定内网和 DMZ 的源网段
acl basic 2000
rule 5 permit source 192.168.10.0 0.0.0.255
quit
acl basic 2001
rule 5 permit source 192.168.30.0 0.0.0.255
quit
# 在出外网接口上配置 Easy IP(不跟地址池即使用接口地址)
interface GigabitEthernet1/0/1
nat outbound 2000
nat outbound 2001
quit
如果要使用地址池做 PAT,先建地址池再引用:
# PAT 方式:使用地址池中的公网地址 + 端口转换
nat address-group 1
address 203.0.113.20 203.0.113.30
quit
interface GigabitEthernet1/0/1
nat outbound 2000 address-group 1
quit
内部服务器(目的 NAT)同样配在外网接口上:
# 内部服务器:外网访问 203.0.113.10:8080 → 内网 192.168.30.10:80
interface GigabitEthernet1/0/1
nat server protocol tcp global 203.0.113.10 8080 inside 192.168.30.10 80
quit
如果公网地址是动态获取的,用 current-interface 代替具体地址:
# 用当前接口地址发布服务
interface GigabitEthernet1/0/1
nat server protocol tcp global current-interface 8080 inside 192.168.30.10 80
quit
安全策略部分与第 26 章一致,关键还是地址怎么写:
# 安全策略:源地址写转换前,目的地址写转换后
security-policy ip
rule name TRUST_TO_UNTRUST
source-zone trust
destination-zone untrust
source-ip-subnet 192.168.10.0 24
action pass
quit
rule name TRUST_TO_DMZ_WEB
source-zone trust
destination-zone dmz
source-ip-subnet 192.168.10.0 24
destination-ip-host 192.168.30.10
action pass
quit
rule name UNTRUST_TO_DMZ_WEB
source-zone untrust
destination-zone dmz
destination-ip-host 192.168.30.10
action pass
quit
quit
save force
27.3.3 逐行讲解与 H3C 特有陷阱
| 命令 | 作用 | 与华为差异 | 陷阱 |
|---|---|---|---|
nat outbound 2000 |
对匹配 ACL 的报文做源转换 | 华为在 nat-policy 视图 |
ACL 忘了建,或 ACL 反掩码写错 |
nat outbound 2000 address-group 1 |
PAT 方式转换 | 华为 action nat address-group |
地址池地址与接口不同网段,需配黑洞路由 |
nat outbound 2000 address-group 1 no-pat |
No-PAT | 华为地址池 + no-pat |
地址不够用会导致部分主机不通 |
nat server protocol tcp global ... inside ... |
内部服务器 | 华为 nat server name X ... |
在错误接口上配(必须在外网口的入口侧) |
nat inbound |
入方向动态转换(双向NAT用) | 华为用额外源 NAT 规则 | 单独用没意义,必须与 outbound/server 配合 |
H3C 特有的三个坑:
坑一:nat server 必须配在「报文进入的那个接口」上。 华为的 nat server 是系统视图下的全局配置,H3C 是接口级配置。外网报文从 GE1/0/1 进来,就必须在 GE1/0/1 上配 nat server。配在 GE1/0/4(DMZ 接口)上,外网访问完全不生效。
坑二:ACL 的匹配元素有限制。 H3C 官方明确说明:NAT 只关注 ACL 规则里的源 IP、源端口、目的 IP、目的端口、传输层协议、VPN 实例这几个元素,ACL 里写的其他条件(比如时间段、报文优先级)NAT 都不看。所以别指望用 ACL 做「工作日才做 NAT」这种时间控制。
坑三:双向 NAT 需要配路由。 如果用 nat inbound 或入方向静态转换,H3C 要求手工添加路由——目的地址为转换后的本端地址(local-ip 或 local-network),下一跳为静态转换后的外网地址。漏了这条路由,回程不通,而且现象很难定位。
27.3.4 H3C 的 NAT hairpin(内网访问内部服务器)
上一节说过「内网用公网地址访问内部服务器不通」是常见问题。华为要靠域内策略绕,H3C 有一个更直接的开关——nat hairpin:
# 在内网侧接口上开启 NAT hairpin,使内网用户能用公网地址访问内部服务器
interface GigabitEthernet1/0/3
nat hairpin enable
quit
它的原理是:内网用户的报文从 GE1/0/3 进来、目的地址是公网地址,防火墙不让它出去,而是「绕回去」按内部服务器的映射规则处理。
三个使用条件必须满足,缺一个都不生效:
- 必须与
nat server/nat outbound/nat static outbound配合,单独开 hairpin 没有任何意义; - 这些配置所在的接口必须在同一块接口板上,跨板不生效——这是硬件层面的限制,书上不会强调但现场必须知道;
- hairpin 开启后,安全策略的方向会变成「与内网同方向」,策略里要放行的是
trust → trust的流量,而不是trust → untrust。
第 2 条是最容易踩的坑:一台多业务板的 F1000,把 nat server 配在上方板卡的接口上、nat hairpin 开在下方板卡的接口上,配置看着全对,就是不生效,查文档最后才发现是硬件限制。
27.3.5 H3C 的热备份与 NAT 联动
在双机热备(第 28 章)环境下,NAT 配置需要注意:
- 双机场景下 NAT 地址池不能包含主机或备机的接口地址,否则上行设备请求该地址的 ARP 时,两台都会回应,造成 ARP 冲突。
- NAT 策略里的源/目的地址不能包含心跳接口地址,否则心跳报文会被 NAT 转换,导致心跳异常。
- Vrrp 联动:
nat server可以配置与 VRRP 联动(track vrrp参数),这样主备切换时,NAT Server 表项跟着虚拟路由器的状态走。这是 H3C 的一个细节能力,不配也能工作,但切换行为依赖上层设备的 ARP 更新。
# 内部服务器与 VRRP 联动,主备切换时表项状态跟随
interface GigabitEthernet1/0/1
nat server protocol tcp global 203.0.113.10 8080 inside 192.168.30.10 80 track vrrp 1
quit
⚠ 待核实:待核实
nat server的track vrrp virtual-router-id参数在 F1000 目标版本上的可用性与确切语法
27.4 华为 / H3C 命令对照表
| 功能 | 华为(USG6000E) | H3C(F1000 Comware V7) | 差异说明 |
|---|---|---|---|
| 建地址池 | nat address-group NAME / section 0 A B |
nat address-group 1 / address A B |
编号方式不同 |
| Easy IP | nat-policy → action nat easy-ip |
接口下 nat outbound ACL(不带地址池) |
H3C 在接口上配 |
| PAT 地址池转换 | action nat address-group NAME |
nat outbound ACL address-group 1 |
— |
| No-PAT | 地址池加 no-pat 模式 |
nat outbound ACL address-group 1 no-pat |
— |
| 目的 NAT / 端口映射 | nat server name X protocol tcp global G GP inside I IP |
nat server protocol tcp global G GP inside I IP |
华为可命名,H3C 不命名 |
| 用接口地址映射 | global current-interface PORT |
global current-interface PORT |
相同 |
| 双向 NAT | 额外源 NAT 规则 + nat server | nat inbound ACL address-group N |
H3C 有专门命令 |
| 内网访问内网服务器 | 需额外 hairpin 处理 | nat hairpin enable(内网口) |
H3C 有专门开关 |
| 查看 Server-map | display firewall server-map |
display nat server |
— |
| 查看 NAT 会话 | display firewall session table |
display nat session verbose |
— |
| 部署模式切换 | 主要走 Web 初始化向导(CLI 待核实) | 接口视图相关命令 | 两家的 CLI 命令均需按版本手册确认 |
27.5 配置验证
27.5.1 华为验证命令
第一组:源 NAT 是否生效。
# 查看 NAT 策略配置
display nat-policy
# 查看 NAT 会话(确认源地址被转换)
display firewall session table verbose
会话表的 NAT-Info 字段会显示转换前后的地址,这是最直接的证据。
第二组:目的 NAT 是否生效。
# 查看 NAT Server 配置
display nat server
# 查看 Server-map 表项(每个 nat server 生成正+反两条)
display firewall server-map
display firewall server-map 的输出里应该能看到类似这样的条目:
Type: Nat Server, ANY -> 203.0.113.10[8080] 192.168.30.10[80] Zone: ---
这条正向条目意味着:任何访问 203.0.113.10:8080 的流量都会被转换成 192.168.30.10:80。端口映射不生效时,第一件事就是看这条表项在不在。
第三组:端到端验证。
外网侧(用一台接入公网的测试机):
telnet 203.0.113.10 8080 → 能建立 TCP 连接说明映射+策略都通
curl http://203.0.113.10:8080/ → 能拿到网页内容说明应用层正常
内网侧:
ping 192.168.30.10 → 验证内网到 DMZ 的连通(与 NAT 无关)
27.5.2 H3C 验证命令
# 查看内部服务器映射表
display nat server
# 查看 NAT 会话(详细模式,能看到转换前后)
display nat session verbose
# 查看所有出方向地址转换配置
display nat outbound
display nat server 的输出里关键看两个字段:Config status: Active(配置是否激活)和 Global IP/port → Local IP/port(映射关系是否正确)。如果 Config status 显示 Inactive,说明映射未生效,通常是接口状态问题或地址冲突。
27.5.3 验证清单
| 序号 | 验证项 | 操作 | 期望 |
|---|---|---|---|
| 1 | 内网能上网 | 终端访问外网站点 | 成功 |
| 2 | 源 NAT 生效 | 查会话表看 NAT-Info | 源地址变成公网地址 |
| 3 | NAT Server 表项存在 | display nat server / display firewall server-map |
有正向条目 |
| 4 | 外网能访问服务器 | 外网 telnet 公网IP+映射端口 | 能建立连接 |
| 5 | 未映射端口被拒绝 | 外网访问未被映射的端口 | 超时或被拒 |
| 6 | 服务器能主动出网 | 服务器 PING 外网 | 通(依赖反向 Server-map) |
| 7 | 黑洞路由存在 | display ip routing-table |
地址池网段有 NULL0 路由 |
第 5 项是一个安全验证:确认你没有把不该开放的端口也开放出去。很多事故是因为配 nat server 时图省事用了全端口映射(直接映射整台服务器的所有端口),结果服务器的管理口、RDP、数据库全暴露在公网。
27.6 排错与故障树
27.6.1 主故障树:外网访问不了内网服务器
这是 NAT 场景里最高频的问题。按顺序查,不要跳步:
| 顺序 | 检查项 | 华为命令 | 判断依据 |
|---|---|---|---|
| 1 | 物理与路由可达 | display ip routing-table |
去程有默认路由,回程有到内网的路由 |
| 2 | nat server 配置是否存在 |
display nat server |
Global 和 Inside 地址端口都正确 |
| 3 | Server-map 表项是否生成 | display firewall server-map |
有正向条目 |
| 4 | 安全策略是否正确 | display security-policy rule name X |
目的地址是否写了转换后的私网地址 |
| 5 | 策略命中计数 | display security-policy statistics |
是否有增长 |
| 6 | 会话表是否有会话 | display firewall session table |
有会话说明策略已过 |
| 7 | 服务器自身 | 服务器上 ss/netstat |
服务是否真的在监听 80 |
| 8 | 服务器回程 | 服务器 ip route |
默认网关是否指向防火墙 |
第 4 步是最容易出错的一步。 我见过最多的场景是:策略配了,方向对,服务对,但目的地址写的是公网地址,于是永远不命中——而 display security-policy 看起来一切正常,只有查命中计数才能发现问题。
27.6.2 症状对照表
| 症状 | 最可能原因 | 排查命令 | 解决 |
|---|---|---|---|
| 内网能上网,外网访问不了服务器 | 缺 untrust→dmz 策略 |
display security-policy |
补策略 |
| 策略看似配了但没命中 | 目的地址写了公网地址 | display security-policy statistics |
改成转换后私网地址 |
display nat server 显示配置存在但外网不通 |
nat server 配错接口(H3C) |
display nat server |
移到外网接口上 |
| Server-map 无正向条目 | nat server 地址与接口冲突 |
display firewall server-map |
换一个未被占用的公网地址 |
| 有会话但业务不通 | 服务器未监听/回程网关错 | 服务器侧检查 | 修服务器 |
| 服务器能收包但回不来 | 服务器网关不是防火墙地址 | 服务器 ip route |
改网关 |
| Easy IP 配了但内网不通外网 | NAT 策略与安全策略方向不一致 | 两者对比 | 统一方向 |
| 地址池场景偶发不通 | 缺黑洞路由导致环路 | display ip routing-table |
配 NULL0 路由 |
| 内网用公网地址访问内网服务器不通 | 缺 hairpin / 域内策略 | display firewall session table |
配 hairpin 或改 DNS |
| 双机切换后 NAT 失效 | 地址池含接口地址、端口冲突 | 检查地址池与 hrp nat resource |
调整地址池与端口分段 |
27.6.3 一个真实的排错案例
现象:外网可以访问 DMZ 的 Web 服务器(203.0.113.10:8080),业务正常。但一周后运维加了「只允许特定外网 IP 访问」的需求,加了一条策略:源 198.51.100.0/24 → 目的 203.0.113.10 → 放行 8080。结果所有人都访问不了了。
排查过程:
display nat server正常,映射还在;display firewall server-map正向条目还在;display security-policy statistics看新加的策略命中数一直是 0;- 再看原来那条
UNTRUST_TO_DMZ_WEB(目的192.168.30.10,端口 80)——已经被人删掉了。运维以为是「改造」,就把旧策略删了。
根本原因:新策略的目的地址写了公网地址 203.0.113.10、端口写了 8080,这在防火墙看来是「访问防火墙自己」,属于 untrust → local,而不是 untrust → dmz。而真正的 untrust → dmz 策略已经被删。
正确的写法:
# 加了源地址限制后,目的地址仍是转换后的私网地址与端口
security-policy
rule name UNTRUST_TO_DMZ_WEB
source-zone untrust
destination-zone dmz
source-address 198.51.100.0 24
destination-address 192.168.30.10 32
service http
action permit
quit
quit
这个案例的教训非常典型:在这台防火墙上,公网地址只存在于 NAT 配置里,策略里永远写私网地址。 把这句话写在交接文档的第一行,能省掉 80% 的 NAT 排障时间。
第二个案例:NAT 后网速「慢得莫名其妙」
现象:内网上网正常,但访问某些网站特别慢,其他网站很快;FTP 下载能连上但极慢。
排查过程:
- 直接 PING 外网 DNS,延迟正常,说明链路没问题;
- 查会话表,看到大量会话的状态是
ESTABLISHED,但流量计数很低——说明连上了不传数据; - 逐步缩小范围:换一台不做 NAT 的测试主机(直接用路由器拨号),访问同样网站很快;
- 对比配置,发现防火墙上 NAT 策略里用的是地址池 No-PAT 方式,而地址池只配了 2 个地址、内网有 300 台终端;
- 根因:No-PAT 不换端口,内网 300 个源 IP 抢 2 个公网地址,实际只有 2 台主机能同时上网,其余全部无连接可用。会话表看起来很多,但真正转发成功的只有两条。
解决:改成 Easy IP(多对一 PAT,靠端口区分,理论上可支持数万并发)。
这个案例的教训是:选 NAT 方式不是「配法不同」,而是「容量模型不同」。 No-PAT 的容量 = 地址池大小(单位:台主机);NAPT/Easy IP 的容量 = 地址池大小 × 端口数(单位:会话)。前者几十,后者几万。用 No-PAT 去满足几百台终端的上网需求,等于用直升机的载客量去跑公交线路。
第三个案例:换了运营商之后全网慢,只有重连才恢复
现象:运营商线路升级,公网地址从 203.0.113.0/24 段换到 198.51.100.0/24 段,接口地址改了,但内网上网时好时坏。
原因:内网终端的 DNS 还缓存着旧解析结果?不是。真正原因是 nat server 里用的是 global 203.0.113.10 8080 ... 这种写死的地址——地址段换了,这些映射全部失效,而且由于是写死的旧地址,Server-map 表项还挂着,让人误以为配置还在。同时地址池也是写死的旧网段,Easy IP 却不受影响,所以「部分通部分不通」。
解决:涉及接口地址的地方,动态线路用 current-interface 代替写死的地址;地址池要跟着更新。
教训:凡是写死公网地址的地方,换运营商时必须逐个排查。 建议在配置时用注释标出「这里是公网地址,换线时必改」,比事后回忆靠谱。
27.7 新手踩坑与注意事项
- 安全策略的目的地址写成公网地址——NAT Server 场景下,策略永不命中。这是本章第一大坑。
- 安全策略的源地址写成公网地址——源 NAT 场景下同理,必须写转换前的私网地址。
- 只配 NAT 策略、不配安全策略——两者是串联关系,必须都配。
- H3C 上
nat server配错接口——必须配在「外网报文进入的那个接口」上。 - 用了地址池却不配黑洞路由——公网访问地址池中的未使用地址会造成路由环路,把上行设备 CPU 打高。
- No-PAT 没算够地址——No-PAT 是「不换端口」,每个内网地址必须独占一个公网地址,地址不够时部分主机直接不通,且现象随机。
- 端口映射用了整机映射——把所有端口都映射出去,等于把服务器直接暴露在公网,管理口、数据库端口全部可达,是典型的安全事故源。
- 改完 NAT 不清会话——旧会话继续按旧映射转发,出现「改了没效果」的假象。
- 内网用公网地址访问内部服务器不通——优先改 DNS 让内网解析到私网地址,比配 hairpin 简单且可靠。
- 透明模式下还想做 NAT——透明模式地址空间不变,做不了常规 NAT。选模式前先明确需求。
- Easy IP 时代还在维护地址池——只有一个公网地址时,用
easy-ip最省事,别为了「规范」去配地址池,多出来的黑洞路由、ARP 冲突都是额外风险。 - 双机环境下 NAT 地址池包含设备接口地址——主备设备都会回应 ARP,造成地址冲突,切换时业务异常。
27.8 本章小结
27.8.1 要点清单
- NAT 是防火墙的「前台」:源 NAT 改寄件人,目的 NAT(NAT Server)改收件人。
- 口诀:目的地址看转换后,源地址看转换前。
- 处理顺序:收包 → 目的 NAT → 安全策略 → 源 NAT → 发出。
- NAT Server 场景:安全策略目的地址写私网真实地址与端口。
- 源 NAT 场景:安全策略源地址写转换前的私网地址。
- NAT 策略与安全策略是串联关系,两者都要配、方向要一致。
- 源 NAT 首选 Easy IP(不占地址池、不需黑洞路由、自动跟随接口地址)。
- 用了地址池必配黑洞路由,防止路由环路。
nat server自动生成 Server-map 正向 + 反向条目;反向条目让服务器可主动出网。- H3C 的 NAT 配在接口上,华为配在独立策略视图里,这是两家最大的结构差异。
- 部署模式:路由模式功能全、透明模式免改规划但做不了 NAT、混杂模式灵活但复杂。
27.8.2 自测题
- 防火墙处理报文的顺序是「目的NAT → 安全策略 → 源NAT」,那么 NAT Server 场景下,安全策略里的目的地址该写公网地址还是私网地址?为什么?
- 为什么用了 NAT 地址池就必须配黑洞路由?不配会出现什么现象?
- H3C 上外网侧接口是
GE1/0/1,nat server应该配在哪个接口上?配错了会怎样? - 内网用户用公网地址访问内部服务器不通,两种解决思路分别是什么?
- 什么情况下选透明模式部署?透明模式下能做 NAT 吗?
- 写私网地址(转换后的地址),且端口写真实服务器端口。因为目的 NAT 在安全策略之前执行,报文到达策略匹配环节时目的地址已经被转换为私网地址与端口了。
- 地址池中的地址与出接口不同网段时,公网访问这些地址的报文会在防火墙与上行设备之间反复转发形成环路,直到 TTL 耗尽,同时消耗设备 CPU。配
ip route-static X 255.255.255.255 NULL0让防火墙直接丢弃。 - 配在外网侧
GE1/0/1上。H3C 的nat server是接口级配置,定义「从这个接口进来的报文做什么目的转换」。配在 DMZ 接口上,外网访问完全不生效。 - ①配域内 NAT(hairpin)策略,让内网访问公网地址时也走 Server-map 转换;②改内网 DNS,让内网用户解析到服务器的私网地址(推荐,更简单可靠)。
- 现有网络不便改动地址规划、只想在不影响任何人的前提下串入一台防火墙时选透明模式。透明模式下地址空间不变,不能做常规源/目的 NAT。
关于本书:《华为 / H3C 网络设备典型功能配置详解》—— 面向国内高校/企业网络环境, 华为 VRP 与 H3C Comware 双厂商并排配置的实操教材,共 43 章。 全书所有命令尽量有官方出处,查不到的显式标注「待核实」。 返回系列目录
本人保留对侵权者及其全家发动因果律武器的权利
版权提醒
如无特殊申明,本站所有文章均是本人原创。转载请务必附上原文链接:https://www.elliot98.top/post/huawei-h3c-book/27/。
如有其它需要,请邮件联系!版权所有,违者必究!