锐捷路由器 NAT 转换配置笔记
本文最后更新于 2026年4月10日 上午
锐捷路由器 NAT 转换配置笔记
一、NAT 概述
NAT(Network Address Translation,网络地址转换) 是一种在 IP 数据包经过路由器时,动态或静态地修改其 IP 地址(及端口)的技术。其核心目的是解决 IPv4 地址不足的问题,同时实现内网与公网之间的受控互访。
NAT 在网络层(Layer 3)运行,通过在接口上维护一张会话转换表,记录每个连接的地址映射关系。路由器根据报文的来源接口和 NAT 规则,在转发时自动替换源地址或目的地址,回程流量则通过查询会话表自动完成反向还原。
NAT 在工程实践中主要解决两类需求:
| 需求 | 技术手段 | 对应命令 |
|---|---|---|
| 内网访问公网(SNAT / PAT) | 出站时将源地址从私网 IP 替换为公网 IP,回程自动还原;多个内网主机通过端口复用共享少数公网 IP | ip nat inside source list ... overload |
| 公网访问内网服务(DNAT) | 入站时将目的地址从公网 IP 还原为内网 IP,回程自动还原;支持端口级映射和 1:1 暴露 | ip nat inside source static tcp ... |
NAT 本身不是安全机制。它隐藏了内网拓扑,但不提供认证或加密能力。网络安全应由防火墙、ACL 等独立手段保障。
二、NAT 核心概念
2.1 两个前提:接口角色标记
所有 NAT 规则在生效前,必须先告诉路由器哪个接口是”内侧”、哪个是”外侧”:
1 | |
ip nat inside:接内网的接口(连接私网地址)ip nat outside:接外网的接口(连接公网 / 上游网络)
2.2 四元地址模型
NAT 转换过程中涉及四个地址角色,理解它们是读懂 NAT 表和排错的基础:
1 | |
| 角色 | 含义 | 通俗理解 |
|---|---|---|
| Inside Local | 内网设备的真实 IP 地址 | 你的”身份证上的名字” |
| Inside Global | 内网设备对外呈现的公网 IP | 你对外出示的”名片” |
| Outside Global | 外网设备的真实 IP 地址 | 对方的”身份证上的名字” |
| Outside Local | 外网设备在内网侧被看到的地址 | 对方在你眼中的”化名”(仅在 outside source NAT 中非空) |
初学者最容易搞混的点:
Inside Local和Inside Global指的是同一个内网设备,只是”在家”和”出门”用了不同身份。Outside Local和Outside Global指的是同一个外网设备,同理。- 在最常见的 PAT 场景(上网)中,
Outside Local == Outside Global(外网地址不需要伪装),所以 NAT 表中这两列看起来一样,这是正常的。
2.3 NAT 的本质:建立映射,双向自动生效
NAT 配置做的所有事情可以归结为一件事:在四元地址模型中建立映射关系。映射一旦建立,路由器根据报文的来向自动决定如何应用:
1 | |
1 | |
关键理解:SNAT 和 DNAT 不是两种不同的技术,是同一个映射在两个方向上的自动表现。你不需要配两条规则,也不需要告诉路由器”这是 SNAT 还是 DNAT”——你只管建映射,路由器根据报文从哪个接口进来自动判断该改源还是改目的。
这也是为什么”端口映射”(发布内网 Web 服务)用的也是 ip nat inside source static tcp——你配的是映射,路由器自动处理双向:
1 | |
但存在一个区别:映射何时建立?
- 静态 NAT(如
inside source static):映射提前写好,永久存在,外网可以随时主动发起访问。- 动态 NAT(如
inside source list ... overload):映射在流量触发时才临时创建,用完释放。外网无法主动发起——因为还没有表项可匹配。
2.4 NAT 的三种基础类型
| 类型 | 映射关系 | 特点 | 典型场景 |
|---|---|---|---|
| Static NAT | 固定 1:1 | 一个内网 IP 永久绑定一个公网 IP | 服务器需要固定公网身份 |
| Dynamic NAT | 动态 n:1(不复用端口) | 从地址池中临时分配,会话结束释放 | 很少使用 |
| PAT(Port Address Translation) | 动态 n:1(复用端口) | 多个内网 IP 共享一个公网 IP,靠端口区分 | 内网用户上网(最常用) |
三、NAT 命令分类体系
3.1 命令结构解析
所有 ip nat 命令由以下部分组成:
1 | |
| 组成部分 | 含义 | 取值 | 通俗理解 |
|---|---|---|---|
| 地址对 | 映射作用于哪一侧的地址对 | inside / outside |
“你要定义的是内网设备的身份,还是外网设备的身份?” |
| 锚点 | 映射以报文的哪个字段为依据建立 | source / destination |
“这条映射绑定的是’谁发起的’,还是’去哪的’?” |
| 映射类型 | 映射是永久的还是临时分配的 | static / list ... overload / list ... pool |
“这个身份是固定的还是临时分配的?” |
| 映射参数 | 映射的具体地址值 | IP 地址、端口、ACL、地址池名 | “具体是谁映射到谁?” |
inside / outside:操作哪对地址
回到 2.2 节的四元地址模型,NAT 涉及两对地址:
1 | |
inside= 操作 Inside 地址对(Inside Local ↔ Inside Global)outside= 操作 Outside 地址对(Outside Global ↔ Outside Local)
inside/outside不是流量方向,而是告诉路由器”你要操作的是哪对地址”。命令里写inside还是outside,取决于你想建立映射的那两个地址分别属于内网侧还是外网侧。
source / destination:以什么为锚点建立映射
“锚点”决定了路由器用报文的哪个字段去查找/匹配映射:
1 | |
路由器不可能猜你要以哪个字段为依据,所以必须显式指定。
但要注意:如 2.3 节所述,
ip nat inside source static建立的映射是双向的——内→外方向以源地址为锚点做源地址转换(SNAT),外→内方向自动以目的地址为锚点做目的地址转换(DNAT),不需要你分别指定。source/destination在这里更多是语义标签,标明”这个映射定义的是谁的身份”,而不是限定只能改某个方向。
3.2 四类 NAT 行为(按场景分类)
从实际使用场景出发,所有 NAT 行为可以归为四类。注意:有些命令是双向的,会同时出现在两类中。
1 | |
① 内→外 源地址转换(SNAT):隐藏内网身份
场景:内网主机访问外网时,把源地址从私网 IP 改为公网 IP,让回包能路由回来。这是最常见的 NAT 类型。
| 方式 | 命令 | 频率 | 说明 |
|---|---|---|---|
| 动态 PAT(接口 IP) | ip nat inside source list {ACL} interface {出接口} overload |
★★★★★ | 多用户共享出接口公网 IP 上网,靠端口区分不同主机 |
| 动态 PAT(地址池) | ip nat inside source list {ACL} pool {池名} overload |
★★★★☆ | 拥有多个公网 IP 时,从地址池中选 IP 做端口复用 |
| 静态 1:1 | ip nat inside source static {内IP} {公IP} |
★★★★☆ | 内网 IP 永久绑定一个公网 IP |
| 可扩展静态 | ip nat inside source static {内IP} {公IP} extendable |
★★☆☆☆ | 同一内网 IP 映射多个公网 IP 或多个端口组合 |
配置示例:
1 | |
② 外→内 源地址转换:隐藏外网来者身份
场景:外网流量进入内网时,把源地址改掉,让内网服务器看到的是一个”假地址”而不是对方的真实 IP。
| 方式 | 命令 | 频率 | 说明 |
|---|---|---|---|
| 静态 | ip nat outside source static {外真IP} {外假IP} |
★★★☆☆ | 外网真实 IP 固定映射为一个内网可达的假地址 |
| 动态 | ip nat outside source list {ACL} pool {池名} |
★☆☆☆☆ | 从地址池动态分配假地址,极罕见 |
配置示例:
1 | |
这条命令为什么让人困惑? 命令名是
outside source(”外网源”),容易理解为”外→内方向改源地址”,这没错。但它其实也是双向的:
- 外→内方向:入包源地址
100.1.1.1→172.16.10.168(内网服务器看到的是假地址)- 内→外方向:内网主机访问
172.16.10.168时,目的地址被改为100.1.1.1转发出去所以它同时属于② 外→内 源地址转换和③ 内→外 目标地址转换,是一条命令的两种表现。
③ 内→外 目标地址转换:改写内网用户的访问目标
场景:内网主机访问某个地址时,路由器把目的地址改为另一个地址——内网用户无感知,以为在访问原始目标。
| 方式 | 命令 | 频率 | 说明 |
|---|---|---|---|
| outside source static(双向表现) | ip nat outside source static {外真IP} {外假IP} |
★★★☆☆ | 内网访问假地址 → 路由器改为真地址转发(详见②的说明) |
| outside source 动态 | ip nat outside source list {ACL} pool {池名} |
★☆☆☆☆ | 动态版本,极罕见 |
| 策略式重定向 | ip nat application source list {ACL} destination {原始IP} dest-change {新IP} |
★★☆☆☆ | 基于 ACL + 目标 IP 的透明重定向(NAT 特殊应用,非标准 NAT) |
配置示例:
1 | |
方式一 vs 方式二的区别:
outside source static:在 NAT 四元地址模型中建立 Outside Global ↔ Outside Local 的映射,双向生效,会影响 NAT 表dest-change:只做 IP 头部的目的地址替换,是策略性的单次改写,不建立 NAT 映射关系简单场景用
outside source static,需要 ACL 精细匹配时用dest-change。
④ 外→内 目标地址转换(DNAT):发布内网服务
场景:公网用户访问公网 IP 的某端口时,路由器把目的地址改为内网服务器的地址,将流量引导到内网。
| 方式 | 命令 | 频率 | 说明 |
|---|---|---|---|
| 端口映射 | ip nat inside source static tcp/udp {内IP} {端口} {公IP} {公端口} [permit-inside] |
★★★★★ | 最常用:把公网 IP 的指定端口映射到内网服务器的指定端口 |
| 静态 1:1 | ip nat inside source static {内IP} {公IP} |
★★★★☆ | 整台服务器所有端口暴露(⚠ 安全风险高) |
| 负载均衡(轮询) | ip nat inside destination list {ACL} pool {池名} type rotary |
★★☆☆☆ | 一个公网 IP 轮询分发到多台内网服务器 |
配置示例:
1 | |
关于
permit-inside(Hairpin NAT):端口映射默认只处理从外网(outside 接口)进来的流量。如果内网用户也想通过公网 IP
100.1.1.1:80访问自己的服务器:
- 不加
permit-inside:流量走路由查表 →100.1.1.1是本设备公网 IP,路由可能指向外网 → 绕一圈回来,或者直接失败- 加了
permit-inside:路由器发现”这个公网 IP 映射的就是内网自己”,直接在内部完成目的地址转换,把流量转到192.168.1.100:80,不绕外网
为什么端口映射用的也是
inside source static?因为
inside source static建立的是一条静态的、永久的映射关系,它天然双向生效:
- 内→外方向表现:源地址转换(SNAT)→ 归入第①类
- 外→内方向表现:目的地址转换(DNAT)→ 归入第④类
命令名里的
source指的是”定义的是 inside source(内网源地址)的映射”,不是说它只改源地址。一条命令,两个场景,这是 NAT 命令体系最容易让人绕进去的地方。
命令交叉关系总览
由于 NAT 的双向性,部分命令同时服务于多个场景类别:
| 命令 | ① SNAT (内→外源) |
② 源伪装 (外→内源) |
③ 目标重定向 (内→外目的) |
④ DNAT (外→内目的) |
|---|---|---|---|---|
ip nat inside source static {内IP} {公IP} |
主场景 | 双向 | ||
ip nat inside source static tcp ... |
主场景 | |||
ip nat inside source list ... overload |
主场景 | |||
ip nat outside source static |
主场景 | 双向 | ||
ip nat outside source list ... pool |
主场景 | 双向 | ||
ip nat inside destination list ... pool |
主场景 | |||
ip nat application ... dest-change |
主场景 |
使用建议:实际配置时,先问自己两个问题——“流量从哪来?”、”要改源还是目的?”——然后直接定位到对应类别查找命令。不需要先理解命令语法,按场景查表即可。
3.3 按需求速查命令
| 我要做什么 | 对应类别 | 用什么命令 |
|---|---|---|
| 多个内网用户共享公网 IP 上网 | ① SNAT | ip nat inside source list {ACL} interface {出接口} overload |
| 多公网 IP 做端口复用 | ① SNAT | ip nat inside source list {ACL} pool {池名} overload |
| 给一台内网设备固定公网身份 | ① SNAT | ip nat inside source static {内IP} {公IP} |
| 同一内网 IP 映射多个公网 IP/端口 | ① SNAT | ip nat inside source static {内IP} {公IP} extendable |
| 外网访问时隐藏对方真实 IP | ② 源伪装 | ip nat outside source static {外真IP} {外假IP} |
| 内网访问假地址→实际访问真地址 | ③ 目标重定向 | ip nat outside source static {外真IP} {外假IP} |
| 透明重定向(ACL 精细匹配) | ③ 目标重定向 | ip nat application source list {ACL} destination {原始IP} dest-change {新IP} |
| 发布内网服务的某个端口 | ④ DNAT | ip nat inside source static tcp {内IP} {内端口} {公IP} {公端口} permit-inside |
| 整台服务器公网暴露 | ④ DNAT | ip nat inside source static {内IP} {公IP} |
| 多台服务器轮询负载均衡 | ④ DNAT | ip nat inside destination list {ACL} pool {池名} type rotary |
四、NAT 执行流程
4.1 Inside → Outside(内网访问外网)
以 PAT 为例:内网主机 192.168.1.100:50000 访问 8.8.8.8:80。
① 报文进入 inside 接口。路由器收到报文,源地址 192.168.1.100:50000,目的地址 8.8.8.8:80。
② 匹配 NAT ACL。路由器检查该报文是否命中 NAT 规则关联的 ACL。未命中则正常路由转发,不做转换;命中则继续下一步。ACL 决定”哪些流量要做 NAT”,与出接口无关。
③ 查路由表,确定出接口。此时目的地址仍是原始的 8.8.8.8,路由器根据目的地址查路由表,确定报文应从哪个 outside 接口发出。
④ 在出接口执行 NAT 转换(路由后 NAT)。源地址 192.168.1.100:50000 被替换为出接口的公网 IP 100.1.1.1:20001(PAT 自动分配端口),目的地址不变。
⑤ 写入 NAT 表,转发报文。映射关系写入 NAT 表(双向),报文以 src=100.1.1.1:20001 dst=8.8.8.8:80 转发至外网。
关键:NAT 发生在路由之后(post-routing)——先确定出接口,再在出接口上做源地址转换。出接口决定”用哪个公网 IP”,ACL 决定”哪些流量做 NAT”。
4.2 Outside → Inside(外网访问内网)
以端口映射为例:外网主机 8.8.8.8:40000 访问公网 IP 100.1.1.1:80,映射到内网 192.168.1.100:80。
① 报文进入 outside 接口。路由器收到报文,源地址 8.8.8.8:40000,目的地址 100.1.1.1:80。
② 查 NAT 表。路由器检查是否存在匹配的会话表项或静态映射。命中已有会话则直接按表项反向转换;未命中则检查静态 NAT 规则(如 inside source static);均未命中则丢弃或按路由正常转发。
③ 执行 NAT 转换,还原目的地址(路由前 NAT)。目的地址 100.1.1.1:80 被替换为 192.168.1.100:80。必须先做这一步——因为 100.1.1.1 是公网映射地址,本地路由表中通常没有到它的路由条目,只有还原为内网真实 IP 后才能查表转发。
④ 查路由表,确定内网出接口。此时目的地址已变为 192.168.1.100,路由器根据该地址查路由表,确定应从哪个 inside 接口转发。
⑤ 转发至内网服务器。报文以 src=8.8.8.8:40000 dst=192.168.1.100:80 从 inside 接口发出,到达内网服务器。
关键:NAT 发生在路由之前(pre-routing)——必须先还原目的地址,才能根据内网真实 IP 查路由表。静态 NAT 的表项永久存在,外网可随时主动发起;动态 NAT 的表项仅在内部主动发起的会话期间存在,外网无法主动发起。
4.3 两个方向的执行时机对比
| 维度 | Inside → Outside | Outside → Inside |
|---|---|---|
| NAT 时机 | 路由后(post-routing) | 路由前(pre-routing) |
| 修改内容 | 源地址(inside local → inside global) |
目的地址(inside global → inside local) |
| 匹配依据 | ACL 规则 | NAT 表(会话表 / 静态表) |
| 回程处理 | 查 NAT 表自动反向转换 | 查 NAT 表自动反向转换 |
记忆口诀:出站先路由后改源,入站先改目的后路由。
五、标准配置模板
5.1 接口角色定义(所有 NAT 的前提)
1 | |
5.2 内→外 PAT:多用户共享公网 IP 上网(最常用)
1 | |
工作原理:所有
192.168.1.0/24的主机发出的流量,源地址被替换为GigabitEthernet 0/2接口的公网 IP,不同主机靠端口号区分。路由器自动管理端口分配和 NAT 表。
5.3 内→外 PAT:使用地址池(多公网 IP)
1 | |
与 5.2 的区别:5.2 只用一个接口 IP,5.3 从地址池中选 IP 做端口复用。适合拥有多个公网 IP 的场景。
5.4 外→内 端口映射:发布内网 Web 服务
1 | |
为什么端口映射也用
inside source static? 因为它建立的是静态映射,天然双向生效——原理见 2.3 节和 3.2④ 节。
5.5 外→内 静态 1:1:整台服务器暴露
1 | |
5.6 外→内 源地址伪装:隐藏外网设备的真实 IP
1 | |
注意:配置
outside source后,内网主机要访问172.16.10.168(假地址),而不是100.1.1.1(真地址)。路由器会自动把目的地址172.16.10.168翻译为100.1.1.1转发出去。同时还需要确保路由可达——内网要有到达172.16.10.168的路由(通常指向本路由器)。
5.7 负载均衡:轮询分发到多台服务器
1 | |
工作原理:所有访问
100.1.1.1:80的流量,路由器按轮询方式分发到192.168.1.10、192.168.1.11、192.168.1.12。
5.8 扩展 ACL 编写规范
1 | |
关于 ACL 序号:
- 扩展 ACL(无论命名型还是编号型)的每条规则都建议显式指定序号(如
10、20、30)。- 序号决定匹配顺序——从小到大依次匹配,命中即停。
- 默认步长是 10,方便中间插入新规则(如插入
15 permit ...)。- 如果不写序号,设备会自动分配(通常从 10 开始),但可读性差,不推荐。
六、NAT 表解读
6.1 查看命令
1 | |
6.2 输出示例与字段含义
1 | |
在”内→外 PAT 上网”场景中,每列的含义:
| 字段 | 含义 | 在本例中的值 | 说明 |
|---|---|---|---|
Inside local |
内网主机的真实地址+端口 | 192.168.1.2:50000 |
这是数据包的原始源地址 |
Inside global |
路由器替换后的公网地址+端口 | 100.1.1.1:20001 |
源地址被改成了这个 |
Outside global |
外网目标的真实地址+端口 | 8.8.8.8:80 |
这是原始目的地址,没变 |
Outside local |
外网目标在内网侧的地址 | 8.8.8.8:80 |
普通 PAT 中 = Outside global |
为什么 Outside local == Outside global? 因为普通上网场景不需要修改外网地址。只有配置了
outside sourceNAT 时,这两列才会不同。
6.3 不同场景下 NAT 表的特征
| 场景 | NAT 表特征 |
|---|---|
| PAT 上网 | Inside global 列出现公网 IP + 递增端口号;Outside 两列相同 |
| 静态 1:1 | Inside local ↔ Inside global 固定对应,无端口(或端口不变) |
| 端口映射 | 表项中公网 IP 的端口与内网 IP 的端口可能不同(如 80 → 8080) |
| outside source | Outside local ≠ Outside global(外网地址被伪装) |
6.4 NAT 表能说明什么、不能说明什么
| NAT 表 能 告诉你 | NAT 表 不能 告诉你 |
|---|---|
| 已有流量成功建立了 NAT 会话 | NAT 规则配置是否完全正确 |
| 当前每个会话的地址映射关系 | 新来的流量能否被正确匹配 |
| 会话使用的协议和端口 | 回程路由是否存在 |
| 会话何时建立(有助于判断时序) | 防火墙 / ACL 是否在其他环节拦截了流量 |
核心认知:NAT 表是”会话记录本”,不是”规则检查报告”。
- 有表项 ≠ 配置没问题(可能是恰好匹配了一条错误的规则)
- 无表项 ≠ 配置有问题(可能是还没有流量触发,或者 ACL 不匹配,或者接口角色没配)
七、排障与常见问题
7.1 标准排障流程
flowchart TD
Start["通信异常"] --> S1{"① 查 NAT 表<br>show ip nat translations"}
S1 -->|"有相关表项"| S2{"② 查路由表<br>show ip route"}
S1 -->|"无表项"| F1["检查:<br>1. ACL 是否匹配该流量<br>2. 接口 ip nat inside/outside 是否正确<br>3. 是否有流量经过(触发条件满足了吗)<br>4. ACL 命中计数是否增长"]
S2 -->|"路由正确"| S3{"③ 抓包分析<br>(确认报文实际内容)"}
S2 -->|"路由缺失/错误"| F2["添加正确路由<br>确保:内网→inside local 有路<br>上游网络→inside global 有回程路由"]
S3 --> F3["检查应用层 / 防火墙 / ALG"]
| 步骤 | 命令 | 判断要点 |
|---|---|---|
| ① 查 NAT 表 | show ip nat translations | include <IP> |
有表项→转换已发生,转查路由;无表项→检查 ACL / 接口角色 / 流量 |
| ② 查路由表 | show ip route <目的地址> |
确保 inside local(内网地址)和 outside global(上游可达)都有路由 |
| ③ 查接口角色 | show run interface X |
确认 ip nat inside / ip nat outside 在正确接口上 |
| ④ 查 ACL 命中 | show access-lists <ACL名> |
匹配计数是否增长——没增长说明流量根本没进 ACL |
| ⑤ 抓包 | debug ip nat 或端口镜像 |
生产环境慎用 debug,建议用端口镜像 |
关于 debug 的安全使用:
1
2
3
4terminal monitor ! 先开启终端显示(SSH/Telnet 必需)
debug ip nat ! 开启 NAT 调试
! ... 观察输出 ...
undebug all ! 用完立即关闭,不要留在后台生产环境建议用
terminal length 0+ 限时观察后立即undebug all,避免大量输出导致设备 CPU 过载。
7.2 常见易错点
| 易错点 | 表现 | 原因与正确做法 |
|---|---|---|
| 接口 inside/outside 写反 | NAT 完全不生效 | ip nat inside 必须配在接内网的接口,ip nat outside 必须配在接外网的接口 |
permit-inside 缺失 |
内网用户无法通过公网 IP 访问自己的服务器 | 加上 permit-inside 启用 Hairpin NAT,让内网到公网 IP 的流量在内部直接转换 |
为 inside global 添加了本地路由 |
多了一条无用路由 | inside global 是 NAT 转换后的身份,本地不需要到它的路由;但必须确保上游网络有回程路由指向本设备 |
| ACL 没匹配上 | NAT 表无表项 | 用 show access-lists 查看命中计数;常见原因:ACL 源/目的写反、掩码用错了通配符格式、序号跳跃导致规则被截断 |
| 扩展 ACL 未写序号 | 规则顺序混乱 | 每条规则以序号开头(10 permit ...),设备按序号从小到大匹配 |
| 多出口 NAT 未绑定接口 | 流量从错误出口返回,通信失败 | 多出口时用不同 ACL 或 route-map 将 NAT 规则与特定出口绑定,并配合策略路由(PBR)保证去程回程走同一路径 |
7.3 ALG(应用层网关)
7.3.1 什么是 ALG?
NAT 只改 IP 头部,但某些协议会在应用层数据中嵌入 IP 地址和端口,NAT 改了头部但没改载荷,协议就坏了。
以 FTP 主动模式为例,客户端与服务器的交互分为两条连接:
1 | |
问题出在第二步——客户端通过 PORT 命令把自己的内网 IP 和端口告诉服务器,服务器按这个地址回连数据通道。但 NAT 已经把客户端的源地址改成了公网 IP,PORT 命令里还是旧的私网 IP,服务器当然连不上。
ALG(Application Layer Gateway)就是干这个的:深度检测应用层载荷,把里面嵌套的 IP/端口一并修正。
| 协议 | 问题载荷 | ALG 修正内容 |
|---|---|---|
| FTP(主动模式) | PORT 命令包含内网 IP + 端口 |
替换为 NAT 后的公网 IP + 端口 |
| FTP(被动模式) | 227 响应包含服务器内网 IP + 端口 |
替换为 NAT 后的公网 IP + 端口 |
| SIP | SDP 消息体中携带媒体流地址 | 替换媒体流 IP 和端口 |
| RTSP | 控制信令中嵌套传输地址 | 替换传输地址 |
7.3.2 ALG 配置体系
锐捷的 ALG 相关命令分散在两个家族下,功能不同:
1 | |
功能开关——控制某种协议的 ALG 是否启用:
1 | |
端口绑定——告诉 ALG 去哪个端口上监听协议特征:
1 | |
为什么要分两个命令?
ip nat application ftp是”总开关”——决定了设备是否具备处理 FTP 载荷的能力。ip nat translation ftp port 2121是”端口绑定”——告诉这个能力应该作用在哪个端口上。两个配合使用:先确认开关打开,再指定监听端口。如果只开开关不绑端口,ALG 只对标准端口(如 FTP 的 21)生效。
7.3.3 非标端口场景
当服务使用非标准端口时,仅开启 ALG 开关是不够的——路由器不知道该在哪个端口上检测协议特征。必须额外用 ip nat translation 指定端口。
以 FTP 跑在 TCP 2121 为例:
1 | |
完整工作流程(非标端口 FTP 经过 NAT):
1 | |
排障提示:如果 FTP 数据通道始终建立失败,但控制通道正常,先检查两件事:
- FTP 服务是否跑在非标端口?如果是,有没有配
ip nat translation ftp port <端口>?- 是否有其他设备(如防火墙)也开启了 FTP ALG?两层 ALG 可能重复修改载荷,反而把地址改错。
7.3.4 使用建议
| 场景 | 建议 |
|---|---|
| 普通 Web 上网 | 不需要 ALG |
| FTP 主动模式 | 需要 ALG(或改用被动模式更省心) |
| FTP 被动模式 | 通常也需要 ALG(服务端 227 响应中的地址同样可能需要修正) |
| SIP 语音 | 需要 ALG(或使用 SBC 边界控制器) |
| 现代企业网络 | 谨慎开启——ALG 常与防火墙的 ALG 功能冲突,两层修改载荷可能导致协议异常。建议优先在应用层解决(如 FTP 改被动模式) |
7.4 策略式地址重定向(dest-change / src-change)
注意:
dest-change/src-change和 ALG 是不同的功能,只是命令前缀恰好都是ip nat application。这里修改的是 IP 头部地址,不是应用层载荷。
ip nat application 还支持基于 ACL 的策略式地址修改:
1 | |
| 关键字 | 修改对象 | 效果 |
|---|---|---|
dest-change |
目的地址 | 匹配的流量目的地址从 原始目的IP 改为 新IP(透明重定向) |
src-change |
源地址 | 匹配的流量源地址改为 新IP(策略性 SNAT) |
与标准 NAT 命令的本质区别
dest-change / src-change 看起来功能灵活,但它和 ip nat inside/outside source 等标准命令在技术原理上截然不同:
| 对比维度 | 标准 NAT(如 inside source) |
dest-change / src-change |
|---|---|---|
| 工作模式 | 状态化:建立并维护 NAT 会话表,记录每个连接的转换状态 | 无状态:对每个匹配的数据包独立执行地址修改,不记录会话状态 |
| 回程流量 | 自动处理:通过查 NAT 会话表自动反向转换,无需额外配置 | 需要手动配置:必须为回程流量单独配置反向规则,否则通信失败 |
| 端口复用(PAT) | 支持:通过 overload 实现多内网 IP 共享公网 IP |
不支持:无法做端口转换,每个内网地址需要独立的公网地址 |
这意味着 dest-change 无法替代标准 NAT 来处理日常场景:
| 网络需求 | 标准 NAT | dest-change |
|---|---|---|
| 内网用户共享公网 IP 上网 | 完美支持(overload 端口复用) |
无法实现(不支持端口复用,回程也无法自动返回) |
| 端口映射发布内网服务 | 完美支持(静态映射,自动双向) | 可实现但复杂(需手动配双向规则) |
| 外网访问者源地址伪装 | 完美支持(outside source) |
功能等价但效率低(需两条镜像规则) |
| 特定 IP 的透明重定向 | 难以精细控制 | 这就是它的优势(ACL + 目标 IP 精确匹配) |
一句话定位:标准 NAT 是”自动挡”(状态化,自动处理回程,覆盖 99% 场景);
dest-change是”手动挡”(无状态,完全手动控制,只用于需要 ACL 精细匹配的特殊场景)。
配置示例
1 | |
适用场景:
| 场景 | 说明 |
|---|---|
| 服务器迁移过渡 | 旧 IP 自动映射到新 IP,无需逐台修改客户端配置 |
| DNS 重定向 | 将访问某个 IP 的流量引导到本地服务器(常见于校园网/酒店网络) |
| 透明代理 | 内网用户访问外网特定地址时,被重定向到本地代理服务器 |
前提条件:必须已配置
ip nat inside/ip nat outside接口角色,否则此功能不生效。
7.5 NAT 会话老化
| 协议 | 老化行为 | 潜在问题 |
|---|---|---|
| TCP | 跟随连接状态(FIN/RST 后快速老化) | 长连接空闲可能被中断 |
| UDP | 超时老化(锐捷默认 300 秒) | 应用层若无保活机制,会话超时后回包无法匹配,表现为”突然断了” |
| ICMP | 超时极短(通常 5~10 秒) | Ping 大包测试可能因老化出现”丢包假象” |
排查技巧:如果出现”一开始正常,过一会断了”的现象,检查 UDP / ICMP 会话是否因超时被清除。解决方法是让应用层定期发送保活报文,或调整 NAT 超时参数(需查阅具体型号命令)。
7.6 多出口 NAT
当路由器有多个公网出口时,NAT 配置需要额外注意:
1. 不同出口必须对应不同的 NAT 规则
1 | |
2. 必须配合策略路由(PBR)
确保同一会话的去程和回程经过同一个出口,否则:
- 去程从电信出口出去(源地址被改为电信公网 IP)
- 回程从联通出口回来(联通公网 IP 的回包到不了电信出口的 NAT 表)
1 | |
3. 公网地址池需与运营商协商
确保每个出口对应的公网 IP 的回程路由正确指向本设备。
八、运维命令速查
NAT 配置命令按需求查表见 3.3 节。本节仅列出日常运维操作命令。
| 需求 | 命令 |
|---|---|
| 查看 NAT 表 | show ip nat translations | include {IP} |
| 查看 ACL 命中计数 | show access-lists {ACL名} |
| 查看路由 | show ip route {IP} |
| 查看接口 NAT 角色 | show run interface X |
| 清空 NAT 表(⚠ 中断所有会话) | clear ip nat translation * |
| 清空指定条目 | `clear ip nat translation {Inside-Local} {Outside-Local |
| NAT 调试(⚠ 生产环境慎用) | debug ip nat / undebug all |
九、核心心法
- NAT 是有状态的双向转换系统,不是简单的改 IP 头。一条规则建表项,回程自动反向转换,不需要配反向规则。
- 路由决定可达性,NAT 决定身份映射——两者独立但缺一不可。排障时先看 NAT 表,再看路由表。
inside global不需要本地路由,但必须确保上游网络有回程路由指向本设备。- 出站先路由后改源,入站先改目的后路由——理解这个时序,很多”为什么 NAT 不生效”的问题就迎刃而解。
- 排障三板斧:① 查 NAT 表有没有表项 → ② 查 ACL 命中计数 → ③ 查路由表可达性。