锐捷路由器 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
2
3
4
5
6
7
interface GigabitEthernet 0/1
description To-Inside-Network
ip nat inside ! 内网侧接口

interface GigabitEthernet 0/2
description To-Outside-Network
ip nat outside ! 外网侧接口
  • ip nat inside:接内网的接口(连接私网地址)
  • ip nat outside:接外网的接口(连接公网 / 上游网络)

2.2 四元地址模型

NAT 转换过程中涉及四个地址角色,理解它们是读懂 NAT 表和排错的基础:

1
2
3
4
5
6
7
8
9
10
11
                  ┌──────────────┐
Inside Local │ │ Inside Global
(内网真实地址) │ 路由器 │ (内网对外的公网身份)
─────────────────►│ NAT 引擎 │◄─────────────────
│ │
Outside Local │ │ Outside Global
(外网地址在 │ │ (外网的真实地址)
内网眼中的样子) │ │
─────────────────►│ │◄─────────────────
└──────────────┘
内网侧 公网侧
角色 含义 通俗理解
Inside Local 内网设备的真实 IP 地址 你的”身份证上的名字”
Inside Global 内网设备对外呈现的公网 IP 你对外出示的”名片”
Outside Global 外网设备的真实 IP 地址 对方的”身份证上的名字”
Outside Local 外网设备在内网侧被看到的地址 对方在你眼中的”化名”(仅在 outside source NAT 中非空)

初学者最容易搞混的点

  • Inside LocalInside Global 指的是同一个内网设备,只是”在家”和”出门”用了不同身份。
  • Outside LocalOutside Global 指的是同一个外网设备,同理。
  • 在最常见的 PAT 场景(上网)中,Outside Local == Outside Global(外网地址不需要伪装),所以 NAT 表中这两列看起来一样,这是正常的。

2.3 NAT 的本质:建立映射,双向自动生效

NAT 配置做的所有事情可以归结为一件事:在四元地址模型中建立映射关系。映射一旦建立,路由器根据报文的来向自动决定如何应用:

1
2
3
4
配置: ip nat inside source static 192.168.1.100 100.1.1.1

映射: 192.168.1.100 ←──映射──→ 100.1.1.1
(内网服务器) (公网身份)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
━━━ 报文从内网来(内→外)━━━

PC 发出: src=192.168.1.100 dst=8.8.8.8
↓ 查映射,改源地址
路由器转发: src=100.1.1.1 dst=8.8.8.8

表现: 源地址转换(SNAT)—— 内网主机对外展示公网身份


━━━ 报文从外网来(外→内)━━━

外网发出: src=8.8.8.8 dst=100.1.1.1
↓ 查映射,改目的地址
路由器转发: src=8.8.8.8 dst=192.168.1.100

表现: 目的地址转换(DNAT)—— 外网流量被引导到内网服务器

关键理解:SNAT 和 DNAT 不是两种不同的技术,是同一个映射在两个方向上的自动表现。你不需要配两条规则,也不需要告诉路由器”这是 SNAT 还是 DNAT”——你只管建映射,路由器根据报文从哪个接口进来自动判断该改源还是改目的。

这也是为什么”端口映射”(发布内网 Web 服务)用的也是 ip nat inside source static tcp——你配的是映射,路由器自动处理双向:

1
2
3
4
5
! 配置的是映射: 100.1.1.1:80 ↔ 192.168.1.100:80
ip nat inside source static tcp 192.168.1.100 80 100.1.1.1 80

! 外→内: dst=100.1.1.1:80 → dst=192.168.1.100:80(把流量送到内网)
! 内→外: src=192.168.1.100:80 → src=100.1.1.1:80(回包时还原源地址)

但存在一个区别:映射何时建立?

  • 静态 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
