干网络这一行,谁还没被NAT坑过几次?我记得有一次深夜割接,客户在群里发来一张抓包截图,内网用户访问一个视频服务卡成幻灯片,公网侧却完全正常。排查到最后,问题出在出口路由器上一条NAT策略的端口复用方式没选对,导致大量并发会话被挤在同一个公网端口上互相踩踏。那一晚上我盯着NAT地址映射表翻来覆去看了三个小时,才真正把静态NAT、动态NAT、NAPT、Easy-ip这些看似基础的东西吃透。
说实话,NAT(Network Address Translation,网络地址转换)大概是所有网络工程师最早接触、也最容易被低估的技术。很多人觉得NAT不就是把私网地址换成公网地址嘛,配置几条命令就完事。但真到排障的时候,你就发现里面藏着大量细节:映射表项怎么生成、老化时间怎么调、回流流量怎么处理、双出口下选路和转换的先后顺序、虚拟化环境里hyper-v虚拟交换机NAT和桥接的差异、甚至防火墙vsys系统里的路由环路风险,全是在教科书上写得轻描淡写、实际却让人头疼的东西。
这篇文章我想把NAT从基础概念到实际排障的完整链路梳理一遍,覆盖静态NAT、动态NAT、NATServer、NAPT、Easy-ip这几种主流形态,再把NAT地址映射表的查看方法和常见问题排查经验拿出来分享。适合刚入门的朋友建立完整认知,也适合有几年经验的老手对照自己的理解查漏补缺。
1. NAT到底是什么:一个把地址"翻译"成另一个地址的机制
1.1 NAT的本质:像公司前台的访客登记
NAT说白了就是一台设备在IP报文转发过程中,把报文头里的源地址(或目的地址)改写成另一个地址。为什么要改写?最直白的理由是:IPv4地址不够用了。私网地址段(比如192.168.0.0/16、10.0.0.0/8、172.16.0.0/12)可以在公司内部随意使用,但出了你的网络,运营商的骨干网上根本不认这些地址。所以你必须在网络的出口设备上,把内网一堆私有地址统一映射成公司买来的那几个公网IP,报文才能正常发到互联网上。
用一个生活化的类比:NAT就像公司前台的访客登记制度。外访客(公网IP)要进公司找人,前台先打电话确认、登记身份证,然后发一个临时访客牌(映射后的公网地址),访客离开时再回收。内网员工要出去办事,前台核验身份后给一张门禁卡(转换后的源地址),回来的时候凭卡进入。前台手里的那本登记簿,就是NAT地址映射表。
1.2 为什么必须要NAT:不只是地址不够用
地址节约确实是NAT诞生的初衷,但实际用起来之后,大家发现它的价值远不止于此。
- 隐藏内网结构:对外只暴露一到几个公网IP,内网的真实拓扑、主机数量、操作系统类型默认不可见,攻击者少了很多侦察线索。
- 灵活变更内网规划:只要NAT映射规则不变,内网扩容、调整网段、更换服务器IP,外部用户完全感知不到。
- 实现简单的出入方向控制:在配置NAT甚至NATServer的过程中,你可以顺便限定哪些内网用户可以出去、哪些公网端口可以进来,相当于带了一层过滤能力。
- 解决地址重叠:两家公司合并后如果都用了192.168.1.0/24,在互联时通过NAT改写一方地址就可以避免路由冲突。
不过NAT带来的副作用也很明显:P2P通信困难、端到端透明性被破坏、某些应用层协议(比如FTP的主动模式、SIP携带IP地址的协议)需要额外做ALG处理。这些副作用造成了后来大量的优化技术,也让IPv6的推进有了更硬的理由。
1.3 一句话分清五种NAT形态
在真正上手配置之前,先把框架搭起来。NAT按转换方向和复用方式,通常分成以下几类:
- 静态NAT(Static NAT):一个内网地址固定映射一个公网地址,一对一,双向主动发起都支持。
- 动态NAT(Dynamic NAT):内网地址从公网地址池里动态获取一个映射,也是一对一,但映射关系不固定。
- NAPT(Network Address Port Translation):也叫PAT或端口复用,多个内网地址共用一个或几个公网IP,靠端口号区分不同会话,这是企业出口最常用的方式。
- Easy-ip:NAPT的一种简化形态,直接复用出接口的公网IP地址作为转换后的源地址,不需要额外配置地址池。
- NATServer(端口映射/服务器映射):把公网IP的某个端口映射到内网某台服务器的IP和端口,让外部用户主动访问内网服务。
后面我逐一展开讲,同时会结合NAT地址映射表来说明每种形态下会话是怎么记录的。
2. 静态NAT与动态NAT:一对一的两种玩法
2.1 静态NAT:给服务器发一张长期出入证
静态NAT的配置最简单,就是在出口设备上建立一条固定的"内网IP—公网IP"绑定关系。我最常用的场景是把内网web服务器、邮件服务器、ERP系统发布到公网,且这些服务器需要被外部设备稳定访问。因为是一对一绑定,公网用户在访问指定的公网IP时,报文的目的地址被改写成对应的内网IP,服务器回程时源地址又被改回去,全程不需要端口变化。
以华为VRP为例,在接口视图下配置:
interface GigabitEthernet0/0/0 ip address 202.100.1.1 255.255.255.0 nat static global 202.100.1.2 inside 192.168.1.10 nat static global 202.100.1.3 inside 192.168.1.11这里的global地址必须是设备上真实可路由的公网地址,可以是接口主地址,也可以是额外绑定的公网地址段。华三的设备命令类似但稍有区别,一般是在接口下用nat static outbound 192.168.1.10 202.100.1.2这种方向性写法,本质是一样的。
静态NAT的好处是可控性强、排障直观。看到某个公网IP的流量,你立刻知道它对应哪台内网机器。坏处也很明显:如果你有1000台内网终端,就必须拥有至少1000个公网IP,这在一开始地址资源紧张的大背景下就是奢侈行为。所以静态NAT通常只用在数量有限的服务器场景。
2.2 动态NAT:地址池里的短时租约
动态NAT解决的场景是:机构有一小段公网IP,但内网同时上网的终端数量比这段地址多,且大多数终端不需要被外部主动访问。动态NAT允许内网用户上线时从公网地址池中临时领用一个公网IP,会话结束或老化后释放,供其他人复用。
配置上通常要配合一个ACL(访问控制列表)来界定哪些内网IP可以被转换,再用一个地址池定义可用的公网IP范围。
acl number 2000 rule 5 permit source 192.168.1.0 0.0.0.255 nat address-group 1 202.100.1.10 202.100.1.20 interface GigabitEthernet0/0/0 ip address 202.100.1.1 255.255.255.255 nat outbound 2000 address-group 1 no-pat注意最后一行末尾的no-pat,意思是只做地址转换,不做端口转换,即一对一的动态映射。如果你不加no-pat,设备会自动退化为NAPT模式,靠端口复用来区分更多会话。
动态NAT的真实存在感其实越来越低,因为对于"内网终端上网"这个最主要需求,NAPT一个公网IP就能解决,根本不需要一个地址池。动态NAT更多出现在旧文档、老考试题以及某些特殊的客户专线需求中。但从理解NAT原理的角度,它依然很有价值——你在NAT地址映射表里会看到动态NAT的表项是"活的",空闲超时后就会被回收。
2.3 静态和动态NAT的实战注意点
在配置静态NAT和动态NAT时,有几个容易被忽视的地方:
- 静态NAT全局与接口绑定的优先级不同,华为VRP后面版本推荐在接口下配置,便于与策略路由、QoS、流量统计联动。
- 如果内网服务器同时还要访问外网,不要忘了配置回程路由。静态NAT的回程报文会查找路由表,如果缺一条指向内网网段的明细路由,映射后的报文根本到达不了服务器。
- 动态NAT地址池的地址不能与接口地址冲突,也不要跟对端运营商分配的地址段有重叠,否则会出现地址冲突的黑洞现象,排查起来极其烦躁。
- 当你同时配置静态NAT和动态NAT,并且ACL放通的范围有重叠时,华为设备默认优先匹配静态表项,这一点在故障判断时要能想到。
3. NAPT与Easy-ip:端口复用,NAT真正的大招
3.1 NAPT的原理:用同一个公网IP扛起整个内网
绝大多数企业上网用的都是NAPT,也叫PAT、端口复用。它的核心是:多个内网用户共享同一个公网IP,但每个连接使用不同的源端口来区分。这样一台公网IP理论上可以提供65536个端口,扣除保留和已用端口,同时支撑上千上万个TCP/UDP会话是完全可以做到的。
我看到很多新人会问:"端口就那么多,如果内网同时发起的连接超过端口数量怎么办?"实际上绝大多数场景不会触顶。单个用户的网页浏览、即时通讯、视频会话通常只消耗几个到十几个端口,而且会话空闲后60秒到5分钟不等就会被老化回收。真正触发端口耗尽的是P2P下载、大并发连接抓包测试、或者某个内网中了蠕虫病毒疯狂外连的情况。真要是遇到,你的NAT会话表会迅速膨胀,设备CPU和内存双双告警。
3.2 Easy-ip:把出接口地址直接当公网池
Easy-ip是NAPT最省事的一种实现。它不需要专门配置地址池,直接用路由器出口接口的公网IP作为转换后的源地址。比如你家宽带路由器拨号后获得的动态公网IP是100.100.100.100,所有内网设备上网时源地址都变成这个IP,只是端口各异。
华为VRP上的配置只有两行:
acl number 2000 rule 5 permit source 192.168.0.0 0.0.0.255 interface GigabitEthernet0/0/0 nat outbound 2000注意这里nat outbound 2000后面没有address-group参数,就是Easy-ip模式。如果后面跟着address-group 0或address-group 1,则代表引用一个地址池,两者完全不同。我排查过一个案例,客户明明配置了nat outbound 2000 address-group 0,但地址池0里并没有定义公网地址,结果大量流量没有完成转换,表现为部分网站可以打开、部分网站超时,这就是地址池引用错误导致的经典故障。
3.3 NAPT和Easy-ip的差异,用一个表格说清楚
| 对比维度 | NAPT(带地址池) | Easy-ip(出接口复用) |
|---|---|---|
| 公网源地址来源 | 从nat address-group地址池中挑选 | 直接使用出接口公网IP |
| 地址池配置 | 需要额外配置 | 不需要 |
| 公网IP数量 | 可以配置多个,同时提供负载分担 | 通常只有一个 |
| 适用场景 | 拥有多个公网IP的机构或专线出口 | 家庭宽带、小型办公、动态拨号 |
| 源端口复用 | 是 | 是 |
| 配置复杂度 | 略高 | 极低 |
实际项目里,专线客户通常有多个公网IP,我会建议用NAPT带地址池,因为一旦某个公网IP被应用服务商封禁或限制,可以通过调整地址池快速切换出口源IP。而家庭宽带或小门店就无所谓了,Easy-ip最省心。
3.4 NAPT会话建立的完整过程
用一个小例子演一遍:内网PC(192.168.1.100:12345)访问公网服务器(8.8.8.8:80)。报文到达出口路由器后,路由器查找NAT映射表,发现这个五元组还没有对应表项,于是从NAPT地址池中挑选一个公网IP(比如202.100.1.10),为该会话分配一个未占用的源端口(比如4096),填入映射表项,然后改写报文源地址为202.100.1.10:4096,转发出去。公网服务器回包的目标地址是202.100.1.10:4096,路由器查表后反译为192.168.1.100:12345,送还给内网PC。
核心就在那张映射表。如果表里没有对应表项,回程报文就会被当作未知流量丢弃。这也是为什么很多NAT故障表现为"能出去、回不来"——要么表项老化太快,要么回程路径经过的设备上没有NAT表。
4. NATServer:把内网服务安全地发布到公网
4.1 NATServer解决的痛点
内网服务器没有公网IP,但你又希望外网用户能够访问它的HTTP、HTTPS、SSH等服务,这就是NATServer的用武之地,也常被称为端口映射、端口发布。它的原理是在出口设备上建立一个"公网IP:端口 → 内网IP:端口"的固定映射,外部用户访问公网IP的该端口时,报文目的地址被改写并送往内网服务器。
华为VRP的配置示例:
interface GigabitEthernet0/0/0 nat server protocol tcp global 202.100.1.1 80 inside 192.168.1.10 8080这条命令的含义是:外部访问202.100.1.1的TCP 80端口时,设备把目的地址改写成192.168.1.10,端口改写成8080。这样内网服务器可以用非80端口跑web服务,减少一些扫描关注度。
华三设备上的写法通常是nat server protocol tcp global 202.100.1.1 80 inside 192.168.1.10 8080,思科则是ip nat inside source static tcp 192.168.1.10 8080 interface GigabitEthernet0/0/0 80,形式不同,逻辑一样。
4.2 NATServer配置之后,别忘了"回流"问题
NATServer配置完之后,最容易碰到的经典坑就是"内网用户访问不了自己发布的网站",也就是热词里常说的"nat回流"。
原因是这样:内网PC访问公网域名,DNS解析出公网地址202.100.1.1,报文发到网关。如果网关只做了出方向的源NAT,没有针对该公网IP的入方向映射,这个去往202.100.1.1的报文会被当作外网流量继续转发到运营商,运营商又把流量送回来,形成一个路由死角,最终访问失败。
解决回流有几种主流思路:
- 在NATServer配置基础上,额外配置一条目的NAT(DNAT)规则,让内网访问公网IP:80的报文也被改写到内网服务器。
- 启用运营商设备的NAT hairpin功能(通常叫"NAT回环"或"发夹NAT"),让内网访问外网地址的流量在设备内部完成转换并送回内网。
- 在DNS侧做内网分流,把内网用户访问的域名解析结果直接解析成服务器内网IP,但这样不利于统一运维。
我最推荐的是在出口防火墙上把NATServer和源NAT配合使用,对内网用户访问公网IP的报文同时做目的转换和源转换,这样既解决回流,也保证回程流量能正确返回发起方。比如华为NGFW上可以写安全策略并开启nat server的no-reverse选项,再配一条nat outbound让内网到untrust区域的流量做源转换,两者叠加就能很好地覆盖内外网用户。
4.3 NATServer的扩展玩法
NATServer不局限于单一端口映射,还支持端口段映射。比如把公网IP的10000-20000端口段映射给内网的同一段端口,这对于游戏服务器运营非常实用。
nat server protocol tcp global 202.100.1.1 10000 20000 inside 192.168.1.20 10000 20000另外要注意,NATServer的global地址如果不指定端口,默认是全端口映射,相当于把整个公网IP指向内网一台服务器,这样会暴露大量端口,安全隐患较大。一般建议精确到端口,结合安全策略把端口开放范围缩到最小。
5. NAT地址映射表:排障时最需要看懂的表
5.1 一张NAT表项里到底装了什么
不管用了哪种NAT形态,设备内部都会维护一张NAT地址映射表,也叫会话表项。这张表是整个地址转换机制的心脏。一条典型的表项大概包含这些信息:
- 协议类型:TCP、UDP、ICMP等。
- 转换前地址:内网主机的IP和端口(源NAT)或目的公网地址和端口(目的NAT)。
- 转换后地址:经过NAT改写后的IP和端口。
- 接口信息:报文的进出接口、所属安全区域。
- 会话状态:TCP会话的SYN、ESTABLISHED、FIN、CLOSE状态等。
- 老化时间:表项最后一次被命中的时间,超过老化时间后表项会被清理。
以华为设备为例,查看NAT会话表的命令是:
display nat session输出会详细显示每条会话的转换前后五元组。而在防火墙上,更常用的可能是:
display firewall session table这两个命令展示的都是"当前正在进行的活跃连接"。注意区分会话表和配置表(display nat outbound),配置表是你写的策略规则,会话表是实际产生的连接记录,两者配合才能定位问题。
5.2 表项老化与维护机制
NAT表项的每条会话都有一个老化时间,超过老化时间没有流量命中,表项就被删除。不同厂商、不同协议的默认老化时间有差异,TCP多为5分钟(华为VRP上是600秒),UDP更短一些(通常60秒左右)。ICMP因为没有连接状态,老化时间一般更短(10-30秒)。
这些老化时间并不是越大越好。老化时间太长,设备内存里堆积大量僵尸会话,表项空间被吃光,新会话无法建立;老化时间太短,长连接(比如SSH会话、数据库连接、视频直播推流)可能因为中间空闲几秒就被清掉,导致连接中断。
我处理过一类典型的"视频会议掉线"问题:会议终端和服务器之间每隔20秒发送一次保活包,恰好卡在老化时间边界附近,只要网络抖动一次,保活包没送到,会话就被清了。解决的方法很直接,把设备上对应UDP端口的老化时间调大,或者修改NAT老化配置,让长连接会话更稳定。
5.3 用NAT表排查问题的几个实用思路
在实际排障中,我一般遵循这样的顺序:
- 先看配置表(
display nat outbound、display nat server),确认策略确实存在且放通的ACL范围和地址池正确。 - 再看会话表(
display nat session),确认报文是否真的命中了NAT转换。如果会话表中只有内网到外的正向表项,没有回向表项,通常是回程方向没走同一台设备。 - 如果会话表里能看到转换前后地址,但业务依旧不通,抓包确认回程报文的目的IP是否是转换前的私网地址,若是,说明报文中途绕行了,NAT没生效。
- 查看NAT映射表的统计计数(
display nat session statistics、display nat outbound statistics),看是否有丢弃的报文,命中数是否为0,这能快速定位到策略根本没有被触达。
6. 常见问题与排查技巧实录
6.1 排查NAT问题的三板斧
NAT问题虽然表现五花八门,但归纳下来逃不出三种原因:策略配错、路径不对、表项老化。对应的排查三板斧如下:
- 抓包定位:在内外网两侧同时抓包,对比转换前后的IP和端口变化。内网能抓到PC发出的原地址报文,外网侧却看不到,说明NAT没命中;外网侧能抓到转换后的报文但回包没回来,问题大概率在路由或对端防火墙。
- 看会话表确认命中:会话表里没有对应表项,是策略没有命中或ACL没放通;会话表有表项但报文仍然不通,就要查路由和上下游设备。
- 关掉NAT做对比测试:在不影响业务的窗口期,临时把NAT策略摘除,直接使用真实IP互访。如果通了,说明NAT策略本身有问题;如果不通,问题根本不在NAT。
自己的经验是,大部分看似NAT的问题,最后其实都是路由或安全策略的问题。NAT只是那个"替你背锅"的角色。
6.2 双出口与策略路由下的NAT匹配问题
现在的企业组网很多是双运营商出口,移动和电信各拉一条专线。在这种拓扑下,NAT配置要注意选路和转换的先后顺序。
设备处理报文的顺序通常是:先查路由/策略路由,确定从哪个接口出去,然后再做该出接口上的NAT转换。如果你在电信出口配置了nat outbound只转换电信的地址池,但策略路由把流量引到了移动出口,就会导致流量没做转换就发出去了,内网私网源地址直接裸奔到公网,业务当然不通。
排障时如果发现双出口下某条链路流量异常,先确认策略路由是否命中了目标网段,再看对应出口接口的NAT统计是否有转换记录。更常见的坑是策略路由把特定流量引走之后,NAT策略却只写在物理接口上,而经过策略路由出接口的报文没有匹配到任何NAT规则。这时需要在出接口或者全局策略上补充对应的NAT规则。
6.3 虚拟化环境与负载均衡设备中的NAT形态辨析
现在很多朋友在搞虚拟化、云计算,热词里的"hyper-v虚拟交换机nat"、"centos8桥接和nat"就是这类场景。以微软Hyper-V为例,它内置的Default Switch(默认交换机)就是一个NAT模式的虚拟交换机。虚拟机通过这个交换机上网时,宿主机自动分配一个私有网段(通常是172.16.x.x),虚拟机发往外网的流量由宿主机的WinNAT组件完成地址转换。如果你需要自定义网段,可以用PowerShell创建新的NAT网关:
New-NetNAT -Name "MyNAT" -InternalIPInterfaceAddressPrefix 172.16.0.0/12这种方式和真实路由器的NAPT原理完全一致,只是承载者变成了Windows主机的虚拟网络组件。
再比如F5 BIG-IP负载均衡设备里的NAT概念,和普通路由器里的NAT要仔细区分。F5中的NAT通常指目的地址转换,和虚拟服务器(Virtual Server)一样实现DNAT,但它和SNAT(源地址转换)不同。如果你做的是SNAT全地址池转换,可以近似理解为多公网IP的NAPT。调试F5上的NAT问题时,我最常踩的坑是忘了区分"客户端到虚拟服务器的DNAT"和"服务器回程时SNAT的地址池",结果回包源地址不对,被后端服务器拒收。
CentOS里配置VM虚拟机的桥接和NAT的区别也值得提一句:桥接模式下虚拟机直接占用物理网络地址,就像一台独立主机;NAT模式下虚拟机走的是宿主机的网络地址转换,外部设备看不到虚拟机真实IP。两者安全性和灵活性完全不同,很多初学者搞混。
6.4 运营商级NAT对普通用户的影响
还有一个越来越常见的场景是电信级NAT(CGN,Carrier-Grade NAT)。运营商会使用保留地址段100.64.0.0/10给普通宽带用户分配地址,然后在运营商侧再做一次大范围的NAT,把大量用户共享到少量公网IP上。你会发现自己的宽带猫上获得的WAN口IP不是真正的公网IP,而是100.64.x.x这样的运营商内网地址。
这种情况下,内网自己再做一层NAT就是嵌套NAT(双NAT),对端口受限型应用影响很大。比如P2P下载、部分游戏联机、SIP语音通话很容易出问题。遇到这种场景,最好的选择是给运营商打电话申请公网IP,或者在业务架构上改用主动外连方式,避免被动的公网访问需求。
6.5 防火墙vsys虚拟系统中的NAT路由环路风险
最后聊一个进阶一点的坑:防火墙虚拟系统(vsys)中的NAT配置。现在高端防火墙支持虚拟化,一台物理防火墙可以划分出多个虚拟系统,每个vsys拥有独立的接口、路由表和安全策略。在这种架构下配置NAT,如果规划不好,容易出现NAT路由环路。
典型的场景是:VSYS-A和VSYS-B共享物理接口,VSYS-A对访问某个目的地址的流量做了NAT,转换后的地址回程时却查到了VSYS-B的路由表,被转发到VSYS-B,而VSYS-B又因为存在相应的目的NAT规则,把报文又转回VSYS-A,一来一回就形成了环路。这种故障的表象是访问时通时不通,CPU飙升,抓包能看到TTL逐渐减小、报文反复出现。
避免这个问题的核心思路是:让NAT转换后的流量路径尽量保持"有去有回、路径一致"。在规划vsys时,尽量把内网接口和公网接口规划在同一个虚拟系统内,避免跨vsys转发NAT流量。如果必须跨vsys,则要仔细核对各个vsys的路由表和NAT策略,必要时通过静态路由或黑洞路由来切断环路。
6.6 一个印象深刻的NAT表排版经典案例
我再分享一个真实的排障案例。客户反映每隔一段时间,办公网就会集体卡顿几十秒,然后又自动恢复。我去查NAT会话表的时候,发现表项数量在短时间内飙到十几万条,然后成批消失。顺着抓包一看,原来是内网有一台PC中了木马病毒,疯狂向外发起大量TCP连接请求,瞬间打爆了NAT表项空间。设备为了保证转发性能,开始随机淘汰老会话,导致正常员工的连接不断被重置,造成"集体卡顿、间歇抽风"的假象。
这个案例说明,NAT表项其实是出口设备一项非常宝贵的资源。平时我会在关键网关设备上开启NAT会话告警,当表项使用率超过80%时提前收到通知,避免问题恶化到业务受损。另一个习惯是定期检查NAT老化时间设置,不要一味调大,也不要放任默认值不管,最好结合业务实际做一次梳理。
7. 最后说几句我自己的体会
NAT技术看似传统,但这些年依然在不断演进。从最早的静态一对一,到现在各类防火墙、负载均衡、云平台里的SNAT、DNAT、Full NAT、Hairpin NAT,本质还是一张映射表和一套完整的生命周期管理流程。你只要把这张表看懂了,几乎所有NAT问题都能在两三步之内定位到根因。
我自己的工具箱里,最常用的三个能力是:第一,快速看懂各类设备上的NAT配置和会话表;第二,熟练使用抓包工具对比转换前后特征;第三,养成在割接前画清拓扑、写明NAT转换关系的习惯。每次割接前把"谁转成谁、从哪个口进、从哪个口出"写成文字,真正执行时能省掉大量返工。
如果你对这篇文章里提到的某个细节有疑问,或者遇到过更奇葩的NAT故障,也欢迎交流。网络这行就是一个不断埋坑、填坑的过程,多踩几次坑,经验自然就扎实了。