
搞网络这一行天天跟NAT打交道但说句实话能把源NAT讲清楚、配置不出幺蛾子的人其实不多。很多刚入门的朋友一听“源NAT”就懵这不就是把内网地址换成公网地址吗有啥好讲的等你真正在项目里遇到回流不通、会话表爆掉、FTP传不了文件、内网访问自己公网IP卡死这些问题就知道源NAT远没有表面那么简单。这篇文章不聊虚的直接把源NAT从原理到配置、从踩坑到排查一次讲透。不管你是在企业网管、数据中心运维还是刚学路由交换准备考证这篇文章都值得你收藏起来慢慢看。我会用我自己实际项目里的配置案例来讲照着敲基本能复现遇到的坑也都写在后面。1. 源NAT到底是什么——先别急着敲命令1.1 NAT家族里为什么单独拎出源NATNAT的全称是Network Address Translation中文叫网络地址转换。它不是一个单一功能而是一整个家族。通俗点说凡是在报文转发过程中把IP头里的地址字段“偷偷换掉”的技术都算NAT。常见的包括源NAT、目的NAT、双向NAT、静态NAT、NAT Server等。很多人分不清它们的区别其实记住一个判断标准就行看转换的是源地址还是目的地址。源NAT英文叫Source NAT转换的是报文的源IP地址。典型场景就是内网PC上网PC发出去的报文源地址是192.168.1.10这种私网地址到了出口设备上设备把源地址改成公网地址再扔出去。目的NAT正好反过来转换的是目的IP地址典型场景是外部用户访问内网服务器设备把报文的目的地址从公网IP改成服务器的私网IP。那为什么网工圈子里经常把“源NAT”单独拎出来说因为在一个实际项目中源NAT的配置量最大、变化最多、踩坑概率最高。目的NAT通常就是几条server映射而源NAT要根据上网用户量、地址池大小、出口链路数量反复调整。再加上现在的组网里还有回流、多出口、VRF这些复杂场景源NAT一旦配错影响面是整片内网。1.2 源NAT解决的现实问题从地址不够到安全隔离往深了说源NAT存在的根本原因是IPv4地址不够用。IANA分配的私网地址段10.0.0.0/8、172.16.0.0/12、192.168.0.0/16可以在内网随便用但这些地址在公网不可路由。如果内网几百号人都用一个公网IP上网靠的就是源NAT里的端口复用技术。举个例子公司只有一条宽带运营商只给了一个公网IP但全公司200号人、300多台设备都要上网。没有源NAT这活根本干不了。源NAT把200个私网地址全部映射成同一个公网IP靠不同的源端口区分不同用户。这就是我们常说的PATPort Address Translation也叫端口复用或NAPT。但源NAT的价值不只是“省地址”。从安全角度看源NAT天然把内网结构隐藏了。外部网络看不到内网真实IP等于多了一层隐身衣。很多安全设计里源NAT是配合防火墙策略一起用的。另外当企业换了运营商或者出口IP变动时只要源NAT的映射方式不变内网用户几乎无感知。这些都是源NAT在实际项目里的隐性价值。2. 源NAT的核心原理与实现机制2.1 一张会话表如何撑起千万级转发源NAT的本质其实很简单在报文出去的瞬间改掉源IP和源端口然后在设备上记录一条映射关系等回程报文进来时根据这条记录把目的IP和目的端口改回去交给内网用户。这条记录就是NAT会话表也叫NAT Session表。拿一个实际报文流来走一遍就清楚了。内网主机192.168.1.100要访问公网服务器8.8.8.8的80端口出口设备公网接口IP是203.0.113.5。报文到达出口设备时源IP是192.168.1.100源端口是1025。设备查找出接口发现要做源NAT于是把源IP改成203.0.113.5源端口改成50001然后在会话表里记一条192.168.1.100:1025 - 203.0.113.5:50001。服务器收到报文以为真的是203.0.113.5:50001发出的正常回包。回包到了出口设备目的地址是203.0.113.5:50001设备查会话表找到对应的内网主机192.168.1.100:1025把目的IP和端口改回去报文成功送达。整个过程对内网主机来说完全透明它甚至不知道自己的报文在外网“换了马甲”。这里有个关键点所有源NAT必须是有状态的。设备必须维护这张会话表而且是双向的。如果会话表老化或者丢了回程报文就找不到回家的路连接就会被切断。这也是源NAT和普通路由转发最大的区别——普通路由是无状态的每个报文独立转发NAT是强状态依赖的表项一丢失连接必断。2.2 Easy IP、地址池、静态映射怎么选源NAT有三种主流实现方式实际选型时很多人拿不准这里一次性讲透。第一种叫Easy IP也叫借用出接口地址。就是直接把出接口的公网IP作为转换后的源地址不需要额外配置地址池。这是小规模网络最常用的方式比如家庭宽带、小型办事处。配置简单但缺点也很明显如果出口是PPPoE拨号公网IP是动态的也没关系因为它永远跟随出接口地址。第二种叫NAT地址池Address Group预先配置一段公网IP比如203.0.113.10到203.0.113.20源NAT时从池里挑一个地址使用。这种方式适合公网IP较多的中大型网络。可以配合不同的转换模式比如NO-PAT只转IP不转端口和PATIP和端口都转。NO-PAT的好处是公网侧能直接看到内网真实源IP便于审计但公网IP消耗大通常用于专线场景。第三种叫静态源NAT是一对一的固定映射比如内网10.0.0.10固定映射成203.0.113.6。这种方式适用于需要固定公网源地址的业务比如对接第三方支付接口时对方要求来源IP固定白名单。静态源NAT可以单独配置也可以和服务器映射配合使用。我个人的选型经验是不确定性优先Easy IP确定性优先地址池有合规审计需求就上静态或NO-PAT。别一上来就搞复杂的地址池完全没必要。2.3 与目的NAT、双向NAT的分工边界前面说过源NAT转换源地址目的NAT转换目的地址。但在实际配置中它们经常同时出现而且顺序非常讲究。一个报文从内网到外网通常先做目的NAT如果有再做源NAT。反过来从外网到内网先做目的NAT再根据会话表做反向转换。双向NAT是源和目的都转常见场景是两个私网通过公网互访。比如A公司内网192.168.1.0/24和B公司内网10.0.0.0/24通过公网通信两边私网地址重叠。这时A公司访问B公司时源地址和目的地址都得改才能避免路由冲突。我见过不少人在这个场景里配得一头雾水其实记住一个原则双方向都要有明确的NAT规则而且会话表的建立必须成功否则就是配了源NAT忘了目的NAT或者反过来。简单的判断方法是画一张双向流量图。从左到右走一遍看源地址和目的地址分别在哪个节点变了再从右到左走一遍确保逆向能还原。任何一边断掉连接都不通。3. 实战配置从需求梳理到命令落地3.1 场景设定与地址规划我自己最近在做一个企业分支的出口改造项目拿这个场景举例非常典型。需求如下企业内网有192.168.1.0/24的用户网段和10.0.0.0/24的服务器网段。出口一台华为AR系列路由器运营商给了两个公网IP一个用于用户上网203.0.113.5一个用于服务器对外发布203.0.113.6。用户上网要求做源NAT服务器发布要求做目的NAT还要求内网用户能通过公网IP访问自己的服务器。这个场景基本涵盖了源NAT配置的所有核心操作。地址规划如下区域网段/地址说明内网用户192.168.1.0/24终端、办公网段内网服务器10.0.0.10Web服务器出口设备公网接口203.0.113.5/24连接运营商运营商分配公网IP2203.0.113.6服务器映射用内网网关192.168.1.1路由器LAN口服务器网关10.0.0.1路由器LAN口接入拓扑就是一台路由器两个LAN接口一个接用户一个接服务器一个WAN接口接运营商。这种组网在中小型企业非常常见。3.2 华为AR系列源NAT配置Easy IP模式在华为设备上最简单的源NAT配置就三步配ACL、配NAT出接口策略、应用在接口。我以第一个需求“用户网段上网”为例敲一遍完整配置。第一步配置接口IP和路由。这里假设GigabitEthernet0/0/0是LAN口接用户GigabitEthernet0/0/1是LAN口接服务器GigabitEthernet0/0/2是WAN口接运营商。interface GigabitEthernet0/0/0 ip address 192.168.1.1 255.255.255.0 # interface GigabitEthernet0/0/1 ip address 10.0.0.1 255.255.255.0 # interface GigabitEthernet0/0/2 ip address 203.0.113.5 255.255.255.0 # ip route-static 0.0.0.0 0.0.0.0 203.0.113.254第二步定义源NAT的匹配条件。华为设备通常用ACL来决定哪些流量做NAT。注意这个ACL不是用来过滤的它只负责“圈出”需要做转换的源地址范围。acl number 2000 rule 5 permit source 192.168.1.0 0.0.0.255第三步在WAN接口上启用NAT outbound。Easy IP模式下不用指定地址池直接复用出接口地址。interface GigabitEthernet0/0/2 nat outbound 2000这里特别说明一下nat outbound 2000的含义是匹配ACL 2000的报文从GigabitEthernet0/0/2出去时把源地址转换成出接口的IP地址并用端口区分不同用户。默认就是PAT模式。配置完成后用display nat session查看会话能看到用户访问外网的记录。注意ACL 2000是基本ACL只能用source字段。如果需求更复杂比如排除某些目的地址不做NAT就要用高级ACL3000以上来匹配源和目的。3.3 地址池模式、静态源NAT与服务器发布如果运营商给了多个公网IP或者有“多个源地址轮询”的业务需求就需要上地址池。地址池配置也不难我一般这样写nat address-group 1 203.0.113.10 203.0.113.20 # acl number 2000 rule 5 permit source 192.168.1.0 0.0.0.255 # interface GigabitEthernet0/0/2 nat outbound 2000 address-group 1这样配置后192.168.1.0/24的用户上网时源地址会从203.0.113.10到203.0.113.20这11个IP里挑。默认也是PAT模式一个大地址池可以支撑上万并发连接一般的分支办公完全够用。静态源NAT的配置更简单直接把内网地址和公网地址绑定nat static global 203.0.113.6 inside 10.0.0.10 netmask 255.255.255.255这条命令的含义是10.0.0.10这台内网服务器对外的固定公网地址是203.0.113.6。注意这是双向的从10.0.0.10出去的报文源地址会变成203.0.113.6从外网访问203.0.113.6的报文目的地址会被改回10.0.0.10。静态NAT天然就是双向映射不需要额外配目的NAT。不过实际项目中我更推荐把“服务器对外发布”和“服务器上网”分开做。比如Web服务器对外的目的NAT用nat server命令服务器访问外网的源NAT单独控制interface GigabitEthernet0/0/1 nat server protocol tcp global 203.0.113.6 80 inside 10.0.0.10 80nat server配置的是目的NAT实现外部用户访问203.0.113.6的80端口时自动转到10.0.0.10的80端口。这条命令和静态NAT的区别在于nat server只短暂转换目的地址不会影响服务器主动访问外网时的源地址。很多新手把这两个概念混在一起结果配出来的效果跟预期完全不一样。3.4 Linux iptables、Cisco等环境的快速对照虽然我主力环境是华为设备但Linux服务器做NAT的场景也很常见比如一台双网卡的主机当网关。iptables的源NAT配置逻辑完全一样只是命令不同。Linux上做源NAT用SNAT或MASQUERADE。固定公网IP用SNATiptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth1 -j SNAT --to-source 203.0.113.5拨号上网动态IP用MASQUERADEiptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth1 -j MASQUERADEMASQUERADE每次连接建立时自动获取出口IP代价是性能略低。如果是高流量场景固定IP建议尽量用SNAT。Cisco IOS的配置也顺手提一下access-list 1 permit 192.168.1.0 0.0.0.255 ip nat inside source list 1 interface GigabitEthernet0/0/2 overloadinterface GigabitEthernet0/0/0 ip nat inside interface GigabitEthernet0/0/2 ip nat outsideCisco的习惯是要明确标出哪个接口是inside、哪个是outside华为设备默认不需要这个。各家厂商的命令风格不同但底层原理是一样的学会了华为的配置看其他厂商文档基本能无痛切换。4. 配置之外的三个容易踩爆的坑4.1 NAT回流内网访问自己公网IP为什么会断这是源NAT配置里最容易翻车的一个场景。很多企业配好了服务器对外发布外网用户访问203.0.113.6:80一切正常但内网用户用同一个公网IP访问自己的服务器就是不通。原因就是报文根本没走“预期”的路径。内网用户访问203.0.113.6时报文到了出口路由器。本来应该做目的NAT把203.0.113.6改成10.0.0.10。但路由器查路由表发现203.0.113.6是自己直连网段的地址于是直接把报文从WAN口丢给运营商去了。运营商再把报文送回来结果被防火墙或路由器当作外部流量处理来回绕圈子通了才怪。这就是典型的NAT回流问题也叫NAT Hairpin或NAT Loopback。解决办法因设备而异。华为设备上常用hairpin或接口下的nat enable modeinterface GigabitEthernet0/0/2 nat hairpin enable开启hairpin后内网用户访问公网IP的报文在设备内部完成目的NAT转换再走内网路由转发到服务器。同时服务器的回包也要做源NAT转换把源地址转成公网IP用户才会认为自己在访问的是一个公网地址。注意开启hairpin后务必测试内网访问公网IP的连通性。有些版本还需要配合出接口的nat outbound规则让回包能正确还原。我自己遇到过开启后流量通了但服务器日志里看到所有访问都来自路由器内网接口地址排查半天才明白是回包源NAT没起来。如果设备不支持hairpin也有替代方案用策略路由把内网访问公网IP的流量重定向到设备自身再做目的NAT和源NAT。不过这种方案配置复杂度高能上hairpin就上hairpin。4.2 NAT叠加与路由环路的隐患NAT还有一个隐患是环路。常见场景是这样的内网服务器网段10.0.0.0/24做了NAT Server同时这个网段又有默认路由指向路由器。当一个外部报文访问203.0.113.6时路由器做了目的NAT转成10.0.0.10然后把报文发到服务器网段。服务器回包时源地址是10.0.0.10目的地址是外部访问者的公网IP。报文回到路由器路由器查路由表发现目的地址是外部网络的要走WAN口出去。这时候如果WAN口上还配置了源NAT规则把服务器的10.0.0.10源地址又转了一次就会导致外部访问者收到的报文源地址变成了203.0.113.6而不是服务器的映射地址。这种情况叫NAT叠加或者叫多次NAT。表现为外部访问时通时断、回包源地址不对、会话表异常增长。排查方法很简单抓包看回程报文的源IP是不是预期地址。如果发现源地址不对检查服务器网段出口是否也做了源NAT必要时在服务器网段接口上配置NAT排除策略。另一种环路更隐蔽VRF或策略路由场景下源NAT后的地址又匹配到了另一个NAT规则形成循环转换。比如A规则把192.168.1.0/24转成203.0.113.1B规则又对203.0.113.0/24做目的NAT转回192.168.1.0/24这俩规则在同一台设备上叠加报文就会在NAT引擎里来回循环直到TTL耗尽。这种问题配置复盘时特别隐蔽光看单条规则都合理合在一起就死循环了。我的排查经验看到会话表里TTL极低或者NAT引擎CPU突然飙高先检查是否有重叠的源NAT和目的NAT规则别急着重启设备。4.3 特殊协议与ALGFTP、ICMP、P2P源NAT对普通TCP/UDP流量处理得非常好但遇到FTP、TFTP、SIP这类协议就会出问题。原因很简单这些协议的数据载荷里携带了IP地址或端口信息而不是只在IP头里。以最常见的FTP为例。FTP有主动模式和被动模式。主动模式下客户端告诉服务器“我用1024端口等你连我”这个信息在FTP控制连接的数据里。如果没有ALGApplication Layer Gateway或者NAT的FTP识别功能源NAT把客户端的源IP从192.168.1.100改成203.0.113.5但FTP数据载荷里写的还是192.168.1.100:1024。服务器按这个地址去连自然连不上。配置方法是在设备上开启对应的ALGnat alg ftp enable nat alg icmp enable nat alg sip enable华为设备默认自动开启大部分ALG但有些老版本或特殊场景下可能需要手动开启。Cisco设备需要在全局模式下配置ip nat service或fixup协议。iptables则依赖内核的nf_conntrack_ftp模块modprobe nf_conntrack_ftp另外ICMP也需要注意。普通ping没问题但带超大payload的ping分片后如果没有正确配置NAT分片重组可能导致分片丢包。P2P软件就更复杂了四层以上的协议识别和NAT穿透一直是难点这也是为什么很多P2P应用要自己在应用层做UDP打洞单纯靠网络设备的NAT是做不了完美的。5. 常见故障排查顺序与案例速查5.1 排查思路从现象到根因的四板斧源NAT的故障我一般按四个步骤排查看会话、看路由、看策略、抓包。顺序不能乱。第一步永远是看会话表。华为设备用display nat sessioniptables环境用cat /proc/net/nf_conntrack或conntrack -L。如果会话表里有对应的转换记录说明NAT配置基本是生效的如果没有说明流量根本没走到NAT引擎问题可能在路由或ACL匹配。第二步看路由。源NAT只转换地址不改变路由决策。报文必须首先能被路由到出接口才会触发NAT转换。很多配置问题其实是路由问题比如内网用户没配默认路由或者出口设备上缺了一条回程路由导致报文到了设备但找不到出接口NAT规则再对也没用。第三步看安全策略。如果出口设备是防火墙源NAT配置正确但接口间的安全策略没放行流量一样被丢弃。防火墙的处理顺序通常是路由查表、安全策略过滤、NAT转换。所以即使NAT配置完全正确策略没放行就是不通。华为防火墙上是security-policyCisco ASA上是access-group这个坑太常见了。第四步才是抓包。用设备自带的抓包工能或外接Wireshark分别在WAN口和LAN口抓。重点看报文进入NAT之前和之后的源IP、源端口变化。如果LAN口抓包源地址正常WAN口抓包源地址没变说明NAT规则没匹配上如果WAN口源地址变了但回包不通重点查会话表老化和安全策略。5.2 故障案例记录老旧化、地址池不足、时通时断案例一长连接频繁断开。现象是内网服务器调用外部API每隔一段时间连接就断重连能恢复。查会话表发现TCP会话老化时间被设置成了60秒而API调用间歇期超过60秒会话就被清掉了。解决办法是把NAT会话的TCP老化时间调长华为设备默认是3600秒某些安全设备可能配得比较激进。这个案例说明出问题先看默认参数别动不动就怀疑协议。案例二地址池耗尽。现象是新用户无法上网PPPoE用户拨号失败老用户正常。display nat address-group看池使用率100%。业务高峰期并发连接数太大PAT模式下一个公网IP最多支持约6万多个端口实际受设备性能限制往往更少如果内网设备数上千一个公网IP根本扛不住。解决办法要么加地址池公网IP要么限制单用户最大会话数。很多企业路由器支持limit-session可以给每个内网IP设置最大并发会话数防止某个用户下载占满整个NAT池。案例三时通时不通。现象是大部分时间正常偶尔访问某些网站失败。抓包发现NAT后的源端口冲突。有些设备NAT分配源端口时没有做周全的可用性检测导致映射出来的端口和会话表里已有端口冲突。解决办法升级设备版本或者调整NAT端口分配策略。低端设备上遇到这种情况有时候重启能好一阵但本质是固件缺陷只能换设备。我把常见的源NAT故障整理成一张速查表方便排查时对照现象可能原因排查重点完全无法上网路由缺失、NAT未匹配、安全策略阻断会话表、路由表、安全策略时通时不通地址池不足、端口冲突、会话老化地址池使用率、会话总数内网访问公网服务器不通NAT回流未配置或配置错误hairpin、双NAT规则FTP传输失败ALG未开启nat alg ftp、conntrack模块外网访问服务器回包源地址不对NAT叠加、服务器自身做了NAT抓包回程报文源地址高并发时NAT CPU飙高规则过多、分片过多、设备性能不足设备CPU、会话速率6. 源NAT的选型与未来演进6.1 何时坚持NAT何时考虑过渡很多人问现在IPv6都推了这么多年了还要不要学NAT配置我的答案是学而且要认真学。现实网络里IPv4和IPv6会长期共存NAT不仅不会消失反而会以各种衍生形态出现在网络中。如果你所在的企业已经开始部署IPv6会接触到NPTv6Network Prefix Translation for IPv6或NAT66。这两者本质上也属于源NAT/地址转换的范畴只是处理的是IPv6前缀。NPTv6只改前缀不改变端口用于地址重编号场景NAT66则类似IPv4的NAT-PT做完整的地址转换。理解IPv4源NAT的会话机制后再学这些概念会轻松很多。选型上我的建议很直接小规模网络用Easy IP省事中大型出口用地址池双层NAT规划有合规审计要求就上静态映射。内网服务器对外发布尽量用NAT Server而不是静态NAT便于和源NAT规则解耦后续维护更灵活。多出口场景建议每个出口配一套独立的源NAT规则并做好会话保持防止用户会话在两个出口之间漂移。6.2 最后分享一点个人心得做了这么多年网络项目我最大的感受是NAT配好不难配好之后不踩坑才难。很多时候你觉得自己已经把原理搞清楚了到现场还是会遇到意想不到的状况。比如客户非要内网和公网用同一个IP段这在实际中太常见了或者两台设备之间做NAT时没有同步会话表导致切换后连接全断。这些问题没有一个标准答案只能靠经验和完整的排查方法论慢慢磨。我现在的习惯是每做完一个NAT项目都会把拓扑、地址规划、NAT规则、排查过程整理成一份文档存档。遇到相似的场景直接翻旧项目对照比临时查手册效率高得多。希望大家也能养成这个习惯网工这行经验就是硬通货。这篇文章里写到的命令和案例都是我个人项目里用过的照着敲大概率能跑通。如果真的遇到配置后不通的情况建议回到第五部分的排查顺序一步一步来大概率能自己解决问题。