1. 静态NAT到底在什么场景下才值得用
一个同行前阵子找我帮忙看问题,说他在思科设备上做静态NAT配置,命令行敲进去一句报错都没有,show ip nat translations也能刷出条目,可外面的设备就是访问不进来,急得他重启了两遍设备。我远程连上去看了三分钟,问题出在他只把转换规则写进去了,两个接口的ip nat inside和ip nat outside一个都没打——这套配置看起来像配完了,实际上一个包都不会被转换。这个坑几乎每个刚接触思科NAT的人都会踩一次,所以我干脆把自己这些年做静态NAT配置的完整思路、命令、验证方法和排查顺序整理一遍,从最基础的地址规划一路讲到端口映射、双向转换和上线后的维护,看完基本能照着复现。
静态NAT这件事本身不复杂,但它在整个网络里的位置很关键:它决定了外部的流量能不能按你预期的方式找到内部某台固定设备。和动态NAT那种"谁先来谁先用"的抢凳子模式不同,静态NAT是一对一的固定绑定,写死了就是写死了,内部主机的地址和外部呈现的地址之间存在一条永久映射关系。这条关系一旦建立,外面的设备访问全局地址,设备就知道该往哪个内部地址送;内部主机主动往外发包,源地址也会被换成那个全局地址。很多人只记住了前半句,忽略了后半句,结果在叠加动态NAT的时候出现地址冲突或者源地址不符合预期的情况,这一点后面会单独讲。
适合读这篇内容的人大概有三类:刚上手思科设备、需要把内网某台服务器发布出去的初级网络运维;手上有一堆零散公网地址、需要做地址规划的中级工程师;以及虽然天天用NAT但从没深究过转换顺序、一出问题就只会重启设备的朋友。不管你属于哪一类,只要跟着下面的顺序走一遍,静态NAT这块基本就不会再卡住你。
1.1 一句话讲透三种NAT的分工
思科设备上的地址转换,按使用方式可以粗暴地分成三种:静态NAT、动态NAT、以及带端口复用的PAT(也就是大家常说的overload)。这三者的区别不在于命令长什么样,而在于"地址和会话的分配权归谁"。
静态NAT是人工指定,一条命令绑定一个内部地址和一个外部地址,设备不参与决策,配了什么就是什么。动态NAT是设备从地址池里临时借一个给你,会话结束就还回去,下次再来可能换一个。PAT则是把成百上千个内部地址全部压到一个公网地址上,靠源端口号来区分是谁的会话,这也是家庭宽带和企业出口最常见的形态。
选择逻辑其实很简单:如果外部需要主动访问内部的某台设备,就必须用静态NAT,因为动态分配出来的地址随时会变,外部根本没法预先知道该访问哪个地址;如果只是内部用户上网、外部不需要主动连进来,用PAT就够了,还省地址。至于动态NAT,在实际项目里用得越来越少,因为它既要占用一批公网地址,又不能让外部稳定访问,属于两头不讨好的方案,除非是某些特定的合规审计场景,否则我一般不建议优先考虑。
这里补一个容易被忽略的点:静态NAT是双向生效的。你配了ip nat inside source static 192.168.10.10 203.0.113.10之后,外部访问 203.0.113.10 会被转到 192.168.10.10,同时 192.168.10.10 主动往外发包时,源地址也会被替换成 203.0.113.10。这个特性和后面要讲的端口映射叠加使用时会互相影响,务必先记住。
1.2 静态NAT不可替代的三个场景
第一类是服务器对外发布。内网的Web、邮件、监控平台、远程运维入口,只要需要外部主动发起连接,就必须有一条固定的地址映射。这类场景对稳定性要求高,映射关系一旦确定,通常几年都不会动,所以用静态最合适。
第二类是地址规划上的硬性要求。有些对接方会在防火墙或者白名单里写死你的源地址,这时候内网主机出方向必须固定呈现某个公网地址,否则对面每次都要改策略。这种情况其实用PAT也能实现,但一旦这个地址上还要承载外部访问,静态NAT就是唯一解。
第三类是跨网段地址平移。两个组织合并、地址段冲突、或者从旧网段迁移到新网段时,往往需要在不改动主机配置的前提下,让对方看到的是一个"合规"的地址。这种场景下静态NAT相当于一层地址翻译层,主机自己完全无感。
反过来,如果你只是想给几十台办公电脑提供上网出口,真的没必要一条条写静态映射,那属于给自己找活干。静态条目多了之后,转换表会膨胀,排查问题时也更难定位是哪条规则在起作用。
1.3 一个包穿过NAT设备的完整旅程
要真正理解配置为什么这么写,得先搞清楚一个数据包在设备内部被处理了几次。以内部主机访问外部为例:包从inside接口进来,设备先在路由表里查目的地址,决定从哪个接口出去;确定出口是outside接口之后,才把源地址从inside local换成inside global;然后包被转发出去。也就是说,出方向的转换发生在路由决策之后、真正发送之前。
反方向的包进来时顺序刚好倒过来:包从outside接口收到,设备先做地址转换,把目的地址从inside global换成inside local,然后才拿这个新地址去查路由表。这个顺序解释了为什么很多配置"看起来没问题但就是不通"——如果设备上缺少到inside local地址的路由,反方向的包转换完地址之后查不到路由,直接就被丢掉了,你从外部看就是超时。
再叠加一层ACL的影响:outside接口入方向的ACL,通常是在NAT转换之前匹配的,也就是ACL里要写的是转换前的全局地址;而inside接口出方向或者outside接口出方向的ACL,匹配的是转换之后的地址。这个细节经常把人绕晕,我的做法是不管三七二十一,先在两个方向上把转换前后的地址都放行,等业务通了再收紧策略,靠debug ip nat观察实际匹配的地址。这个习惯帮我省掉了无数次来回猜测。
理解了这三个处理阶段——入向ACL、地址转换、路由查找——后面的每一个配置动作和排查手段,其实都是围绕这三个环节展开的。
2. 配置前必须想清楚的地址规划
动手敲命令之前,我习惯先在纸上把三件事写清楚:谁是内网地址、谁是外网地址、谁映射到谁。这一步花十分钟,能省掉后面一个小时的抓包。很多现场问题是"配了但不通",归根结底不是命令写错,而是地址规划阶段就埋了雷,比如用了运营商没有路由给你的公网地址段,或者内部主机的网关根本没指向这台设备。
地址规划的核心约束只有一个:静态NAT使用的全局地址,必须是外部网络能够正确路由到你这台设备的地址。这句话听起来像废话,但实际踩坑率极高。常见情况是运营商给你分配了一个 /30 的点对点地址,可用地址只有两个,而你为了让内网五台服务器都能对外访问,自己随手挑了一段看起来"像公网"的地址填进去,结果外部设备根本不认这段地址,包连你的设备都到不了,NAT转换表再正确也没用。
我的建议是把地址分成三类明确标注:接口地址用于设备本身通信,NAT全局地址用于对外发布,地址池用于动态分配。三类地址不要混用,也不要让NAT全局地址和接口地址重叠,虽然技术上某些情况可行,但排错时你会想给自己两巴掌。
2.1 一个最小可用的实验拓扑
下面这套地址规划在文档地址段内,可以直接照搬做实验,不会和任何真实网络冲突。内部网络用 192.168.10.0/24,设备inside接口 192.168.10.1,两台内部主机分别是 .10 和 .20。设备outside接口地址 203.0.113.1/24,模拟运营商侧,对端设备地址 203.0.113.2,外部测试主机 198.51.100.100。
| 角色 | 地址 | 说明 |
|---|---|---|
| 内部网段 | 192.168.10.0/24 | inside 侧,主机网关指向 192.168.10.1 |
| 内部主机A | 192.168.10.10 | 提供 Web 服务,监听 80 |
| 内部主机B | 192.168.10.20 | 提供邮件服务,监听 25 和 110 |
| 设备 inside 接口 | 192.168.10.1/24 | 必须打ip nat inside |
| 设备 outside 接口 | 203.0.113.1/24 | 必须打ip nat outside |
| 对外发布地址1 | 203.0.113.10 | 静态映射给主机A |
| 对外发布地址2 | 203.0.113.11 | 静态映射给主机B |
| 外部测试主机 | 198.51.100.100 | 验证用 |
把这套表格抄在纸上或者画在白板上,比直接在设备上边想边敲要靠谱得多。尤其是多台服务器、多个服务并存的时候,映射关系一旦写乱,后面很难理清楚到底是哪条规则生效。
2.2 转换关系先列表再敲命令
地址表建好之后,第二步是把"谁映射到谁"列成一张转换关系表。这张表是后面所有命令的直接依据,也是上线之后交接给别人的文档基础。我的习惯是把协议、内部地址、内部端口、全局地址、全局端口这五个字段都列出来,哪怕是一对一的全端口映射,也把协议写成 any。
| 序号 | 内部地址 | 内部端口 | 全局地址 | 全局端口 | 用途 |
|---|---|---|---|---|---|
| 1 | 192.168.10.10 | any | 203.0.113.10 | any | 主机A整体映射,供全协议访问 |
| 2 | 192.168.10.20 | 25 | 203.0.113.11 | 25 | 主机B邮件服务左移 |
| 3 | 192.168.10.20 | 110 | 203.0.113.11 | 110 | 主机B收件服务 |
这里有个实操上的取舍:第1条用的是全端口映射,第2、3条用的是端口级映射。全端口映射的好处是省事,所有协议都能过;坏处是一个全局地址只能给一台主机用,地址消耗快。端口级映射省地址,但每加一个服务就要加一条命令,而且非TCP/UDP的协议(比如ICMP、GRE)没法用端口区分,会失效。
我的默认选择是:能拿到独立公网地址的服务器,一律用全端口一对一映射,管理简单、故障面小;公网地址紧张的场景,才退而求其次用端口映射。这个顺序不要搞反,先图省地址后面会付出更多的排错成本。
2.3 inside/outside 标记:最容易漏也最致命
回到开头那个同行的案例。思科的NAT必须在接口上显式标记方向,ip nat inside和ip nat outside是两条独立命令,漏掉任何一条,转换表里都不会出现条目——注意是"不会出现",而不是"出现了但不对"。这个表现很有欺骗性,因为配置里的静态映射命令确实执行成功了,show running-config里也能看到那一行,让人误以为已经生效。
正确的接口配置顺序是这样的:
R1(config)# interface GigabitEthernet0/1 R1(config-if)# ip address 192.168.10.1 255.255.255.0 R1(config-if)# ip nat inside R1(config-if)# no shutdown R1(config)# interface GigabitEthernet0/0 R1(config-if)# ip address 203.0.113.1 255.255.255.0 R1(config-if)# ip nat outside R1(config-if)# no shutdown注意:接口标记只是"允许在此接口上做转换",不涉及具体转换规则。如果一台设备有多个内网接口,每一个承载内部流量的接口都必须打
ip nat inside,包括子接口和VLAN接口。多接口场景下漏标一个,表现形式就是"部分网段能通,部分网段不通",很容易被误判成路由问题。
另外提醒一句,NAT方向标记和ACL的方向是两个完全独立的概念。ip nat inside不代表这个接口不能配置入向ACL,两者互不影响,别混为一谈。
3. 静态NAT的配置全过程实录
准备工作做完,真正的配置其实只有几行。但我要强调一个容易被忽略的细节:静态NAT不需要配ACL。动态NAT和PAT必须配一条访问控制列表告诉设备"哪些地址允许被转换",静态NAT因为是一对一写死的,设备不需要额外判断,所以完全不用碰ACL。这一点对新手来说反而容易出问题——他们习惯性地配了ACL去匹配,结果ACL写错方向,把自己挡在外面。
配置的推荐顺序是:先接口地址,再接口NAT标记,最后写映射规则。这个顺序的好处是每一步都能单独验证。写完接口地址先ping一下直连对端,确认链路层没问题;打完标记先看show ip nat statistics里 inside 和 outside 接口有没有被识别;最后加映射规则,立刻就能在转换表里看到条目。
3.1 一对一地址映射:最基础的形态
先做主机A的整机映射,把 192.168.10.10 整体映射到 203.0.113.10:
R1(config)# ip nat inside source static 192.168.10.10 203.0.113.10就这一行。命令的语义拆开看是:ip nat表示地址转换功能,inside source表示转换内网侧的源地址(在反方向上就变成了转换目的地址),static表示静态绑定,后面两个参数是先内后外。
配置完成后立刻验证:
R1# show ip nat translations Pro Inside global Inside local Outside local Outside global --- 203.0.113.10 192.168.10.10 --- ---看到这行---开头的条目就说明静态映射已经建立。注意 Protocol 列显示的是---,这不是错误,而是表示这是一个不带协议的整机映射,覆盖所有协议。如果你看到的是tcp或udp,说明配的是端口级映射,两者在转换表里的显示形式不一样。
接着从外部主机测试:
PC-Outside# ping 203.0.113.10如果通了,说明整条链路和双向转换都工作正常。这一步最好用ping验证,因为ICMP没有端口概念,能直接验证整机映射的有效性。如果用telnet测试,还要额外考虑端口映射是否配对了。
实操提醒:一对一的整机映射会占用一个完整的公网地址,且该地址不能再用于端口级映射到其他主机。如果后面地址不够用想改成端口映射,记得先把这条整机映射删掉,用
no ip nat inside source static 192.168.10.10 203.0.113.10,否则新命令会报地址已被占用。
3.2 端口映射:一个公网地址扛多个服务
主机B只有邮件服务需要对外,没必要独占一个地址,改用端口映射。这种写法本质上是用静态方式实现PAT,业内也叫端口转发或端口左移:
R1(config)# ip nat inside source static tcp 192.168.10.20 25 203.0.113.11 25 R1(config)# ip nat inside source static tcp 192.168.10.20 110 203.0.113.11 110参数顺序是:协议、内部地址、内部端口、全局地址、全局端口。内外部端口可以不一致,比如把外部的 8025 映射到内部的 25,这在躲避自动化扫描时偶尔会用到,但我要提醒:这种做法只提高了扫描门槛,不构成任何实质安全防护,真正的防护还是要靠访问控制和认证。
一个常见报错是这样的:
% 192.168.10.20:110 already mapped (203.0.113.11:110)这个报错通常发生在你给同一个内部地址配了多条静态映射的时候。思科设备默认不允许同一个内部地址被多条静态规则引用,需要在命令末尾加extendable关键字:
R1(config)# ip nat inside source static tcp 192.168.10.20 25 203.0.113.11 25 extendable R1(config)# ip nat inside source static tcp 192.168.10.20 110 203.0.113.11 110 extendable这个关键字的官方解释是"允许同一本地地址创建多条静态转换",实际效果就是给同一台主机的不同端口分别建立独立映射。不加的话,第二条命令直接失败,而且报错信息不算特别直观,很多人第一次遇到会以为是地址冲突。
除了TCP,UDP也是同样的写法,把tcp换成udp就行。DNS服务(53)、NTP(123)、以及各类游戏和语音服务常用UDP,配的时候别顺手写成TCP。
3.3 命令验证与状态判读
配置完不代表结束,验证环节要看的命令有四条,各有分工:
| 命令 | 用途 | 关注点 |
|---|---|---|
show ip nat translations | 查看当前转换表 | 静态条目应在,动态会话条目会随流量增减 |
show ip nat statistics | 查看转换统计 | Hits 是否增长,说明规则是否被命中 |
show running-config | include nat | 确认配置生效 | 检查是否有遗漏或重复规则 |
debug ip nat | 实时观察转换过程 | 每条转换的源目地址变化,最直观 |
show ip nat statistics的输出里有几个数字值得重点看:Total active translations 是当前活跃会话数,Hits 是命中次数,Misses 是未命中次数。如果 Hits 一直是0,说明根本没有流量匹配到规则,问题出在上游而不是NAT本身。如果 Hits 在涨但业务还是不通,那就要往转换之后的环节查,比如路由或者目标服务的响应。
debug ip nat是我最常用的定位手段,输出长这样:
NAT: s=192.168.10.10->203.0.113.10, d=198.51.100.100 [1234] NAT*: s=198.51.100.100, d=203.0.113.10->192.168.10.10 [1234]第一行是出方向,源地址被转换;第二行是回方向,目的地址被还原。如果只看到第一行没有第二行,基本可以确定回程包没有正常返回,这时候要查的是运营商侧路由或者上游设备的策略。如果连第一行都没有,问题在出方向,先看接口标记和主机的默认网关。
注意:
debug ip nat在生产设备上要慎用,流量大的时候会刷屏甚至影响性能。我的习惯是配合ACL做过滤,只抓特定主机的转换,验证完立刻undebug all。宁可多敲两条命令,也别让调试输出把设备的CPU拖高。
3.4 双向静态NAT与overload的叠加用法
真实网络里静态NAT往往不是单独存在的,而是和PAT共存:绝大多数内网用户走PAT上网,少数服务器走静态映射。这两者叠加的时候有个必须知道的优先级规则——静态条目的优先级高于动态条目。
也就是说,如果主机A已经配了静态映射,同时PAT的ACL里也包含了 192.168.10.0/24 整个网段,那么主机A出方向的流量会优先匹配静态规则,源地址呈现为 203.0.113.10,而不是接口地址。这个行为大部分时候是符合预期的,但如果你希望主机A出方向走PAT、只让入方向用静态映射,就必须在PAT的ACL里把主机A的地址排除掉。
配置形态大致是这样:
R1(config)# access-list 10 deny 192.168.10.10 R1(config)# access-list 10 permit 192.168.10.0 0.0.0.255 R1(config)# ip nat inside source list 10 interface GigabitEthernet0/0 overload R1(config)# ip nat inside source static 192.168.10.10 203.0.113.10ACL的语义是"先拒绝主机A,再放行整个网段"。因为ACL是从上往下顺序匹配,第一条命中就不再往下走,所以主机A不会进入PAT池,只走静态映射。这个写法在实际项目里非常常用,尤其是有服务器需要固定源地址做白名单的场景。
再往上叠一层,如果某些场景需要按目的地址决定是否做静态转换,可以挂 route-map:
R1(config)# access-list 20 permit 198.51.100.0 0.0.0.255 R1(config)# route-map NAT-COND permit 10 R1(config-route-map)# match ip address 20 R1(config)# ip nat inside source static 192.168.10.10 203.0.113.10 route-map NAT-COND加上 route-map 之后,静态映射只在访问特定目的网段时生效,其他流量不转换。这个用法比较小众,但在多出口或者对接多方专线的环境里能解决不少问题。
3.5 NVI方式:新版系统上的另一条路
前面讲的都是"接口标记 inside/outside"这套经典模型,它在绝大多数场景下都够用。但如果设备上有多个接口都承载内部流量,或者存在路由回流、非对称路径的情况,接口标记就会变得很难维护——你会不断纠结某个接口到底该标 inside 还是 outside。
较新的系统版本提供了另一种模式,通常称为NVI(NAT虚拟接口)。它的思路是取消 inside/outside 的概念,改成在所有需要转换的接口上打ip nat enable,然后用ip nat source static写规则:
R1(config)# interface GigabitEthernet0/1 R1(config-if)# ip nat enable R1(config)# interface GigabitEthernet0/0 R1(config-if)# ip nat enable R1(config)# ip nat source static 192.168.10.10 203.0.113.10两种模式不能在同一个接口上混用,这一点要特别注意。我的建议是:新设计的网络如果设备版本支持,可以优先用NVI,它在多接口场景下确实更好维护;已经按经典模式跑起来的老网络,没必要为了这点便利去改造,风险大于收益。
切换到NVI之后,验证命令基本一致,还是那四条,只是转换表的显示格式略有差异。排错思路也不变:先确认规则被命中,再看转换后的路由,最后看回程。
4. 排查实录:不通的时候按这个顺序查
静态NAT配好之后不通,99%的情况都能归到五类原因:接口标记漏了、内部网关错了、外部路由没指、转换后查不到路由、以及非对称路径。这五类问题的排查是有顺序的,从下往上依次排除,比东一榔头西一棒子要快得多。
我一般按这个顺序走:先在设备上show ip nat translations,转换表空的就是配置层面的问题;转换表有条目但 Hits 不涨,是流量没到设备;Hits 在涨但业务不通,说明转换成功但后续环节断了,这时候就要一路往下查路由、查目标服务、查回程。这个顺序能覆盖绝大多数现场情况。
4.1 先看转换表,再看路由,最后看接口
转换表为空是最省事的故障,因为原因很集中。先确认接口标记:
R1# show ip interface GigabitEthernet0/1 | include NAT如果输出里没有NAT: inside或者NAT: outside,那就是标记漏了。这个检查比翻show running-config快得多,我一般先用它。
转换表有静态条目但外部访问不通,下一步查路由。在设备上查内部地址:
R1# show ip route 192.168.10.10必须有一条明确的路由指向inside接口或者内网下一跳。如果是直连网段,会自动生成直连路由,不会有问题;如果内网分了多个网段、设备只直连了其中一个,那其他网段必须配静态路由或者跑动态路由协议。缺少路由的表现是反方向包转换完地址之后被丢弃,外部看到的就是典型的请求超时。
第三层查接口状态和ARP。外部设备要能访问你的全局地址,前提是它能拿到全局地址对应的MAC。在设备上查:
R1# show ip arp 203.0.113.10如果ARP表里没有这条记录,说明上游设备没有发起ARP请求或者请求没到达。这种情况在运营商侧做了严格绑定的时候会碰到,需要联系对方确认。
4.2 典型故障与处理速查
下面这张表是我这几年遇到频率最高的几类问题,按出现概率排序,遇到问题可以直接对着找:
| 现象 | 可能原因 | 排查动作 | 处理方式 |
|---|---|---|---|
| 转换表完全为空 | 接口未标记 inside/outside | show ip interface看NAT标记 | 补上对应接口标记 |
| 转换表有静态条目,外部ping不通 | 全局地址不在上游路由范围内 | 上游设备查该地址的路由 | 换成运营商实际路由的地址段 |
| 内部主机出方向能通,外部进不来 | 回程路由或上游策略拦截 | debug ip nat观察是否有回程转换 | 补路由或调整上游策略 |
| 部分网段能通部分不通 | 多内网接口漏标 | 逐个接口检查NAT标记 | 所有承载内网的接口都标 inside |
| 端口映射报地址已占用 | 同一本地地址多条静态规则 | 看报错信息中的地址对 | 加extendable关键字 |
| 内外网ping通但应用不通 | 端口级映射漏配或协议写错 | 检查映射的协议与端口 | 补对应TCP/UDP映射 |
| 通了一段时间后突然断 | 会话老化或上游策略变更 | 看转换表条目是否消失 | 重新触发会话,核对上游变更 |
表格里第六行值得单独说一句。很多人配了一对一映射之后发现ping是通的,就以为万事大吉,结果应用访问还是失败。原因往往是他配的其实是端口级映射,而测试用的端口和实际服务端口对不上。或者更隐蔽的情况:服务同时用了TCP和UDP(比如某些监控协议),只配了TCP那一条,UDP方向的功能就时好时坏。
4.3 调试与清理的正确姿势
调试命令用得好是利器,用不好是事故。我的固定流程是:先在测试窗口确认流量特征,写一条只匹配问题主机的ACL,然后用debug ip nat配合access-list过滤,观察十几秒就撤。
R1(config)# access-list 99 permit 198.51.100.100 R1(config)# access-list 99 permit 192.168.10.10 R1# debug ip nat 99观察完之后:
R1# undebug all清理转换表也有讲究。clear ip nat translation *会清掉所有动态会话,静态条目会保留但相关的会话条目会重建。这个命令在改了规则之后很有用,避免旧会话还在按老规则跑,导致你以为新规则没生效。但生产环境里清空所有会话会造成瞬断,更稳妥的做法是只清特定地址:
R1# clear ip nat translation inside 192.168.10.10 203.0.113.10实操心得:改完NAT规则一定要清一次相关会话再验证。我踩过不止一次"改完规则测不通、以为配错了、回滚之后又通了"的坑,根因就是旧会话还挂在表里,回滚的时候刚好旧会话老化,才让人误以为是回滚生效了。养成"改完就清、清完再测"的习惯,能省掉大量自我怀疑。
5. 上线前值得复盘的几条经验
静态NAT的配置量不大,但它涉及地址、路由、策略三个层面的耦合,真正出问题的地方往往不在命令本身,而在配套的规划和管理上。下面几条是我在各种规模网络里反复验证过的经验,属于文档里不太会写、但实际很管用的类型。
5.1 会话老化、日志与长期维护
静态映射的规则本身是常驻的,不会因为没流量而消失。但端口级映射产生的会话条目是有老化时间的,TCP会话默认保留时间很长(通常是一天量级),UDP则短得多。这个差异会带来一个现象:用TCP做的服务测试完隔天再测,转换表里可能还挂着一条旧条目,看起来"卡住了",其实清一下就好。
日常维护上,我建议开启转换日志,把NAT事件送到日志服务器,这样出问题的时候能回溯是谁在什么时间访问了哪个地址,比事后抓包要省事得多。命令不复杂,关键是提前开,事后再开就没数据了。
另外,静态映射表一定要有文档,而且是能一键导出的那种。设备上可以这样快速拉出当前所有NAT规则:
R1# show running-config | include ip nat输出结果直接贴进变更记录,比手工维护表格靠谱。人员流动的时候,这张表就是唯一的真相来源。
5.2 静态NAT的几条硬规矩
第一条,全局地址必须是上游真正路由给你的地址。自己脑补一段地址填进去,除了在实验室里自娱自乐,没有任何意义。判断方法很简单:在上游设备上show ip route看有没有这个地址或者它所在的网段,指向你这台设备。
第二条,不要在一台设备上让同一个全局地址既做静态映射又做地址池成员。这种重叠配置在部分版本上不会报错,但行为是未定义的,出问题极难定位。规划阶段就把地址分好类,接口地址、映射地址、地址池地址各管各的。
第三条,改了内网主机的地址,记得同步改NAT规则。这个看起来是常识,但实际项目里主机地址变更、NAT规则忘改导致业务中断的情况太常见了。我的做法是把NAT规则和主机地址放在同一份配置管理清单里,改一个就检查另一个。
第四条,静态映射上线后,从外部做一次完整验证,不要只在设备上show。设备上看到转换表存在,只能说明规则在那儿,说明不了外部能不能真的访问到。验证要覆盖三个方向:外部主动访问、内部主动外访、以及大包和小包(验证MTU的影响)。很多"能ping通但传不了文件"的问题,就是MTU在中间环节被卡住了。
最后分享一个小技巧。如果外部访问时通时不通,先别怀疑NAT,去看上游是不是有多条路径。静态NAT依赖双向流量经过同一台设备,一旦去和回走了不同的路径,回程包到达的设备上没有对应的转换表项,会直接丢弃。这种问题在单机上怎么查都是好的,只有查上游拓扑才能发现。遇到"时通时不通"这种玄学现象,第一反应应该是查路径对称性,而不是反复改NAT规则。
我在实际配置中最深的体会是:静态NAT的命令五分钟就能学会,剩下的时间全花在地址规划和路径确认上。把这两件事在动手之前想清楚,后面的配置就是照着表抄一遍的事。