NAT 系列:问题及解决方法

NAT 引发的问题以及解决方法

对称型 NAT(Symmetric NAT)常常在游玩联机游戏(尤其是 P2P 联机方式)时候给我们造成困扰。如果 XboxPSswitch 或者 PC 上的应用程序报告 NAT 是严格类型 3类型 D对称这样的字样,那么就意味着你将会出现联机问题。

理解这个问题之前,首先要认识到,这些设备及软件是无法感知它们是否被 NAT 化的。但是,在 Internet 上与之通信的任何设备都应该使用公共 IP 地址,例如 1.1.1.1。在进行任何连接尝试时,都必须知道目标公共 IP 地址和端口。在上面的所有示例中,你应该发现了网站 IP 地址和端口均已知,这些地址是固定的,并且未曾发生更改。但是,某些程序会使用一系列动态端口。在运行游戏时,你的主机选择一个随机端口来进行游戏。由于其他主机不知道你的 IP 地址或端口,因此必须在连接之前以某种方式了解它。你的主机会将游戏的 IP 地址和端口发送到 Xbox LivePS 网络,这样其他主机便可以在其中检索它,然后直接与你连接。但问题是,它发送的是内部 IP 地址 192.168.0.1 和端口 54324,而不是 Nat 后的公共 IP。它应该发送的是(例如)1.1.1.1 的公共 IP 地址和端口 54324。而且当处于对称型 NAT 时,该端口也会发生更改,因此它必须发送经过 NAT 处理的端口,例如 54254,而不是主机本身的内部端口(54324)。

这不仅仅是游戏面对的问题,这一直是 NAT 的问题。

那么,主机如何得知它位于 NAT 之后,并告诉其他主机将数据发送到 NAT 后的 IP 地址和端口而不是其自身的内部 IP 地址和端口?

STUN 是 NAT 的 Session Traversal Utilities 的缩写,你可能已经猜到了它的名字,它是一个实用工具的集合,以帮助 NAT 设备穿越内网。简单地说,STUN 允许你的主机 / PC 或内部设备了解它的公共 NAT 的 IP 地址和端口是什么。一旦实现了这一点,你的设备现在可以发送正确的 IP 和端口,其他设备也可以连接到你。但是,它在对称型 NAT 下无法工作,在对称型 NAT 中,你的主机可以得知它的公共 IP 地址,但无法得知它的公共端口(因为,端口是 NAT 随机生成的)。

STUN 的工作原理很简单。你连接到一个运行 STUN 协议的服务器 (Xbox Live Servers),它从接收的数据包中读取源 IP 地址和源端口,这些当然会是 NAT 后的(这是我们需要的)。然后 STUN 将这些信息返回给客户端,它的工作就完成了。你的主机现在知道了它的 NAT 后的 IP 和端口,并且会把这些信息发送到其他设备上。

https://fastly.jsdelivr.net/gh/techkoala/techkoala.github.io@master/images/Network/NAT/STUN_Algorithm.png
STUN 算法

如果你还记得,除了对称型 NAT 之外,所有其他类型的 NAT 都不会改变源端口。这意味着当我的主机创建一个 NAT 映射时,它将对所有这种类型的连接使用它,当向互联网上的个设备发送和接收数据包时,它使用同一个映射,因此它使用相同的公共 IP 地址和端口;

但在对称型 NAT 的情况下,每一个连接都有一个不同的映射,有一个不同的(随机生成的)端口,意味着连接到 STUN 服务器也将有它自己独特的映射,表现的就像一个新的设备接入一样。这意味着每个映射都有不同的端口,在这种情况下,STUN 检测到的端口现在已经没有用了,因为这个映射是 STUN 服务器独有的。无论映射到其他设备的端口是什么,都是未知的,STUN 也没有办法检测到它。由于你的主机无法得知每个映射到每个主机的公共 NAT 化端口,因此无法将这些信息传递给你,也就意味着没有设备可以连接到你的游戏,这就是对称型 NAT 导致如此多游戏联机问题的原因。

路由器上的外围网络(也称 DMZ)功能用于消除对 Internet 的限制。它主要是将你的设备移到你的网络防火墙之外的区域,将部分用于提供对外服务的服务器主机划分到一个特定的子网 —— DMZ 内,在 DMZ 的主机能与同处 DMZ 内的主机和外部网络的主机通信,而同内部网络主机的通信会被受到限制。这使 DMZ 的主机能被内部网络和外部网络所访问,而内部网络又能避免外部网络所得知。

注意 当你设置外围网络时在主机上使用静态 IP 地址十分重要。要设置静态 IP 地址,请使用路由器的 DHCP 预留功能(如果可用)。如果该功能不可用,你将需要在你的设备 上配置手动 IP 设置。

UPnP(Universal Plug and Play)是帮助路由器有效通信的一个标准。如果路由器或网关支持 UPnP,则它在默认情况下可能已启用。开启 UPnP 功能后,局域网中的计算机可以请求路由器自动进行端口转换。这样,互联网上的计算机就能在需要时访问局域网计算机上的资源(如 MSN Messenger 或迅雷、BT、PPLive 等支持 UPnP 协议的应用程序)。