ARTICLE DETAIL

资讯详情

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

NAT技术全解:从原理到实战配置、故障排查与避坑指南

NAT技术全解:从原理到实战配置、故障排查与避坑指南 干网络这行NATNetwork Address Translation网络地址转换大概是最日常、却也最容易被忽略的技术之一。家里路由器上有它企业出口防火墙上也有它运营商城域网里还有它。你可能已经会敲几条nat outbound的命令但真遇到“NAT回流”“会话表打满”“一对一NAT怎么配”这类问题时还是免不了翻手册、问同事。这篇就以NAT为主角从原理讲到实战配置再从排错聊到几个容易被忽略的坑内容尽量按实际项目里遇到的情况来写不管是刚入门的新手还是在维护企业网络的老手应该都能从中找到点有用的东西。1. 先聊透NAT到底在解决什么问题1.1 从一个“地址改写”的动作说起NAT听起来像是一个很底层的协议实际上它并没有自己独立的报文格式它做的事情很简单在数据包经过设备的时候把报文头里的IP地址改掉。拿最常见的场景举例。你家里宽带只分配了一个公网IPv4地址但手机、电脑、电视加起来五六个设备都要上网。内网设备发出数据包时源地址是192.168.1.100目的地址是某个公网服务器路由器在转发前把源地址改成自己的公网IP再丢到外网。服务器回包时目的地址自然就是那个公网IP路由器收到后根据之前记录下来的映射关系把目的地址改回192.168.1.100再交给对应设备。整个过程对终端设备来说完全无感但它们实际上已经共享了同一个公网IP。这个“改写地址”的动作就是NAT最底层的逻辑。别小看这句话后面所有配置、选型、排错本质上都是在围绕“改谁、不改谁、怎么改回”这三个问题打转。1.2 不只是省IP它还有天然的安全隔离作用很多文章讲NAT一上来就强调IPv4地址枯竭好像NAT就是为了省公网IP才发明的。这话对但不全对。NAT在现实网络里还有一层很重要的价值它让内网拓扑对外不可见外部主动发起的连接默认进不来。因为NAT设备只有在内部设备主动向外发包、产生会话表项之后才会在表里建立对应的映射关系。外部想主动访问内网某台机器数据包到了NAT设备查不到表项包基本就被丢了。这相当于给内网加了一道“默认拒绝入站”的隐形势力很多小型网络就是靠这一层逻辑挡住外部扫描的。这里必须说清楚NAT不是防火墙不能替代安全策略。它只是让“入站连接”变得困难但一旦你主动做了端口映射外部还是可以直连内网服务。所以严格来说NAT的安全价值是“隐藏”和“减少暴露面”真正的访问控制还得靠防火墙规则。1.3 三类最典型的使用场景内网共享上网内网几百个终端只分配了几个甚至一个公网IP靠PAT技术实现所有终端同时上网。这是最普遍的NAT场景家用路由器、企业出口都在用。内部服务器对外发布内网有一台Web服务器或数据库需要让公网用户访问。典型手段是端口映射把公网IP的某个端口映射到内网服务器的某个端口上如果这台服务器有独立公网IP则直接做一对一静态NAT。网络迁移时的地址重规划公司换了ISP或者重新规划了公网地址段内网IP不想动也不方便动那就靠NAT在边界设备上做一层映射让新旧网络的互通变得相对平滑。这三种场景对应的配置思路并不一样很多人就是没分清楚“共享上网”和“服务器发布”对NAT的要求不同结果配置出来要么上不了网要么外网访问不进来。2. NAT的分类与选型思路2.1 静态NAT一对一的“专线”映射静态NAT也叫一对一NAT是最直观的一种映射方式一个内网地址固定对应一个公网地址映射关系在设备上手工写死不会变化。它适合什么场景呢典型的就是公司购买了一段公网IP给某台服务器分配了一个独立公网地址既要让外网访问这台服务器又要让服务器主动访问外网。因为地址是“专享”的所以双向连接都能发起不存在端口复用、会话表冲突的问题。配置上静态NAT是唯一一个“双向都能主动发起连接”的NAT类型很多老工程师习惯把它当成“公网IP直通”来用。但要注意它只是把地址改了策略还是得单独放行。2.2 动态NAT与PAT端口复用把区别彻底讲清楚动态NAT的理解稍微绕一点。它有一个公网地址池内网设备向外发包时设备从池子里临时分配一个公网IP用完之后归还。如果一个公网IP同时被一个内网终端占用那池子里有多少个公网IP就只有多少个终端能同时上网。这种方式并不能节省IP也正因为这个原因实际组网里纯动态NAT用得很少。真正大量使用的是PAT端口地址转换更常见的叫法是端口复用。它的思路是所有内网设备共享一个或几个公网IP通过不同的源端口来区分不同会话。打个比方公司总机号码就是那个公网IP每个员工的内部分机号就是源端口外线打进来时先找到总机再转给分机接起来都正常但外面看只有一个总机号码。PAT解决了IP不够用的问题代价是所有流量从外部看都来自同一个IP日志追溯时得靠端口和时间来区分具体内网设备。这也是后面要讲的NAT日志如此重要的原因。2.3 Easy IP与地址池怎么选在华为设备上PAT有两种常见写法。一种是直接用出接口的公网IP叫Easy IP命令是nat outbound 2000这里的2000是ACL编号用来匹配哪些源地址需要做转换。另一种是配置一个公网地址池然后用nat outbound 2000 address-group 1把ACL和地址池关联起来。两者选谁主要看公网侧条件。如果出口设备只有一个公网IP别犹豫直接用Easy IP配置最简单网断了换个IP也基本不用动配置。如果运营商给了你一段公网地址而且有多个业务需要不同公网IP来区分那才需要用地址池。地址池还有个好处是可以在做PAT的同时配合no-pat参数对某些ACL匹配到的流量不做端口复用直接占用一个公网IP做动态一对一映射这在一些特殊业务里很有用。2.4 别忘了F5这类负载均衡设备里的NATF5 BIG-IP在很多公司是核心入口设备它里面也有NAT但和路由器、防火墙上的NAT定位不太一样。F5里最常见的是NAT对象和SNAT对象两个概念NAT对象负责目的地址转换一般用于把公网虚拟IP映射到后端真实服务器SNAT对象负责源地址转换主要用于保证回程流量一定经过F5回来避免后端服务器直接回包给客户端造成会话不一致。配置思路上F5通常会和虚拟服务器VIP配合使用而不是像路由器那样在物理接口上挂一条NAT策略。如果你之前只接触过华为、思科的命令行第一次看F5的时候会有点别扭但核心逻辑没变弄清这个设备要做源转换还是目的转换再去找对应的配置入口。3. 配置一对可用的NAT华为与思科实战3.1 一个典型小型企业出口的组网与地址规划假设有这么一个小型公司出口设备用华为AR路由器内网网段是192.168.10.0/24网关在路由器内网口上。运营商给了一对互联地址203.0.113.1/30对端是203.0.113.2。另外单独购买了一个公网地址203.0.113.10专门给内网那台Web服务器用。需求拆出来就两条内网所有终端共享一个公网地址上网用GREAT IP方式也就是Easy IP。内网Web服务器192.168.10.10通过独立公网地址203.0.113.10对外提供HTTP服务外网能访问服务器也能主动访问外网。地址不多需求很典型很多小型企业的出口就是这个状态。3.2 华为AR的配置示例先解决内网上网问题。第一步写ACL匹配内网网段acl number 2000 rule 5 permit source 192.168.10.0 0.0.0.255第二步到公网接口下调用NATinterface GigabitEthernet0/0/0 description to-ISP ip address 203.0.113.1 255.255.255.252 nat outbound 2000不加address-group时华为设备默认使用接口自身IP做Easy IP也就是所有内网终端上网时源IP都会被改写成203.0.113.1。接着做服务器对外发布。为了让外网访问203.0.113.10的80端口时能把目的地址转成192.168.10.10在公网接口下配一条NAT Serverinterface GigabitEthernet0/0/0 nat server protocol tcp global 203.0.113.10 80 inside 192.168.10.10 80如果要求这台服务器主动访问外网时源地址也变成203.0.113.10而不是203.0.113.1那就不能用ACL 2000那种宽泛匹配得单独再写一条静态NATnat static global 203.0.113.10 inside 192.168.10.10这里有个细节配置了静态NAT后服务器发出的所有流量源地址都会变成203.0.113.10外网回包时目的地址就是203.0.113.10设备再转成192.168.10.10整个映射是双向自动完成的。但要注意配完静态NAT后很多设备会提示你检查路由如果路由器上没有到192.168.10.0/24的路由NAT转换后的包会丢这个后面排错章节还会再提。3.3 思科ISR的配置对比思科和华为最大的不同是要在接口上明确标记“哪个方向是inside哪个方向是outside”。这个标记决定了NAT处理的参考方向漏配了基本就不生效。内网口配置interface GigabitEthernet0/0 ip address 192.168.10.1 255.255.255.0 ip nat inside公网口配置interface GigabitEthernet0/1 ip address 203.0.113.1 255.255.255.252 ip nat outside上网共享用overload关键字命令很短access-list 1 permit 192.168.10.0 0.0.0.255 ip nat inside source list 1 interface GigabitEthernet0/1 overload服务器映射对应成ip nat inside source static tcp 192.168.10.10 80 203.0.113.10 80可以看到思科把“HTTP服务映射”和“静态IP映射”都放在同一个ip nat inside source static命令体系里只是写了协议端口就变成端口映射不写协议端口就是一对一IP映射。华为则把端口映射和静态IP映射拆成了两条独立命令思路上各有侧重但你要表达的意图是一样的。3.4 一对一NAT设置的三个常见坑先说第一个坑静态NAT配完了结果服务器还是出不去外网。大多数情况是设备没有到服务器所在网段的路由或者内网口的NAT方向标记错了。静态NAT只是改地址它不负责帮你找路。第二个坑只做了入方向的端口映射忘了考虑服务器主动上网的源地址。如果服务器访问外网时源地址变成了路由器接口地址有些对端业务会不认要求必须用固定IP访问。解决思路就是配一条真正的一对一静态NAT让双向源地址都固定成203.0.113.10。第三个坑公网IP在运营商侧的路由。独立公网地址不是配在设备接口上而是做映射时运营商是否已经把203.0.113.10这条路由指向了你的互联地址如果指向的不是你包根本送不到设备上。很多新人在内网怎么配都通但外网就是访问不了最后发现是运营商侧没把这段地址路由过来。4. 常见NAT故障与排查实录4.1 虚拟机NAT模式突然没有网络搜索热度很高的“centos虚拟机nat无网络”多数情况下不是Linux本身的问题而是虚拟化软件NAT网段和物理网络冲突了。VMware默认的NAT网段是192.168.x.0/24如果家里路由器恰好也是192.168.x.0/24虚拟机拿到的网关地址和真实网关地址同名不同设备包自然就发不出去。排查分三步走第一步看虚拟机能否ping通自己网段的网关。不通说明虚拟网卡或虚拟网段有问题。第二步确认宿主机的VMnet8网卡IP是不是也被分到了同一个网段如果是改成完全不同的网段比如宿主机用192.168.88.x虚拟机NAT网段改成192.168.137.0/24。第三步在虚拟机里看DNS是否正常。有些场景下NAT模式上网通了但域名解析不了多半是虚拟NAT网关被改成了不存在的地址。这个问题的根源用一句话总结就是NAT网关必须是你内网设备“看得见、也够得着”的真实路径如果在路由上绕了一圈又回到起点那肯定是断的。4.2 NAT回流内网用户通过公网IP访问内网服务器失败这个现象很经典不少人都踩过。公司内网有一台服务器做了端口映射外网访问公网IP的80端口一切正常但内网用户拿公网IP访问同一台服务器反而打不开。问题出在“回流”路径上。内网用户发起的请求源地址是192.168.10.x目的地址是203.0.113.10。路由器做了目的地址转换把203.0.113.10改成了192.168.10.10但源地址还是192.168.10.x并没有被转成公网地址。服务器收到包后发现源地址和自己在同一个网段于是直接把回包发给了192.168.10.x而不是发回路由器。这台PC一看自己明明访问的是公网IP结果收到的回包源地址是内网IPTCP握手根本对不上连接就挂了。解决办法通常有两种。第一种在出口设备上开启NAT Hairpin也叫做内网回流或NAT环路让设备对这类流量也做一次源地址转换这样服务器回包就会先回到路由器再由路由器转给内网用户。华为部分设备的内网口下可以执行nat hairpin enable具体命令名因设备型号而异但功能是同一个。第二种更稳的办法本质上是在DNS层面做拆分内网用户解析域名时返回内网IP外网用户解析域名时返回公网IP。这样内网用户访问服务器走内网直连根本不经过NAT也就不会有回流问题。很多公司用内网DNS或者智能DNS解析就是干这个的。4.3 公网地址池耗尽与会话表打满的现象和处理出口设备配置了地址池做PAT日常挺正常某天突然大量用户上不了网。登录设备一看地址池里的公网IP全被占满了或者NAT会话表达到了硬件上限。地址池耗尽常见于配置了动态一对一的场景比如nat outbound 2000 address-group 1 no-pat这时每个内网IP都需要独享一个公网IP并发一多就爆。如果确认业务不需要一对一把no-pat去掉改成端口复用能立刻缓解大量压力。如果是纯PAT也满了那多半不是正常业务造成的得查是哪个内网IP在疯狂建连。华为上可以这样查display nat session table verbose然后通过源地址聚合看一下哪个IP的会话数异常高。常见原因有内网中毒、P2P下载工具开了太多连接、或者某台设备在做扫描探测。处理上可以做限制比如限制单个IP的最大会话数同时在防火墙上过滤可疑流量。会话表本身也有老化时间默认情况下TCP大约在1200秒左右、UDP更短。如果业务里有大量长连接可以把老化时间适当调大避免连接频繁被拆。4.4 VSYS虚拟系统下的NAT路由环路风险这个坑比较深一般人在物理防火墙上配NAT很少碰到但在华为USG防火墙的VSYS虚拟系统里做NAT时风险是真实存在的而且一出现就是全网性的故障。VSYS把一台物理防火墙划分成多个虚拟防火墙每个VSYS有自己独立的接口、路由表、NAT策略。问题出在虚拟系统之间的路由递归上。假设你在某个VSYS里部署了NAT地址池但该VSYS没有到内网服务器网段的精确路由转发时流量可能会被丢到默认路由而默认路由又指向了另一个虚拟系统对方查不到对应会话再给你绕回来。这么一来流量在防火墙内部转圈形成了一个黑洞式的路由环路。规避手段也很明确第一给NAT地址池所在的网段配置黑洞路由指向空接口防止任何去往池地址段的流量在虚拟系统间乱窜。第二检查VSYS里的回程路由确保NAT转换后的流量能精确匹配到正确的下一跳。第三部署NAT时先在根系统做通测试再挪到VSYS里验证缩小排查范围。本质上这跟普通路由环路的处理思路一致NAT只是增加了“地址被改写后下一跳判断可能不一致”的变量排查时多看一眼路由表很多问题都能提前发现。5. 进阶一点电信级NAT和NAT645.1 电信级NAT做了什么事电信级NATCarrier-Grade NAT通常写作CGN也被叫做运营商级NAT。普通企业NAT是在自己边界设备上做CGN则是运营商在城域网出口部署的大型NAT设备把一大片用户私网地址统一转换到有限数量的公网IPv4地址上。为什么会出现CGN原因很简单公网IPv4地址确实快分完了运营商不可能给每个家庭单独分配公网IP于是分配给宽带用户的地址变成了运营商私网地址或保留地址用户在拨号后拿到的IP不是严格意义的公网地址上网时要再经过一层运营商的NAT转换。CGN带来的影响很直接如果你在家庭宽带后面搭建NAS、开P2P下载、做游戏联机可能会发现端口不通、连接受限因为运营商的NAT设备默认不会为每个用户单独映射端口外部无法主动访问你的设备。遇到这类问题通常只能向运营商申请公网IP或者使用内网穿透方案绕过。这也是很多折腾网络的人在带宽升级之后优先找客服改公网地址的根本原因。对运维人员来说CGN意味着做任何“主动入站”类的业务时都要提前确认自己是否真的拿到了可路由的公网地址而不是只看着光猫WAN口有一个“看起来像公网”的IP就完事了。5.2 NAT64解决IPv6-only用户访问IPv4资源NAT64是IPv6过渡技术里的重要解决方案之一。它解决的是“纯IPv6网络里的设备怎么访问IPv4资源”的问题和传统NAT方向刚好相反传统NAT把私网IPv4转成公网IPv4NAT64把IPv6地址转成IPv4地址。它的工作方式通常要配合DNS64一起来看。当IPv6主机去解析一个只有IPv4记录的域名时DNS64会合成一条AAAA记录指向一个特殊前缀的IPv6地址这个前缀默认是64:ff9b::/96。主机发往这个前缀的IPv6流量会被送到NAT64设备设备再把IPv6头改成IPv4头目的地址换成真正的IPv4地址源地址则是NAT64设备从IPv4侧地址池里选出来的地址。和传统NAT一样NAT64也维护会话表回程流量通过会话表找回IPv6地址。它在校园网、移动网络里比较常见企业内网如果已经全面部署IPv6测试环境又不想放弃对老IPv4服务器的访问NAT64就是一条比较成熟的路径。6. 调试NAT时的几个关键细节6.1 ALG和ASPF多通道协议容易栽跟头FTP、SIP这类多通道协议在NAT环境里经常出问题。它们的通信过程是先在主连接上协商出一个动态端口然后通过这个动态端口传数据。如果NAT设备没有识别这类协议协商出来的内网IP地址或端口就直接暴露在报文中对端拿着这个地址回连NAT设备又不知道要把这部分流量映射给谁结果就是控制通、数据不通。华为防火墙上的ASPF、路由器和部分防火墙上默认启用的ALG做的就是主动识别这些多通道协议动态为数据通道建立临时NAT映射。遇到FTP在NAT后传文件失败的时候先查一下设备的ALG/ASPF开关是否打开比抓包分析半天效率高得多。6.2 会话老化时间要按业务调整NAT会话表不是一直占着的默认情况下TCP会话在一段时间没有流量后会被清除。这个时间如果太短数据库长连接、SSH、WebSocket这类会话就会定期断开客户端重连又很频繁白名单机制还能用但用户体感就是在“莫名其妙掉线”。建议重点业务开通前先评估一下连接的空闲时间。华为设备上用nat session tcp aging-time可以调整TCP会话老化时间许多设备也支持按ACL或应用来区分老化策略。调大老化时间并不总是好事老化时间越长会话表占用越高设备并发能力下降越明显。合理的做法是给长连接业务单独建策略其他业务保持默认值。6.3 NAT日志打开之后记得定期归档NAT日志在日常运维里不受重视真出问题的时候就后悔了。某台内网设备对外发送了大量异常请求回源到了公网某个IP如果不记录NAT会话日志你只能看到一个公网IP完全定位不到具体是内网哪台机器。打开NAT日志后配合源地址、源端口、时间戳能快速把“公网IP加端口”还原成“内网IP加进程”。日志量会很大尤其出口流量大的环境一小时的NAT会话可能有几十万条。建议日志服务器容量和归档策略提前规划好没必要全部永久保存但至少保留近三个月的访问痕迹应对突发的安全审计和误报排查。否则等你想查的时候设备上可能早就被滚动覆盖了。调试NAT类问题做得多了我自己的习惯是不管现象多奇怪先display nat session table看一眼会话表再看路由最后才去翻配置。会话表记录了每一次转换的实际情况设备怎么想的它比任何配置都诚实。很多所谓“NAT不生效”的疑难杂症其实看一眼会话表里有没有那条记录就已经能判断出问题方向了。NAT本身不复杂复杂的是它和路由、防火墙策略、应用协议交织在一起。把每个环节拆开来看大部分问题都能找到清晰的答案。
返回列表