使用 PS3/Xbox 朋友遇到无法联机或 NAT 类型显示为严格也是类似原因。

什么是 NAT

首先我们得先理解 NAT 的概念。它全称是 Network Address Translation 即网络地址转换。使用 NAT 的原因很多,主要是 IPv4 地址资源枯竭,以及为了网络安全(也便于监管)。我们知道每一个能够上网的设备必然有一个 IP 地址,但是并不是所有设备都拥有「公网IP」。而 NAT 就是把内网 IP 映射成公网 IP,从而使设备可以访问互联网。

这里说 公网IP 并不规范。现在很多运营商已经不分配公网 IP 了。

听起来很高端的技术其实就在我们身边。一般常规的家庭网络拓扑是这样的:

入户光纤 → 猫 → 路由器 → 终端设备

运营商只给我们分配了一个 IP 地址,这个 IP 理所应当被路由器占用着。而我们许多终端设备拿到的是路由器分配的内网地址,一般类似 192.168.x.x。显然这个内网地址是无法和互联网通讯的。因此我们需要 NAT 来建立内网 IP 与 公网 IP 的映射,这样当终端设备访问互联网,将数据交给路由器,然后路由器转交给服务器;服务器返回的数据交给路由器,路由器再根据映射传给终端就OK了。这个过程是 NAT。

什么是 UPnP

UPnP 是通用即插即用协议,英文 Universal Plug and Play。在这里,其目的是更加方便地穿透 NAT。可以理解为有了 UPnP 软件可以根据需求让路由器进行动态地进行端口映射。而不是你去路由器后台一个个手动设置。

下面是我的 UPnP 列表:

可以看到根据请求,路由器自动地把 WAN 10960 端口映射到了 192.168.50.120:10960 上,其实这个是我们家的摄像头,这样就可以从外面直接看到画面了。

NAT 类型

下面是我们的重点了。NAT 是有许多类型的,不同的类型限制不同。而对于大部分的应用(例如 PS3/XBox 联机游戏)来说,限制越少越好。

NAT 有4个类型:

  • NAT1: Full Cone NAT
  • NAT2: Address-Restricted Cone NAT
  • NAT3: Port-Restricted Cone NAT
  • NAT4: Symmetric NAT

从 NAT1 至 NAT4 限制越来越多。一般来说 NAT1/2 可以畅通无阻地进行联机。

典型情况下:

  • NAT1 可以与 NAT1/2/3 联机
  • NAT2 可以与 NAT1/2 联机
  • NAT3 只能与 NAT1 联机
  • NAT4 洗洗睡吧

NAT1

Full Cone NAT 是限制最小的一种。它将一个内部地址(iAddr:port1)与外部地址(eAddr:port2)建立映射。所有来自 iAddr:port1 的包都由 eAddr:port2 向外发送。所有外部主机(hostAddr:any)都可以通过向 eAddr:port2 发送数据来到达 iAddr:port1。(any 表示任意端口)

NAT2

相比1,NAT2 增加了地址限制。一个内部地址(iAddr:port1)与外部地址(eAddr:port2)建立映射。所有来自 iAddr:port1 的包都由 eAddr:port2 向外发送。但是只有曾经被 iAddr:port1 主动发送过包的外部主机(hostAddr:any)可以通过向 eAddr:port2 发送数据来到达 iAddr:port1

也就是说即便知道了 IP 与端口号,外部主机也不可以主动发送数据。

NAT3

相比2,NAT3 又增加了端口限制。一个内部地址(iAddr:port1)与外部地址(eAddr:port2)建立映射。所有来自 iAddr:port1 的包都由 eAddr:port2 向外发送。但是只有曾经被 iAddr:port1 主动发送过包的外部主机(hostAddr:port3可以通过向 eAddr:port2 发送数据来到达 iAddr:port1

注意哦,这里外部主机不仅地址,而且端口号也必须匹配才可以。

NAT4

内部地址每一次请求一个特定的外部地址,都可能会绑定到一个新的端口号。也就是请求不同的外部地址映射的端口号是可能不同的。

这种类型基本上就告别 P2P 了。

提升 NAT 类型

由于种种需求,我们往往希望获得至少 NAT2 的类型。提升 NAT 类型是一个非常复杂的问题,因为相关因素实在太多了。

首先给大家一个 NAT 类型测试工具

一般来说,我们希望 NAT 层数越少越好。每多一层 NAT 就意味着更加复杂的情况与配置。依旧是典型的网络拓扑:

入户光纤① → 猫② → 路由器③ → 终端设备

我们目标是把 NAT 降到1层(只有③),当然这是目标,但不是必须的。

拿到公网 IP

公网 IP 指的是全球可路由的地址。也就是说在全球任意地方只要接入互联网就可以访问到。

拥有公网 IP 对于 P2P 应用来说绝对是一个基础要求,这可以省掉许多麻烦(使①不发生 NAT)。如何确定自己是不是公网 IP 也很简单。访问这里你可以得到一个 IP 地址,把它与路由器中显示的 WAN 口 IP 进行比较,如果一致那么就是公网 IP 了。

如果不一致,那么只能联系运营商,自己是没有办法的。一般来说一级运营商(电信/联通)比较容易,而一些二级甚至三级运营商(长城)就没什么希望了。如果拿不到公网 IP,只能期望运营商不要把 NAT 类型限制太死吧。

猫改为桥接模式

区分猫和路由器

是调制解调器,仅仅负责将数字信号与电/光信号互相转换,功能单一。路由器可以扩展多个接口、进行组网以及相关配置,功能强大。无线路由器可以建立 WiFi 热点。

区分桥接与路由模式

现在原来越多的猫“越权管理”,增加了路由功能,也就是说猫和路由器一体化了。每一个路由器可以理解为一层网络,我们不希望层数过多。同时猫的路由功能往往不完善,难以进行高级配置。而桥接模式就是让猫回归本质,只负责信号转换。

区分路由与桥接模式最方便的办法是:如果你的路由器(电脑)直接连到猫上就可以上网,那么是路由模式;如果路由器需要配置 PPPoE 拨号那么就是桥接模式。

更改模式

一般来说更改模式需要猫的超级密码,这个用户是没有的。请联系运营商客服请求修改。改为桥接后②也不会发生 NAT 了。

警告:没能力折腾的不建议自己破解改。更改桥接模式之后记得重新配置路由器,输入宽带账号密码才可以正常上网。

更改路由器设置

首先要修改 NAT 类型,并不是所有的路由器或者路由器系统都支持这一设置。很幸运我的华硕路由器支持。打开 NAT 并将类型设置为最宽松的 NAT1(Fullcone)。

接着启用 UPnP,绝大部分路由器都支持的,耐心找一找。如果真的不支持那我建议换路由器。

如果不支持上述的 NAT 类型设置,我们还有一个大招。大部分的路由器都支持 DMZ (非军事化区),DMZ 指定的设备完全暴露在公网上。但是一个网络一般只能够设置1个 DMZ,显然如果设置多个路由器就不知道应该把数据包交给谁了。由于 DMZ 是和 IP 绑定的,而 IP 是动态分配的。所有首先我们将 IP 与 MAC 绑定(不同的路由器设置不同),然后将此 IP 设置为 DMZ 即可。

更改系统设置

最后如果你的系统启用了防火墙那么记得将需要的程序添加例外,或者关闭防火墙(不推荐)。最后进行测试,我已经提升到 NAT1 啦~

Last modification:December 18, 2018