2
3
4
5
6
ip nat  [地址对]   [锚点]      [映射类型]    [映射参数]
│ │ │ │
│ │ │ └── 具体的内外地址、ACL、地址池等
│ │ └── static / list ... overload / list ... pool
│ └── source / destination
└── inside / outside
组成部分 含义 取值 通俗理解
地址对 映射作用于哪一侧的地址对 inside / outside “你要定义的是内网设备的身份,还是外网设备的身份?”
锚点 映射以报文的哪个字段为依据建立 source / destination “这条映射绑定的是’谁发起的’,还是’去哪的’?”
映射类型 映射是永久的还是临时分配的 static / list ... overload / list ... pool “这个身份是固定的还是临时分配的?”
映射参数 映射的具体地址值 IP 地址、端口、ACL、地址池名 “具体是谁映射到谁?”

inside / outside:操作哪对地址

回到 2.2 节的四元地址模型,NAT 涉及两对地址:

1
2
Inside Local  ←──映射──→  Inside Global     ← ip nat inside ... 操作这对
Outside Local ←──映射──→ Outside Global ← ip nat outside ... 操作这对
  • inside = 操作 Inside 地址对(Inside Local ↔ Inside Global)
  • outside = 操作 Outside 地址对(Outside Global ↔ Outside Local)

inside / outside 不是流量方向,而是告诉路由器”你要操作的是哪对地址”。命令里写 inside 还是 outside,取决于你想建立映射的那两个地址分别属于内网侧还是外网侧。

source / destination:以什么为锚点建立映射

“锚点”决定了路由器用报文的哪个字段去查找/匹配映射:

1
2
3
4
同一个外→内报文: src=8.8.8.8  dst=100.1.1.1

以 source 为锚点: 用 src 查映射表 → 匹配后改源地址 → 隐藏外网来者身份
以 destination 为锚点: 用 dst 查映射表 → 匹配后改目的地址 → 把流量引导到内网服务器

路由器不可能猜你要以哪个字段为依据,所以必须显式指定。

但要注意:如 2.3 节所述,ip nat inside source static 建立的映射是双向的——内→外方向以源地址为锚点做源地址转换(SNAT),外→内方向自动以目的地址为锚点做目的地址转换(DNAT),不需要你分别指定。source / destination 在这里更多是语义标签,标明”这个映射定义的是谁的身份”,而不是限定只能改某个方向。

3.2 四类 NAT 行为(按场景分类)

实际使用场景出发,所有 NAT 行为可以归为四类。注意:有些命令是双向的,会同时出现在两类中。

1
2
3
4
5
6
7
8
9
           ┌──────────────┬──────────────┐
│ 源地址转换 │ 目标地址转换 │
┌──────────┼──────────────┼──────────────┤
│ 内→外 │ ① SNAT │ ③ 目的重定向 │
│ (出站) │ 隐藏内网身份 │ 改写访问目标 │
├──────────┼──────────────┼──────────────┤
│ 外→内 │ ② 源地址伪装 │ ④ DNAT │
│ (入站) │ 隐藏外网身份 │ 发布内网服务 │
└──────────┴──────────────┴──────────────┘

