网络地址转换也就是大家常说的NAT几乎是每个搞网络的人绕不开的一道坎。刚入行那会儿我对它的理解就停留在“把内网地址换成公网地址”这一句话上直到后来做实验、抓包、排查连接问题才发现这里面的门道远比想象中多。这篇文章不打算写成教科书而是把我这些年对NAT的理解、踩过的坑、以及实际配置中真正有用的细节系统地梳理一遍。不管你是刚接触网络的新手还是已经配过几台设备但总觉得没吃透的老手都能从里面找到对自己有用的东西。我会从它为什么会出现讲起一直聊到几种典型NAT的工作机制、配置思路以及那些文档里很少提但实际很关键的注意事项。1. 为什么会有NAT这个东西1.1 地址不够用才是根本原因要理解NAT得先回到它诞生的年代。IPv4地址一共32位理论上大约43亿个。这个数字在互联网早期看起来绰绰有余毕竟那时候能上网的设备屈指可数。但谁也没料到互联网会以那种速度爆炸式增长电脑、手机、平板、各种智能设备全都需要地址43亿很快就捉襟见肘了。地址不够用最直接的解决办法当然是换一套地址空间更大的协议也就是IPv6。但IPv6的部署涉及所有设备、所有运营商、所有软件的同步升级工程量巨大短期内根本推不动。于是人们想了一个“缓兵之计”既然不能给每台设备都分配公网地址那能不能让一批设备共用少数几个公网地址NAT就是在这个背景下被提出并大规模应用的。它的核心思路很朴素在内部网络里设备使用一套“私有地址”这些地址只在局域网内部有效不会出现在公网上当内部设备需要访问外网时由出口设备通常是路由器或防火墙把私有地址转换成公网地址对外发出请求回包再转换回来送到对应的内部设备。这样一来成千上万台设备可以共用少量公网地址地址压力瞬间缓解。1.2 私有地址的划定与使用约定为了让这套机制能有序运转相关标准专门划出了几段地址作为“私有地址”它们不会被分配为公网地址专门留给内部网络使用。常见的私有地址段包括10.0.0.0/8、172.16.0.0/12、192.168.0.0/16这几大块。你在家里看到的192.168.1.x在公司看到的10.x.x.x基本都是这个范畴。这里有个容易被忽略的点私有地址是可以重复使用的。你家可以用192.168.1.0/24你邻居家也可以用同样的网段因为大家的流量在出口处都会被转换公网上根本看不到这些私有地址所以不会冲突。这也是NAT能大规模铺开的重要原因之一。提示私有地址段是约定俗成的配置时不要随意把公网地址段拿来当内网地址用否则容易出现路由混乱和访问异常。1.3 NAT带来的额外好处虽然NAT的初衷是省地址但用着用着大家发现它还带来了一些“副作用”而且这些副作用在很多场景下还挺有用。最典型的就是隐藏内部结构。因为外部只能看到出口设备的公网地址内部有多少台设备、用什么网段、怎么组网外面一概不知这在一定程度上提升了内部网络的隐蔽性。另一个好处是灵活性。内部网络想怎么改就怎么改换网段、加设备、调整拓扑只要出口的转换规则跟着改对外表现可以保持不变。这种“内外解耦”的特性在实际运维中省了不少事。当然这些好处是附带的不能本末倒置NAT最核心的价值始终是地址复用。2. NAT到底是怎么工作的2.1 转换的本质是改包头很多人把NAT想得很玄乎其实拆开看它做的事情非常具体修改数据包的源地址或目的地址有时还要改端口号同时在自己的内存里维护一张“转换对照表”保证来回的包能对应上。举个最简化的例子。内部设备A的地址是192.168.1.10它要访问外网某台服务器。数据包从A发出源地址是192.168.1.10源端口假设是5000。包到达出口设备后出口设备把源地址改成自己的公网地址比如203.0.113.5同时可能把源端口改成一个它自己管理的端口比如60000然后记录一条映射192.168.1.10:5000 对应 203.0.113.5:60000。包发出去后服务器回包的目标是203.0.113.5:60000出口设备查表发现这条映射对应内部A就把目标地址改回192.168.1.10:5000再送给A。整个过程对A和服务器都是透明的它们都以为自己在和对方直接通信。这就是NAT的精髓所在。2.2 转换表才是关键真正让NAT能正常运转的不是“改地址”这个动作而是那张转换表。这张表记录了每一条活跃的连接映射包括内部地址端口、外部地址端口、协议类型、状态等信息。出口设备每收到一个包都要查表决定怎么处理。这张表是有生命周期的。一条映射如果长时间没有流量就会被老化删除释放资源。这个老化时间很关键设得太短长连接容易被中断设得太长表项堆积会占用大量内存。不同厂商、不同场景下的默认值差异很大实际配置时需要根据业务特点调整。注意转换表的容量是有限的。当并发连接数超过设备承载能力时新的连接可能无法建立表现为“上不了网”或“时通时断”。排查这类问题时先看转换表的使用率。2.3 只改地址和改端口是两回事根据是否修改端口NAT可以分成两大类。一类只转换IP地址不碰端口通常用于一对一的场景比如把一个公网地址固定映射给一台内部服务器。另一类不仅转换IP还转换端口这就是常说的PAT端口地址转换也叫地址复用。PAT能让大量内部设备共用一个公网地址靠的就是用不同的端口号来区分不同的连接。理解这个区别很重要因为它直接决定了你能不能用少量公网地址支撑大量设备。只转换地址的方案一个公网地址只能对应一台内部设备而PAT方案一个公网地址理论上可以支撑数万条并发连接这才是家庭和小型企业网络里最常见的形态。3. 几种典型NAT类型拆解3.1 静态NAT一对一固定映射静态NAT是最容易理解的一种。它把某个内部地址固定映射到某个公网地址关系是写死的不会变。这种方案通常用在需要对外提供服务的内部服务器上比如网站、邮件服务等因为外部需要有一个稳定的地址来访问它。配置静态NAT时映射关系是双向的外部主动访问这个公网地址会被转到对应的内部地址内部这台设备主动出去也会用这个公网地址。它的优点是稳定、可预测缺点是浪费地址一个公网地址只能给一台设备用。3.2 动态NAT从地址池里临时分配动态NAT准备了一个公网地址池内部设备需要访问外网时从池子里临时分配一个地址给它用完再回收。相比静态NAT它提高了地址利用率因为不是每台设备都时刻需要公网地址。但它有个明显的局限池子里有多少地址同时就只能有多少台设备在线访问外网。如果池子里只有10个地址第11台设备想上网就得等前面有人释放。所以在设备数量多、并发访问频繁的场景下动态NAT并不实用很快就被PAT取代了。3.3 PAT最主流的地址复用方案PAT是实际部署中最常见的方案家庭宽带、公司出口、公共场所的网络绝大多数用的都是它。它的核心是“IP加端口”一起转换用端口号来区分不同的内部连接从而让一个公网地址服务大量设备。PAT的转换表里每条记录都精确到端口。比如内部两台设备同时访问同一个外网服务器出口设备会给它们分配不同的源端口服务器看到的两个连接来自同一个IP但不同端口回包时出口设备根据端口查表分别送回对应的内部设备。这种方案极大地节省了公网地址但也有代价。因为多个内部连接共享同一个公网地址外部无法直接主动访问内部设备除非专门配置端口映射。这也是为什么家里想在外面访问内部服务时需要在路由器上做端口转发的原因。3.4 端口映射与DMZ的取舍端口映射是把某个公网地址的某个端口固定转发到内部某台设备的某个端口。比如把公网地址的8080端口映射到内部服务器的80端口外部访问公网地址的8080就能看到内部网站。这是PAT环境下对外提供服务的主要手段。DMZ则是更“粗暴”的做法把内部某台设备完全暴露到公网所有未明确映射的端口都转发给它。配置简单但风险很高因为这台设备直接面对外部安全防护全靠它自己。实际使用中除非确实需要否则更推荐精确的端口映射而不是开DMZ。类型地址关系端口转换典型场景地址利用率静态NAT一对一固定否对外服务器低动态NAT池内临时分配否少量设备临时上网中PAT多对一是家庭、企业出口高端口映射一对一端口级是对外发布服务高4. 配置NAT时的实操思路4.1 先理清内外接口配置NAT之前第一件事是搞清楚哪个接口朝内、哪个接口朝外。这个看似简单但实际出错最多的就是这里。朝内的接口连接内部网络朝外的接口连接外部网络NAT规则要明确指定在哪个接口上做转换、转换的方向是什么。很多设备上NAT规则需要绑定到具体的接口并且区分“源转换”和“目的转换”。源转换处理内部主动访问外部的情况目的转换处理外部主动访问内部的情况。两者方向相反配置时不能混。提示配置前先用命令确认接口的地址和状态避免把规则绑到错误的接口上导致转换不生效。4.2 定义感兴趣流NAT不是对所有流量都做转换而是只对“感兴趣流”做。所谓感兴趣流就是那些需要被转换的流量通常用访问控制列表来定义。比如只对源地址是内部网段、目的地址是任意外网的流量做转换。定义感兴趣流时要注意匹配顺序和范围。范围太宽可能把不该转换的流量也转了范围太窄该转的没转表现为部分设备上不了网。实际配置中建议先用明确的网段和协议来限定测试通过后再根据需要调整。4.3 转换规则的编写与验证规则写完后一定要验证。验证的方法有几个层次先看转换表里有没有生成对应的表项再看实际流量能不能通最后抓包确认地址确实被改了。这三步走下来基本能定位绝大多数问题。如果转换表里没有表项说明流量根本没匹配上感兴趣流或者规则没生效如果有表项但流量不通可能是回程路由或外部网络的问题如果抓包发现地址没变那就要检查规则绑定的接口和方向是否正确。4.4 一个容易忽略的细节回程路由NAT只负责改地址不负责保证回包能回来。如果出口设备把包转出去了但回包找不到回来的路连接照样不通。所以在配置NAT的同时要确保回程路由是正确的。对于源转换来说回包的目标是出口设备的公网地址只要外部能路由到这个地址回包就能到达出口设备再由它查表转回内部。问题往往出在多出口或复杂拓扑的场景。比如内部有多个出口流量从一个口出去回包却从另一个口进来转换表对不上连接就断了。这类问题排查起来比较费劲需要结合路由和转换表一起看。5. 那些文档里不常写的坑5.1 应用层协议的特殊处理有些协议在通信过程中会在数据载荷里携带地址和端口信息比如某些语音、视频、文件传输协议。NAT如果只改包头不改载荷里的地址这些协议就会出问题因为对方拿到的还是私有地址根本连不上。针对这类协议需要专门的ALG应用层网关来处理它会深入载荷把里面的地址端口也一并改掉。但ALG本身也可能带来兼容性问题有时候开了反而更不稳定。实际经验是能用不依赖载荷地址的协议就用非要用老协议时再考虑ALG并且做好测试。5.2 转换表老化引发的“假断线”前面提过转换表有老化时间。有些应用维持长连接但流量间隔比较长如果老化时间设得比流量间隔短映射就会被提前删除连接看起来就“断”了。用户感觉是“用着用着就掉线”但重新发起又能连上。解决办法是调整老化时间或者让应用定期发送保活报文。调整老化时间时要权衡太长会占用表项资源太短又保不住连接。比较稳妥的做法是针对特定协议单独设置老化时间而不是全局一刀切。5.3 端口耗尽与冲突PAT靠端口区分连接端口号是16位理论上6万多个。但实际可用端口没那么多因为有些端口被系统保留有些被其他服务占用。当并发连接数很高时可能出现端口耗尽新的连接分配不到端口表现为“连不上”。还有一种情况是端口冲突两个内部连接恰好被分配到同一个外部端口如果设备处理不当就会串包。正规设备都有机制避免这种冲突但配置不当或设备性能不足时仍可能发生。排查时看转换表里有没有重复的外部端口映射。5.4 内外网地址重叠的麻烦如果内部网络使用的网段恰好和外部要访问的目标网段相同就会出问题。比如内部用192.168.1.0/24外部某个服务也用这个网段出口设备在转换时无法区分“这个地址是内部的还是外部的”路由和转换都会乱。这种地址重叠的场景需要通过更精细的规则或专门的转换策略来处理比如对特定目标做目的转换把外部地址映射成另一个内部可识别的地址。配置起来比较绕能避免就尽量避免规划网络时提前把网段选好。6. 排查NAT问题的完整链路6.1 从现象倒推可能的原因NAT相关问题表现出来的现象无非几类完全不通、时通时断、部分应用不通、单向不通。不同的现象指向不同的原因。完全不通先看规则和感兴趣流时通时断重点查转换表老化和资源占用部分应用不通考虑ALG和载荷地址单向不通多半是回程路由或方向配置的问题。把现象和原因对应起来排查就有了方向不至于盲目地改配置。我习惯先问清楚“什么现象、什么时候开始、改过什么”这三个信息往往能直接缩小范围。6.2 分层验证的具体步骤排查时我一般按这个顺序走先确认接口和路由正常再确认感兴趣流匹配然后看转换表有没有表项接着测试实际连通性最后抓包看地址转换是否发生。每一步都有明确的判断标准哪一步断了就在哪一步深入。抓包是最有说服力的手段。在内外接口同时抓包对比同一个连接的源目的地址变化能直观看到NAT到底做了什么、有没有做。很多时候看配置看不出问题一抓包就真相大白。6.3 几个高频问题的快速定位转换表为空通常是感兴趣流没匹配上检查访问控制列表和规则绑定有表项但不通检查回程路由和外部可达性连接建立后很快断开检查老化时间和保活机制特定应用异常检查是否需要ALG或载荷地址处理。这些问题看起来零散但背后都是同一套逻辑NAT是“改地址加查表”任何环节出问题都会表现为连接异常。把这条主线记住排查时就不会迷失方向。7. 我对NAT的一点个人理解用了这么多年NAT我越来越觉得它是个“看起来简单、用起来讲究”的东西。它的原理一句话能说清但真正把它用好需要对地址规划、路由、协议特性、设备能力都有了解。很多网络问题的根源最后都能追溯到NAT配置或地址规划上。我的建议是初学时不要急着背各种类型的定义而是动手搭个小环境抓几次包亲眼看看地址是怎么变的、表是怎么建的。看懂了转换表NAT就懂了一大半。至于那些高级特性和特殊场景等基础扎实了再逐个攻克会轻松很多。地址规划这件事一定要在组网之前就想清楚后期再改牵一发而动全身代价很大。
阅读完成 · 觉得有帮助?