ARTICLE DETAIL

资讯详情

深耕网站建设与运营推广的一线实战洞察。

NAT网络地址转换详解:从原理到配置实验与常见问题排查

NAT网络地址转换详解:从原理到配置实验与常见问题排查 1. NAT是什么为什么非学不可1.1 从一个真实场景说起干网络这行最常被非技术同事问的问题就是“为什么我电脑的IP地址是192.168开头的但上网查却是另一个地址”这个问题的答案就是NATNetwork 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端口复用一家公司的总机PATPort 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拓扑结构很简单内网PC1192.168.1.10/24接在网关R1的G0/0/0口R1通过外网口G0/0/1连接运营商侧路由器R2R2再连外部服务器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服务器时很常见网上搜FTPNAT的资料基本都能搜到类似的案例。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 电信级NATCGN运营商大规模使用的一种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只是网络协议海洋里的一小部分但它连接着日常家用路由、企业出口架构、虚拟化网络、运营商骨干等多个层面。把这个机制理解透了以后再遇到任何网络地址转换相关的问题你都能快速定位、精准解决。
返回列表