① 内→外 源地址转换(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
2
3
4
5
6
7
! 最常用:多用户共享公网 IP 上网
ip access-list extended NAT_INSIDE
10 permit ip 192.168.1.0 0.0.0.255 any
ip nat inside source list NAT_INSIDE interface GigabitEthernet 0/2 overload

! 固定公网身份
ip nat inside source static 192.168.1.100 100.1.1.10

② 外→内 源地址转换:隐藏外网来者身份

场景:外网流量进入内网时,把源地址改掉,让内网服务器看到的是一个”假地址”而不是对方的真实 IP。

方式 命令 频率 说明
静态 ip nat outside source static {外真IP} {外假IP} ★★★☆☆ 外网真实 IP 固定映射为一个内网可达的假地址
动态 ip nat outside source list {ACL} pool {池名} ★☆☆☆☆ 从地址池动态分配假地址,极罕见

配置示例

1
2
! 外单位真实 IP 100.1.1.1 访问内网时,被伪装为 172.16.10.168
ip nat outside source static 100.1.1.1 172.16.10.168

这条命令为什么让人困惑? 命令名是 outside source(”外网源”),容易理解为”外→内方向改源地址”,这没错。但它其实也是双向的:

  • 外→内方向:入包源地址 100.1.1.1172.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
2
3
4
5
6
7
! 方式一:outside source static(内网访问 172.16.10.168 → 实际访问 100.1.1.1)
ip nat outside source static 100.1.1.1 172.16.10.168
! 内网主机需要配置路由:去往 172.16.10.168 的流量指向本路由器

! 方式二:策略式重定向(所有内网用户访问 202.100.1.1 → 被转向 192.168.100.10)
access-list 1 permit 192.168.1.0 0.0.0.255
ip nat application source list 1 destination 202.100.1.1 dest-change 192.168.100.10

方式一 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
2
3
4
5
6
7
8
9
10
11
! 端口映射:公网 100.1.1.1:80 → 内网 192.168.1.100:80
ip nat inside source static tcp 192.168.1.100 80 100.1.1.1 80 permit-inside

! 端口映射(端口不同):公网 100.1.1.1:8080 → 内网 192.168.1.100:80
ip nat inside source static tcp 192.168.1.100 80 100.1.1.1 8080 permit-inside

! 负载均衡:访问 100.1.1.1:80 轮询到 3 台 Web 服务器
ip access-list extended LB_ACL
10 permit tcp any host 100.1.1.1 eq 80
ip nat pool WEB_POOL 192.168.1.10 192.168.1.12 netmask 255.255.255.0 type rotary
ip nat inside destination list LB_ACL pool WEB_POOL

关于 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 localinside global 目的地址(inside globalinside local
匹配依据 ACL 规则 NAT 表(会话表 / 静态表)
回程处理 查 NAT 表自动反向转换 查 NAT 表自动反向转换

记忆口诀出站先路由后改源,入站先改目的后路由


五、标准配置模板

5.1 接口角色定义(所有 NAT 的前提)

1
2
3
4
5
6
7
8
! 这是所有 NAT 配置的基础,漏掉这一步一切都不生效
interface GigabitEthernet 0/1
description To-Inside-Network
ip nat inside

interface GigabitEthernet 0/2
description To-Outside-Network
ip nat outside

5.2 内→外 PAT:多用户共享公网 IP 上网(最常用)

1
2
3
4
5
6
! 第一步:定义 ACL,匹配需要做 NAT 的内网流量
ip access-list extended NAT_INSIDE
10 permit ip 192.168.1.0 0.0.0.255 any

! 第二步:配置 PAT 规则,使用出接口的公网 IP 做 overload
ip nat inside source list NAT_INSIDE interface GigabitEthernet 0/2 overload

工作原理:所有 192.168.1.0/24 的主机发出的流量,源地址被替换为 GigabitEthernet 0/2 接口的公网 IP,不同主机靠端口号区分。路由器自动管理端口分配和 NAT 表。

5.3 内→外 PAT:使用地址池(多公网 IP)

1
2
3
4
5
! 第一步:定义公网地址池
ip nat pool PUBLIC_POOL 100.1.1.10 100.1.1.20 netmask 255.255.255.0

! 第二步:用地址池做 PAT
ip nat inside source list NAT_INSIDE pool PUBLIC_POOL overload

与 5.2 的区别:5.2 只用一个接口 IP,5.3 从地址池中选 IP 做端口复用。适合拥有多个公网 IP 的场景。

5.4 外→内 端口映射:发布内网 Web 服务

1
2
! 把公网 IP 100.1.1.1 的 80 端口映射到内网 192.168.1.100 的 80 端口
ip nat inside source static tcp 192.168.1.100 80 100.1.1.1 80 permit-inside

为什么端口映射也用 inside source static 因为它建立的是静态映射,天然双向生效——原理见 2.3 节和 3.2④ 节。

5.5 外→内 静态 1:1:整台服务器暴露

1
2
! ⚠ 慎用:所有端口全部暴露,安全风险高
ip nat inside source static 192.168.1.100 100.1.1.1

5.6 外→内 源地址伪装:隐藏外网设备的真实 IP

1
2
3
! 效果:内网主机访问 172.16.10.168 时,实际访问的是 100.1.1.1
! 从内网视角看,外网服务器 100.1.1.1 被"伪装"成了 172.16.10.168
ip nat outside source static 100.1.1.1 172.16.10.168

注意:配置 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
2
3
4
5
6
7
8
9
! 第一步:ACL 匹配需要负载均衡的流量
ip access-list extended LB_ACL
10 permit tcp any host 100.1.1.1 eq 80

! 第二步:定义内网服务器池(type rotary 启用轮询)
ip nat pool WEB_POOL 192.168.1.10 192.168.1.12 netmask 255.255.255.0 type rotary

! 第三步:配置目的地址转换
ip nat inside destination list LB_ACL pool WEB_POOL

工作原理:所有访问 100.1.1.1:80 的流量,路由器按轮询方式分发到 192.168.1.10192.168.1.11192.168.1.12

5.8 扩展 ACL 编写规范

1
2
3
4
5
6
! 扩展 ACL 可以精确控制哪些流量做 NAT
ip access-list extended NAT_WEB_ONLY
10 permit tcp 192.168.1.0 0.0.0.255 any eq 80 ! 只允许 HTTP
20 permit tcp 192.168.1.0 0.0.0.255 any eq 443 ! 只允许 HTTPS
30 permit udp 192.168.1.0 0.0.0.255 any eq 53 ! 只允许 DNS
! 其他流量不匹配 ACL,不做 NAT,也就无法上网

关于 ACL 序号

  • 扩展 ACL(无论命名型还是编号型)的每条规则都建议显式指定序号(如 102030)。
  • 序号决定匹配顺序——从小到大依次匹配,命中即停
  • 默认步长是 10,方便中间插入新规则(如插入 15 permit ...)。
  • 如果不写序号,设备会自动分配(通常从 10 开始),但可读性差,不推荐

六、NAT 表解读

6.1 查看命令

1
2
3
4
5
6
7
8
! 基本查看(建议加过滤,避免设备输出过载)
show ip nat translations | include 100.1.1.1

! RSR77 系列分布式设备需指定槽位
show ip nat translations slot 2/1 | include 100.1.1.1

! 清空 NAT 表(排错时使用,⚠ 会中断所有现有 NAT 会话)
clear ip nat translation *

6.2 输出示例与字段含义

1
2
Pro   Inside global      Inside local       Outside local      Outside global
tcp 100.1.1.1:20001 192.168.1.2:50000 8.8.8.8:80 8.8.8.8:80

在”内→外 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 source NAT 时,这两列才会不同。

6.3 不同场景下 NAT 表的特征

场景 NAT 表特征
PAT 上网 Inside global 列出现公网 IP + 递增端口号;Outside 两列相同
静态 1:1 Inside local ↔ Inside global 固定对应,无端口(或端口不变)
端口映射 表项中公网 IP 的端口与内网 IP 的端口可能不同(如 808080
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
4
terminal 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
2
控制连接(TCP 21):客户端 ←→ 服务器,传输 FTP 命令
数据连接(动态端口):客户端 ←→ 服务器,传输文件内容

问题出在第二步——客户端通过 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
2
3
4
┌─────────────────────────────────────────────────────────────┐
ip nat application {协议} → ALG 功能开关 │
ip nat translation {协议} [port 端口] → ALG 端口绑定 │
└─────────────────────────────────────────────────────────────┘

功能开关——控制某种协议的 ALG 是否启用:

1
2
3
4
! 开启 / 关闭特定协议的 ALG
ip nat application ftp
ip nat application sip
no ip nat application ftp ! 关闭 FTP ALG

端口绑定——告诉 ALG 去哪个端口上监听协议特征:

1
2
3
4
5
6
7
8
! 默认行为:FTP ALG 只监听标准 TCP 21
ip nat translation ftp ! 默认开启,等效于 port 21
ip nat translation ftp port 2121 ! 指定非标端口(FTP 服务跑在 2121 时)
ip nat translation dns ! DNS ALG
ip nat translation sip ! SIP ALG
ip nat translation h323 ! H323 ALG(视频会议)
ip nat translation pptp ! PPTP ALG(VPN)
no ip nat translation ftp ! 关闭

为什么要分两个命令?

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
2
3
4
5
6
! 第一步:开启 FTP ALG 功能
ip nat application ftp

! 第二步:告诉 ALG 去 2121 端口上监听 FTP 协议特征
! 不做这一步,ALG 仍然只看 TCP 21,2121 上的 FTP 载荷不会被修正
ip nat translation ftp port 2121

完整工作流程(非标端口 FTP 经过 NAT):

1
2
3
4
5
6
7
8
9
10
11
12
① 客户端 → 服务器(TCP 2121 控制连接)
路由器:发现是 TCP 2121,且已绑定 FTP ALG → 开始检测载荷

② 客户端发送 PORT 命令,载荷中包含 "192.168.1.100,50000"
路由器 ALG:识别到 PORT 命令 → 把 192.168.1.100 替换为 100.1.1.1
→ 载荷变为 "100.1.1.1,20001",同时为数据通道预分配 NAT 表项

③ 服务器按修正后的地址 100.1.1.1:20001 回连数据通道
路由器:命中预分配的 NAT 表项 → 反向转换 → 数据到达客户端

④ 如果没有 ALG(或端口未绑定):
服务器按原始载荷中的 192.168.1.100:50000 回连 → 公网不可达 → 数据传输失败

排障提示:如果 FTP 数据通道始终建立失败,但控制通道正常,先检查两件事:

  1. FTP 服务是否跑在非标端口?如果是,有没有配 ip nat translation ftp port <端口>
  2. 是否有其他设备(如防火墙)也开启了 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
ip nat application source list {ACL} destination {原始目的IP} { dest-change {新IP} | src-change {新IP} }
关键字 修改对象 效果
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
2
3
4
5
6
! ACL 匹配内网用户
access-list 1 permit 192.168.1.0 0.0.0.255

! 内网用户访问 202.100.1.1 时,目的地址被透明改为 192.168.100.10
! 客户端无感知,以为在访问 202.100.1.1
ip nat application source list 1 destination 202.100.1.1 dest-change 192.168.100.10

适用场景

场景 说明
服务器迁移过渡 旧 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
3
4
5
6
7
8
9
10
11
! 出口 1(电信)的 ACL
ip access-list extended NAT_CT
10 permit ip 192.168.1.0 0.0.0.255 any

! 出口 2(联通)的 ACL
ip access-list extended NAT_CU
10 permit ip 192.168.1.0 0.0.0.255 any

! 分别绑定不同接口
ip nat inside source list NAT_CT interface GigabitEthernet 0/2 overload
ip nat inside source list NAT_CU interface GigabitEthernet 0/3 overload

2. 必须配合策略路由(PBR)

确保同一会话的去程和回程经过同一个出口,否则:

  • 去程从电信出口出去(源地址被改为电信公网 IP)
  • 回程从联通出口回来(联通公网 IP 的回包到不了电信出口的 NAT 表)
1
2
3
4
5
6
7
8
! 策略路由示例:让特定源地址的流量走电信出口
route-map PBR_CT permit 10
match ip address NAT_CT
set ip next-hop 电信网关IP

! 在入接口上应用策略路由
interface GigabitEthernet 0/1
ip policy route-map PBR_CT

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

九、核心心法

  1. NAT 是有状态的双向转换系统,不是简单的改 IP 头。一条规则建表项,回程自动反向转换,不需要配反向规则。
  2. 路由决定可达性,NAT 决定身份映射——两者独立但缺一不可。排障时先看 NAT 表,再看路由表。
  3. inside global 不需要本地路由,但必须确保上游网络有回程路由指向本设备。
  4. 出站先路由后改源,入站先改目的后路由——理解这个时序,很多”为什么 NAT 不生效”的问题就迎刃而解。
  5. 排障三板斧:① 查 NAT 表有没有表项 → ② 查 ACL 命中计数 → ③ 查路由表可达性。

锐捷路由器 NAT 转换配置笔记
https://xinhaojin.github.io/2026/04/10/锐捷路由器NAT笔记/
作者
xinhaojin
发布于
2026年4月10日
许可协议