什么是NAT(网络地址转换)?基础原理梳理

为什么家里一台路由器就能让好几台设备同时上网?一起来梳理NAT背后的原理。

什么是NAT(网络地址转换)

这是路由器的核心功能之一,负责在家庭或办公网络内部使用的私有IP地址,和真正能连上互联网的那一个公网IP地址之间进行相互转换。

为什么需要NAT:IPv4地址枯竭

全球可分配的IPv4地址总共只有约43亿个,远远不够给每一部手机、每一台笔记本电脑、每一个物联网设备都分配一个公网地址。有了NAT,一个家庭里的几十台设备,就能共用运营商分配的那唯一一个公网IP同时上网。这正是让IPv4在本该枯竭的时间点之后,依然能够继续沿用至今的现实折中方案。

PAT(端口地址转换):家用路由器实际的工作方式

笔记本电脑和手机之所以能同时上网又互不干扰,是因为路由器把每台内部设备的(私有IP,端口)组合,分别映射到公网IP上不同的端口号。比如笔记本的请求可能从公网IP的40001端口发出,手机的请求从40002端口发出,响应返回时路由器根据端口号判断该转发给哪台设备。家用路由器实际采用的,正是这种连端口号一起转换的PAT(端口地址转换,也常被称为NAPT)方式。

NAT转换表:记住映射关系的账本

每次建立新连接时,路由器都会临时创建一条类似"内部192.168.0.5:51000对外映射为公网IP:40001"的记录。这条记录会在通信结束或一段时间没有响应后自动被清除;而对于在线游戏、视频通话这类需要长时间保持连接的服务来说,如果这条记录被提前清除,就可能导致连接突然中断。

静态NAT与动态NAT的区别

静态NAT把一个私有IP地址和一个公网IP地址永久固定配对,适合那些必须始终以同一个外部地址被访问到的服务器。动态NAT则准备一个公网IP地址池,在需要时临时分配其中一个,常用于企业网络中让多个用户轮流共用有限数量的公网IP。不过,家用路由器日常实际运行的方式,其实更接近前面说的按端口转换的PAT,而不是这两种经典分类中的任何一种。

NAT的局限:端口转发和P2P连接会变得困难

由于NAT默认只对内部主动发起的通信返回响应,像家庭服务器被外部访问、或游戏主机的P2P匹配这类由外部先发起连接的情况,如果不做额外配置,默认就会被阻挡。要解决这个问题,需要用到端口转发——把特定端口开放给指定的内部设备,或者UPnP——按需自动开放端口。在线游戏中常见的Open、Moderate、Strict这几种NAT类型标签,归根结底都源于这个局限。

NAT带来的附带安全效果

NAT本身并非为安全而设计,但它会产生类似防火墙的附带效果:外部攻击者尝试连接你的公网IP时,如果NAT表里没有对应的记录,路由器根本无法判断这些流量该转发给哪台内部设备,于是自然而然地将其丢弃。

私有地址段:家里为什么都是192.168开头

RFC 1918规定了三段只在内部使用、不会在互联网上路由的私有地址:10.0.0.0/8、172.16.0.0/12和192.168.0.0/16。家用路由器多使用192.168开头的网段,公司和学校的大网络则常用10开头的网段。不同家庭可以同时使用相同的私有地址而互不冲突,因为这些地址在到达互联网之前都要经过NAT转换。

IPv4地址耗尽的时间线

IANA在2011年2月把最后的IPv4地址块分配给了各区域互联网注册管理机构,此后各地区逐步进入严格限量分配的阶段。地址变得稀缺,也让NAT和地址转让市场成为现实中的常态,而不是临时办法。

运营商级NAT(CGNAT):NAT之上再来一层

当运营商手里的公网地址不够用时,会让许多用户共用同一个公网地址,在运营商网络里再做一层NAT,这就是CGNAT。这时你自己路由器的WAN口拿到的往往是100.64.0.0/10这一段共享地址或其他内网地址,而不是真正的公网地址。其后果是无法做端口转发,从外部访问家里的设备也会很困难。

IPv6时代的NAT

