为什么长时间保持的连接有时会突然断开
每个连接背后的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之后。