1. NAT是什么,为什么非学不可
1.1 从一个真实场景说起
干网络这行最常被非技术同事问的问题就是:“为什么我电脑的IP地址是192.168开头的,但上网查却是另一个地址?”这个问题的答案,就是NAT(Network Address Translation,网络地址转换)。
我最早接触NAT是因为家里要拉宽带,电信师傅只给了一个公网IP,但家里要联网的设备至少有手机、电脑、平板、电视盒子好几台。总不能每台设备都去运营商申请一个公网IP吧?先不说费用,IPv4地址总量就43亿个左右,全球几十亿人分,压根不够分。NAT解决的就是这个核心矛盾:让一大群内部设备,共享一个或少数几个公网IP上网。
如果你在学校考网络工程师证书、期末复习计算机网络,或者在公司里配防火墙、路由器、出口网关,NAT都是躲不开的关键知识点。它既是理论考试的高频考点,也是实际网络中最常用的出口方案。这篇文章我打算从原理讲到实验,把NAT的三种形态(静态NAT、动态NAT、PAT端口复用)全部用模拟器跑一遍,顺便把配置过程中容易踩的坑也整理了,尽量做到让你看完就能上手。
1.2 NAT到底改了什么
一句话说清NAT的本质:它在数据包经过路由器或防火墙时,改写数据包里的IP地址,甚至端口号。每改一次,设备上会生成一条记录,记录这个内部地址和哪个外部地址建立了对应关系,后续回包才能原路找到返回的路。
怎么理解这件事?可以类比公司的前台传达室。公司内部员工(私网IP)打电话给外部客户(公网IP),如果直接用分机号打出去,客户回拨时根本不知道拨哪个分机——因为分机号在外部是不存在的。于是前台(NAT设备)统一用公司总机号码(公网IP)拨出去,然后前台自己记个台账:分机1001刚拨了客户A,客户A回的电话我转给分机1001。NAT设备干的活,就是这个前台,一边改地址、一边记台账,台账就是NAT转换表。
理解了这个模型,后面所有的配置你都能顺势推理出来:什么情况下该用静态、什么情况该用动态、为什么端口号也要改,全都有章可循。NAT不是一堆死命令,它是一套“地址改写+记录回程”的机制,机制吃透了,配置只是顺手的事。
2. NAT的三种基本形态,怎么选
2.1 静态NAT:一对一绑定,给谁用
静态NAT是一条固定的映射,也就是内部某个私网IP永久对应某个公网IP,双向都不变。现在企业内部对外发布的官网Web服务器、邮件服务器,如果直接放在内网,就需要用静态NAT把公网IP的特定端口映射给服务器的私网IP。
静态NAT的优点是配置简单、行为可预期,外部访问内部服务器时路径清晰。缺点是公网IP占用太多,一个内部设备就得消耗一个公网IP,只适合那些需要对外提供服务的少数设备。比如你有一台IP为192.168.1.10的服务器,公网IP是200.1.1.10,你配置了一条静态映射“200.1.1.10 → 192.168.1.10”,那外部访问200.1.1.10时,数据包就会被路由器改写目的地址为192.168.1.10并转发给这台服务器。
2.2 动态NAT:有池子,谁有空位谁上
动态NAT不做固定绑定,而是准备一个公网IP地址池。内部用户上网时,路由器从池子里挑一个还没被占用的公网IP分配给它,用完释放。好处是公网IP可以复用,缺点是并发多时池子可能被占满,后到的设备就上不了网了。
实际项目中动态NAT用得不算多,因为它既不能像静态NAT那样固定映射服务,又不像PAT那样让几十上百台设备共用一个公网IP。它更像一个过渡方案。考试里会考你它的地址池耗尽问题、超时回收机制,这些概念理解了就好,生产环境我很少单用动态NAT。
2.3 PAT端口复用:一家公司的总机
PAT(Port Address Translation)是目前绝大多数家庭路由器和企业出口设备的默认工作方式。它把所有内部设备映射到同一个公网IP上,靠端口号区分不同内部设备。一个公网IP理论上最多可以支撑六万多个并发会话,对绝大多数场景完全够用。
为什么端口号能区分设备?因为IP是“楼地址”,端口是“房间号”。外面回包回到公网IP这个“楼”,NAT设备看一眼端口号,就知道回包该投递到哪个“房间”即具体哪个内网设备。我之前在旧电脑上搭过两个虚拟机一个做客户端一个做服务器,用Hyper-V虚拟交换机配NAT时,对PAT的理解更直观——宿主一个IP,多台虚拟机都能上网,靠的就是端口区分会话。
三种NAT的适用场景用一张表总结:
| NAT类型 | 映射关系 | 公网IP消耗 | 典型场景 |
|---|---|---|---|
| 静态NAT | 一对一固定 | 1个私网IP消耗1个公网IP | 内网服务器对外发布服务 |
| 动态NAT | 一对多动态分配 | 取决于地址池大小 | 内网少量设备共享公网地址池 |
| PAT | 多对一端口复用 | 1个公网IP可支撑大量设备 | 家庭宽带、企业出口上网 |
2.4 配置前必须想清楚的几个问题
动手敲命令之前,我强烈建议你先回答三个问题:出口设备有几个公网IP?内网哪些网段需要做转换?有没有内网服务器需要对外提供服务?
第一个问题决定你用PAT还是静态NAT;第二个问题决定你用ACL怎么抓流量;第三个问题决定你要不要配NAT Server端口映射。很多人配置失败不是命令敲错,而是没想清楚这些前置条件。我遇到过新手在只有一个公网IP的情况下,硬是配了三条静态NAT,结果第二条起就报地址冲突——不是照抄配置就行,先做规划,命令才有意义。
3. 动手实验:用eNSP搭一套NAT环境
3.1 实验拓扑与地址规划
华为eNSP是学网络最方便的模拟器之一,完全免费,图形化拖拽设备就能搭环境。下面的实验我用了三台路由器和两台PC,拓扑结构很简单:内网PC1(192.168.1.10/24)接在网关R1的G0/0/0口,R1通过外网口G0/0/1连接运营商侧路由器R2,R2再连外部服务器PC2(模拟公网服务器,地址用200.1.2.10/24)。R1与R2之间的互联地址用200.1.1.0/30网段,R1的外网口地址为200.1.1.1/30。
这里要注意区分接口的角色:R1的G0/0/0是内网口,属于inside区域;G0/0/1是外网口,属于outside区域。NAT配置的核心就是明确告诉设备“哪个方向是内部,哪个方向是外部”,方向搞反了,转换永远不可能生效。
3.2 静态NAT配置实操
先配最基础的静态NAT。假设我的内网服务器是192.168.1.10,我给它分配的公网IP是200.1.1.10。在R1上只需要两条命令:
# 进入外网口 interface GigabitEthernet0/0/1 # 配置静态NAT:公网200.1.1.10 映射到 内网192.168.1.10 nat static global 200.1.1.10 inside 192.168.1.10配完后在R1上执行display nat static能看到这条映射记录。测试方法是从PC1去ping PC2,或者在PC2上ping 200.1.1.10。如果服务器在R1的内网侧,PC2去ping 200.1.1.10时,R1会把目的地址改写成192.168.1.10,再把包转发给服务器;服务器回包时,R1再把源地址由192.168.1.10改回200.1.1.10。
我当时第一次配的时候,静态NAT配完发现外网能ping通,但是内网PC1访问PC2却不通,后来查了路由表才发现R1上没写去往200.1.2.0/24的路由。这个问题很多人会忽略:NAT只管地址改写,改写之后的包要能发出去,依赖的还是路由表。静态NAT+缺路由这种组合坑,我建议你在实验的时候故意复现一次,印象会深很多。
3.3 动态NAT配置实操
动态NAT需要两个前置配置:ACL地址匹配条件和公网地址池。我用ACL 2000匹配内网192.168.1.0/24网段,地址池取名为addr-pool,包含三个公网地址200.1.1.2到200.1.1.4。配置如下:
# 配置ACL,匹配允许做NAT的源地址段 acl number 2000 rule 5 permit source 192.168.1.0 0.0.0.255 # 配置公网地址池 nat address-group 1 200.1.1.2 200.1.1.4 # 在外网口调用,no-pat表示不做端口转换,只做地址转换 interface GigabitEthernet0/0/1 nat outbound 2000 address-group 1 no-pat这里的no-pat就是关键差异点。加上no-pat,路由器只改IP不改端口号,每个内网IP独占一个公网IP;不加no-pat,就是PAT模式,所有内网IP共享地址池里的公网IP并同时改写端口号。我在测试时只给地址池放了两个地址,同时发起三台PC的流量,第三台PC就上不了网了,因为地址池被占满了。display nat address-group能看到利用率,生产环境如果地址池使用率持续偏高,就要考虑扩容或改用PAT模式。
3.4 PAT配置实操,实际项目最常用
PAT的配置和动态NAT几乎一样,唯一的区别就是去掉no-pat。华为路由器默认的nat outbound不带no-pat时就是PAT模式,内部所有设备共享地址池里的公网IP。
以最典型的一根宽带一个公网IP的场景为例:
acl number 2000 rule 5 permit source 192.168.1.0 0.0.0.255 nat address-group 1 200.1.1.2 200.1.1.2 interface GigabitEthernet0/0/1 nat outbound 2000 address-group 1注意地址池里我只放了一个IP。数据包从内网出去时,源IP会被改成200.1.1.2,源端口被改成一个随机的高端口号,比如1025。回包到达R1时,R1会根据NAT会话表里记录的端口对应关系,把目的地址改成原来那个内网设备的IP。
查看PAT到底建了哪些会话,命令是display nat session。我经常用这条命令排查“为什么某个内网IP突然上不了网”:如果发现会话表里它的连接数满了(默认能承载的会话数是有限制的),或者根本没建立会话,就能很快定位问题。排查久了你会发现,NAT相关的百分之八十的问题,看会话表都能找到线索。
3.5 NAT Server端口映射,把内网服务暴露到公网
前面说的静态NAT、动态NAT、PAT解决的都是“内网主动访问外网”的方向。但实际场景里经常反过来:外部用户要访问内网的一台Web服务器。这时候适合用NAT Server,也叫端口映射。
华为设备上配置NAT Server的命令很直接:
# 将公网IP 200.1.1.10的TCP 80端口映射到内网192.168.1.10的80端口 interface GigabitEthernet0/0/1 nat server protocol tcp global 200.1.1.10 80 inside 192.168.1.10 80这条配置我建议你想想为什么要放在外网口而不是内网口:因为NAT Server是外部流量进来时,设备需要根据目的地址和端口做转换,这个动作发生在流量从外网口进入的那一刻。放在外网口,设备能第一时间对进入的流量做目的地址改写,然后根据路由转发到内网。我之前在GNS3上做过一次实验,把它配在了内网口,折腾半天不生效,后来查阅文档才发现和接口类型有关,方向性和位置性是NAT配置中很容易忽略的细节。
如果你的服务器用的是非80端口,改端口号映射就可以了。比如内网服务器的8080端口想对外暴露成80端口,命令就是:
nat server protocol tcp global 200.1.1.10 80 inside 192.168.1.10 80803.6 关于NAT outbound和双出口NAT
业界还有一种常见的写法是nat outbound 2000,不带address-group参数。这种写法适用于设备外网口本身就有公网IP的场景,路由器会把内部主机的源地址直接转换成出接口的公网IP,同时自动使用PAT模式。配置更简单,适合只有一个公网IP的场景。但缺点是无法指定使用哪个公网IP做转换,当外网口有多个地址时要小心选择。
双出口NAT是更具生产价值的场景。公司签约了两条运营商线路,一条电信一条联通,内网访问外网时希望根据目的地址选择不同的出口做NAT。核心思路是配置策略路由+PBR,让不同目的IP的流量走不同外网口,再在每个外网口上分别做PAT。测试这种场景建议多建一台路由器和对应的地址池。这种配置初看复杂,但理解成“不同的出口独立的NAT策略”就简单了,比如电信出口的ACL放行一条规则、联通出口放行另一条规则,两条线路互不干扰。
3.7 实验环境搭建建议
eNSP对电脑配置要求不高,4GB内存的机器也能跑,但建议至少8GB内存,否则开三台路由器的同时再开Wireshark抓包会比较卡。装好eNSP之后,记得用“Router”类型设备,型号选AR2220比较通用,因为它支持NAT和多种接口类型。拓扑连线用自动连线即可,连线后要记得给接口配IP,接口处于up状态再做NAT,否则流量根本不会走到NAT逻辑那一层。
我在自己机器上装eNSP时,还遇到过启动设备报错“错误40”,后来排查是VirtualBox版本不兼容,卸载重装旧版本VirtualBox就好了。如果碰到类似问题不用慌,先看日志文件,里面的提示比报错弹窗详细得多。
3.8 与虚拟化平台NAT的关系
如果你在虚拟机软件里配过网络,应该见过“NAT模式”这个词。VMware和Hyper-V的虚拟交换机都提供NAT选项,它的本质和我们在路由器上做的PAT一样:虚拟机共享宿主机的IP访问外部网络。区别只是实现载体不同,一个是物理路由器/防火墙,一个是虚拟化软件内置的虚拟网卡驱动。
我最初理解NAT时,就是在VMware里开了一台Linux虚拟机,把网络模式从桥接改成NAT,然后对比虚拟机里的IP与宿主机IP。当时一下子就明白了:NAT模式里宿主机扮演的就是NAT设备的角色。这也解释了为什么虚拟机NAT模式下,外部设备无法主动访问虚拟机——因为NAT转换表里没有外部主动发起连接的记录,除非你在虚拟网络编辑器里手动添加端口转发规则。这和路由器上配NAT Server是一样的逻辑。
4. 常见问题与排查技巧实录
4.1 Nginx配置了但是外网访问不了
这个问题太经典了。第一反应查三样东西:NAT Server是否配置、防火墙是否放行了对应的端口、路由是否可达。我见过很多人在路由器上做了端口映射,但忘记了服务器本机的防火墙,或者云安全组没放行端口。排查顺序建议:先在内网用私网IP访问服务器,确认服务本身正常;再到路由器上检查NAT配置;最后才在外部发起访问测试。
在eNSP里没有真实服务器防火墙的问题,但在真实环境中,内网访问正常但外网访问不通,八成是安全策略的问题而不是NAT的问题。
4.2 NAT乒乓与回流问题
当你用内网IP访问自己映射的公网IP地址时,有些设备会有问题,有些没问题。这个叫做NAT回流或NAT hairpin。华为路由器上默认支持回流,但部分老设备或低端家用路由器不支持。如果你在家里通过网络管理页面访问内网服务器的端口映射地址失败,但手机用4G/5G网络能访问,那就是典型的回流问题。
解决办法也很简单:内网用户访问内部服务器时,直接用私网IP,别绕公网IP。某些防火墙设备可以通过开启NAT hairpin功能解决,但不同厂商命令差异很大,遇到再说,不需要死记。
4.3 NAT与FTP等特殊协议
FTP协议有两种工作模式,主动模式和被动模式。主动模式下服务器主动向客户端发起数据连接,如果服务器在内网通过NAT对外提供服务,NAT设备必须能识别并动态创建反向的数据连接,否则数据通道建立不起来。这个能力叫ALG(应用层网关)。
在企业网络中如果发现FTP服务做了NAT后只能登录但传不了文件,十有八九是ALG没生效。解决办法:一是开启设备上的FTP ALG功能;二是改用被动模式,减少NAT对数据连接的干扰;三是考虑用SFTP/FTPS这种基于TCP单一端口的协议。这个坑在配置老式FTP服务器时很常见,网上搜FTP+NAT的资料基本都能搜到类似的案例。
4.4 未知流量触发安全策略拦截
排查NAT问题时,如果看到“系统检测到您的计算机网络中存在异常流量”类似的提示,先别慌,这种提示绝大多数源于出口设备的安全策略或上游运营商的流量清洗机制,和NAT本身没有直接关系。需要检查的是内网是否存在异常发包行为,比如某台机器中了挖矿木马在持续对外发包,或者有设备在暴力破解外网服务器。
从NAT的角度看,如果内网一台机器在短时间内发起大量并发连接,出口设备的NAT会话表很快就会被塞满,其他正常设备反而上不了网。这个场景我遇到过不止一次:某天早上公司网络突然卡顿,查NAT会话表发现某个IP占了几千条会话,一查是某台电脑中了蠕虫。所以排查网络故障时,display nat session看到的异常连接数往往比任何监控系统都灵敏。
4.5 常用验证命令速查
把实验和生产环境中高频使用的NAT相关命令整理成一张速查表,方便直接抄作业:
| 命令 | 作用 | 适用场景 |
|---|---|---|
| display nat static | 查看静态NAT映射 | 确认服务器映射是否生效 |
| display nat outbound | 查看出方向NAT策略 | 确认ACL与地址池配合关系 |
| display nat address-group | 查看地址池使用率 | 判断公网IP是否耗尽 |
| display nat session | 查看当前NAT会话 | 核心排错命令,观察流量转换情况 |
| display nat server | 查看端口映射 | 确认NAT Server配置 |
| debugging nat packet | 开启NAT调试信息 | 深入定位转换异常 |
| reset nat session | 清除NAT会话 | 修改配置后快速重建会话 |
4.6 排查思路总结
结合我多年配网的经验,NAT排错最忌讳一上来就乱敲命令,建议按下面的路径走一遍:
第一步,确认数据包是否到达了NAT设备。在NAT设备的内网口用抓包工具或者display ip statistics看一眼,如果包根本没到,那问题出在源设备或中间链路,而不是NAT。
第二步,确认NAT策略是否匹配了这条流量。display nat outbound看ACL规则,用display acl 2000看命中计数。如果ACL命中次数不增长,说明流量没被NAT匹配,得检查ACL里写的网段、方向对不对。
第三步,确认NAT转换后的包是否从外网口发了出去。在R2上抓包,如果源IP已经是公网IP,说明NAT没问题,问题可能在路由或对端;如果源IP还是私网,说明转换没生效。
这三步走完,基本上能把问题范围缩小到很明确的位置。剩下的就是针对具体设备细查了。
5. 几个延伸知识点,面试和考试都用得上
5.1 NAT与IPv6的关系
很多人会问,IPv6地址那么多,是不是就不需要NAT了?答案是:纯IPv6环境下确实不再需要靠NAT节约地址,但NAT有一个附加好处——隐藏内部网络结构。从安全角度讲,NAT相当于一层简单的屏障,外部无法直接探测到内网的设备分布。IPv6普及后,出于安全考虑,很多企业仍然会部署NAT66或NAT64,前者是纯IPv6地址转换,后者是IPv6与IPv4互通时的转换手段。
我在一次面试里被问到过“IPv6环境下怎么访问IPv4的旧服务器”,答案就是NAT64加DNS64。如果你对这些名词有印象,面试官会觉得你是有实战积累的。
5.2 电信级NAT(CGN)
运营商大规模使用的一种NAT形态,因为公网IPv4地址枯竭,运营商给家庭宽带的用户分配的不再是真正的公网IP,而是一个运营商内部私网IP,用户的真实公网IP由运营商的CGN设备统一转换。这就是为什么很多人在家搭建NAS或远程访问家里电脑越来越难——因为你的IP根本不是公网IP,外部流量进不来。电信级NAT的关键技术是地址池共享、日志记录和超大规格会话表。理解了CGN,你就能明白为什么有些运营商用户会主动要求“公网IP”或“公网型宽带”,核心就是绕开运营商级NAT的限制。
5.3 防火墙上的NAT与路由器NAT的区别
防火墙的NAT通常和域(Security Zone)概念配合使用。流量从trust区域到untrust区域时,出方向做源NAT;从untrust到dmz区域时,做目的NAT。关键区别在于防火墙会在会话表里记录完整的状态,包括五元组信息和安全策略的关联。所以配置防火墙NAT时,除了配地址转换规则,还必须检查安全策略是否放行对应流量。很多人在华为USG防火墙和eNSP之间切换时容易踩这个坑:路由器只要NAT配了就行,防火墙还要过策略。
5.4 在家搭建虚拟化环境时的NAT应用
如果你用Hyper-V或VMware搭实验环境,想让多台虚拟机共享一台物理机的网络访问能力,最常见的方式就是给虚拟交换机设置NAT模式。Hyper-V的默认虚拟交换机其实不自带NAT功能,但可以通过PowerShell命令New-VMSwitch创建内部交换机,再用New-NetNat配置地址转换,效果和路由器上的PAT完全一样。VMware Workstation则直接在虚拟网络编辑器里选NAT模式即可,非常省事。如果你在公司电脑上搭测试环境,又不能随便占用公网IP,用NAT模式让虚拟机共享宿主机的网络,是最保守也最稳妥的方案。
6. 最后分享一点我的实操体会
配置NAT这件事,看起来简单,真正吃透需要一定的时间。我最早在模拟器上按教程敲命令,敲完了发现内网能上网,但说不清楚为什么能上网。后来强迫自己不看配置文件,直接在纸上画出NAT转换表:某内网IP发了一个源端口为12345的请求,到达路由器后源IP改成公网IP、源端口改成54321,回包再反向还原。把这个流程画出来之后,所有NAT问题都豁然开朗了。
我也建议每个学网络的人都自己动手搭一个实验环境,不一定要多复杂,两台路由器、两台PC就够。先把静态NAT跑通,再改成PAT,然后故意配错一个地方,比如ACL的网段写反,或者外网口没调用nat outbound,观察流量表现。真实的经验都是在这种“故意犯错”和“排查修复”的过程中积累出来的。读一百篇配置教程,不如自己亲手踩一次坑。
NAT只是网络协议海洋里的一小部分,但它连接着日常家用路由、企业出口架构、虚拟化网络、运营商骨干等多个层面。把这个机制理解透了,以后再遇到任何网络地址转换相关的问题,你都能快速定位、精准解决。