IPv6的地址空间足够大,每台设备都可以有自己的全球地址,不再需要靠NAT省地址。不过家用路由器默认仍会用状态防火墙阻止未经请求的入站连接,所以改用IPv6并不等于把设备直接暴露到互联网上。IPv4和IPv6在相当长的时间里会并存,因此理解NAT仍然有实际价值。

常见排查思路

遇到联机失败或远程访问不通时,可以按顺序排查:先确认路由器WAN口地址是否为真正的公网地址;再确认端口转发规则指向了正确且固定的内网地址;然后检查设备自带的防火墙是否放行;最后考虑是否处在运营商级NAT之后。不要同时改动多项设置,每次只改一项,才能知道是哪一步起了作用。

为什么长时间保持的连接有时会突然断开

每个连接背后的NAT表记录都有存活期限,一旦因长时间没有流量而过期,路由器就不知道该把响应转发到哪里了。需要长时间保持连接、但流量并不连续的在线游戏和视频通话尤其容易受影响——通话安静太久,或者游戏过程中出现网络流量的空档期,都可能导致对应的NAT映射过期,连接随之意外中断。意识到这个问题的应用程序,通常会按固定间隔发送很小的"保活"数据包,专门用来让NAT表里的记录保持存活。

NAT看起来像防火墙,但它并不是防火墙

NAT默认拦截未经请求的入站连接,只是其工作原理带来的一个附带效果,而不是刻意设计的安全控制手段——它并不区分恶意流量和正常流量,不会记录被拦截的尝试,也无法检查数据包内部的具体内容。真正的防火墙会依据明确制定的规则来决定放行哪些流量。这也是为什么如果只依赖NAT、而没有配备真正的防火墙功能,网络就会缺少专业安全工具才能提供的那种精细控制。

NAT如何处理超时与不同协议

NAT表里的记录并不是永久的,不同协议的保留时间不同。TCP连接有明确的建立和关闭过程,路由器可以据此判断何时删除记录,通常允许较长的空闲时间;UDP没有连接的概念,路由器只能靠一段时间内是否有流量来判断,所以UDP记录往往更短命,具体时间因厂商和设置而异。标准文档对最短保留时间有建议值,但实际设备并不一定遵守。这就是在线游戏和语音通话常常需要定时发送心跳包的原因。如果你发现通话在安静一段时间后断线,调大路由器的UDP超时设置(如果有这个选项)或让应用开启保活功能,往往有帮助。

NAT对应用设计的影响

NAT让互联网变得不再是“任何设备都能直接访问任何设备”。这催生了一整套绕过它的技术:STUN用来发现自己的公网地址,TURN在无法直连时提供中继,ICE负责把各种路径组合起来,UPnP和NAT-PMP让应用自动向路由器申请端口映射。理解了这些,就能明白为什么视频通话、联机游戏和远程桌面软件通常都带有一个“服务器”,哪怕通话本身可能是点对点的。对于需要从外网访问家里设备的需求,更稳妥的办法是使用有认证的VPN或可信的远程访问服务,而不是随意开放端口。

常见问题

NAT和防火墙是一回事吗?

不是。NAT的职责只是转换地址,默认拦截未经请求的外部连接只是这种转换机制带来的附带效果,而不是刻意设计的安全功能。要按精细规则过滤流量,需要另外配备真正的防火墙功能。

用了IPv6是不是就不需要NAT了?

IPv6的地址空间极其庞大,理论上可以给每台设备都分配一个公网地址,使NAT不再是必需品。但现实中,在可预见的一段时间里,大多数网络仍会同时运行IPv4和IPv6,所以NAT很可能还会继续在日常中被使用一段时间。

路由器重启后为什么有些连接会断开?

因为NAT表保存在路由器的内存里,重启后记录全部丢失,原有连接的回包不知道该转给谁,于是连接中断。重新建立连接即可。

一个公网IP最多能同时支持多少条连接?

端口号是16位的,所以对每种协议和每个目标来说,理论上能区分的映射数量在几万这个量级;实际能支持多少还取决于路由器的内存和性能。家庭使用一般不会碰到这个上限。

怎么判断我是不是在运营商级NAT后面?

比较路由器WAN口显示的IP和在线IP查询网站显示的IP。如果不同,或者WAN口地址落在100.64.0.0到100.127.255.255之间,说明很可能处于运营商级NAT之后。