跳到主要内容

大多数人在连接拒绝工作之前,从不会想到 NAT。你家里的路由器、手机的移动网络、公司办公室,都在许多设备之间共用少量公网地址,靠的就是网络地址转换(NAT)。上网浏览时,这种安排完全看不见。可当你想在两台设备之间建立直连隧道、从家里对外提供服务,或者纳闷为什么 VPN 能上网却连不到自己家的存储盒时,它就变得非常明显。

本文讲 VPN 的 NAT 穿透背后的实用概念:NAT 做了什么,为什么它会阻挡直连,合法隧道用哪些技术绕过这个障碍,以及如何排查。这是普通的网络知识,不涉及绕过任何人的网络规则。如果你还不清楚什么是公网地址,先读 什么是公网 IP 地址。

NAT 究竟做了什么

IPv4 地址稀缺,所以家庭和办公室内部使用私有地址,就是 RFC 1918 所描述的那种(例如以 192.168 开头的地址)。这些地址不能在公网上使用。路由器位于两个世界之间,负责翻译。

当 192.168.1.20 这台笔记本向某个网站发起连接时,路由器会:

  1. 把源地址换成自己的公网地址。
  2. 为这次对话挑一个空闲的公网端口。
  3. 在表里记一行:“私有地址和端口 X,对应公网端口 Y,正在和那个网站通信”。
  4. 改写回程数据包,让它们送到这台笔记本。

这张表就是 NAT 映射,也是整件事的核心。映射之所以存在,是因为笔记本先开了口。如果陌生人给你的公网地址发包,而表里没有匹配的行,路由器不知道该交给哪台设备,便直接丢弃。这就是 NAT 让人觉得像一种保护的原因,尽管它的设计目的是节省地址,而不是阻挡攻击者。

为什么 NAT 会挡住直连隧道

普通的客户端到网关的 VPN,对 NAT 毫无问题。手机先向网关发出第一个包,路由器建立映射,网关的回应通过它返回。网关有公网地址和监听端口,所以不需要被“找到”。

麻烦出现在双方都无法从公网被访问时:

  • 不同家庭里的两台笔记本,各自想要一条直接的加密链路。
  • 远程办公的人想访问家里路由器后面的一台机器。
  • 游戏或通话应用想在两位玩家之间建立直接路径。

双方都能向外发包,但谁也收不到别人主动发来的第一个包,双方都在等对方先开口。NAT 穿透就是打破这个僵局的工具箱。

主要技术

探测自己的地址

设备首先需要知道自己从外面看是什么样子。公网上的一个辅助服务回答一个简单问题:“这个包是从哪个地址和端口来的?”设备由此得知,路由器把它显示为某个特定的公网地址和端口。STUN 这类协议就是为此而设,许多隧道工具通过自己的协调服务做类似的事。

打洞(hole punching)

知道双方的公网地址和端口后,两台设备几乎同时向对方发包。A 发出的包在 A 的路由器上建立一条期待 B 回应的映射,B 也一样。当 A 的包到达 B 的路由器时,B 自己发出的包早已建好一条映射,所以它能被放行。所谓“洞”,就是从内部打开的一对相互匹配的映射。

用时间举个例子:14:00:00,两台笔记本得知了彼此的公网地址。14:00:01,各自发出一个小包。最先的几个包可能被丢弃,因为对侧映射尚未就绪,但稍后第二次或第三次尝试就会被接受。到 14:00:03,加密隧道就可以开始握手了。

Keepalive

映射不会永远存在。路由器会在空闲大约半分钟到几分钟后删除对应行,具体取决于设备和协议。每隔 15 到 30 秒发一个小包,就能让映射保持有效。这就是隧道工具提供 keepalive 设置的原因,它对需要在沉默时仍可被联系到的设备最为重要。

中继

打洞失败时,中继是后备方案。中继是双方都能向外连接的一台公网机器,它在两者之间转发已经加密的数据包。它几乎在任何地方都能工作,代价是多绕一跳、延迟增加,以及受限于中继自身的承载能力。中继理应读不到内容,但能看到流量的多少和时间规律。

在自己的路由器上做端口映射

如果你能控制路由器,可以手动创建映射,称为端口转发,也可以让路由器通过 UPnP 等方式自动完成。这相当于从互联网到某台设备开了一扇固定的门。简单,但会把一项服务暴露给所有知道地址的人,所以要谨慎。VPN 端口转发详解 说明了用途和风险。

NAT 的类型与它们允许什么

不同设备的 NAT 行为各不相同。名称可能不一样,但关键在于路由器如何复用映射。

行为 做法 对穿透的影响
与目的地无关的映射 对所有目的地使用同一个公网端口 打洞效果很好
与目的地址或端口相关的映射 针对不同目的地使用不同公网端口 打洞常常失败,因为探测到的端口已不适用
Open 或 full cone 任何人都能访问已映射的端口 容易,但很少见
Restricted 只允许来自你联系过的地址的回应 适用于打洞的做法
运营商级 NAT(CGNAT) 运营商让许多用户共用一个公网地址 往往没有直连路径,也无法端口转发

游戏主机通常把这些显示为“Open”“Moderate”或“Strict”。玩家视角和 VPN 能改变什么,可参阅 VPN 与 NAT 类型。

几个具体场景

家里的服务器与出差的笔记本。 小明在家里放了一个小型存储盒。他家的路由器有正常的公网地址,于是他设置了一条范围很窄的路由,以及一条带 keepalive 的隧道。笔记本从酒店先向外发起连接,存储盒通过同一个映射回应。没有多余的端口被打开。

使用运营商共享地址的家庭。 阿琳家的宽带运营商使用 CGNAT,所以她路由器上的“公网”地址,从运营商角度看其实是私有的。在她自己的路由器上做端口转发没有任何作用,因为运营商的设备挡在前面。她的选择是使用基于中继的隧道,这行得通是因为家里的设备主动向外连接,或者询问运营商能否提供公网地址。CGNAT 环境下的 VPN 说明了如何辨别这种情况。此类共享地址段在 RFC 6598 中被保留。

两台设备都在严格的路由器后面。 两位朋友想在笔记本之间建立直连,但两台路由器都按目的地使用不同端口。打洞失败,他们的工具回退到中继。他们发现 ping 比预期高,传文件时能接受。如果要玩一局游戏,他们大概会考虑其他方案。

IPv6 在其中的位置

IPv6 的地址多到每台设备都能拥有自己的公网地址,理论上大大减少了对 NAT 的需求,两台 IPv6 设备可以直接互通。但实际上,家用路由器默认仍运行防火墙,会阻挡未经请求的入站数据包,所以来自外部的第一个包会像遇到 NAT 一样被丢弃。上面的穿透思路依然适用:双方都向外发包,让各自的防火墙允许对方的回应,并用 keepalive 保持这种放行。

实用的结论是,“没有 NAT”并不等于“可以访问到”。检查运营商是否提供 IPv6,路由器防火墙能否针对某台设备放行,以及你的隧道工具是否使用它。如果你同时使用 VPN,还要测试 IPv6 流量是走隧道的,没有绕过隧道泄漏;检查方法见 什么是 IP 泄漏。

隧道连不上时怎么排查

按顺序做,每次只改一件事。

  1. 确认基本通路。 设备能上网吗?强制门户或路由器故障会阻挡一切。
  2. 检查是否双重 NAT。 如果路由器的“WAN 地址”以 10、192.168 或 100.64 到 100.127 开头,说明上游还有另一层转换。若允许,把运营商的设备设为桥接模式往往能解决。
  3. 看协议。 许多隧道使用 UDP,有些网络会丢弃它。换一个网络(如移动数据)来测试。
  4. 加上或缩短 keepalive。 如果隧道能用一分钟然后沉默,说明某个映射正在过期。
  5. 检查端口转发。 指向旧 IP 或已变更设备的转发不起作用。给目标设备一个固定的内网地址。
  6. 检查路由器的隧道透传。 有些老路由器处理某些隧道数据包时会出错。参见 路由器 VPN 透传。
  7. 测试数据包大小。 大小不匹配会让隧道看起来已连接,大文件传输却卡住。VPN 的 MTU 问题 做了说明。
  8. 按顺序重启。 先断电重启光猫,再路由器,再设备。映射会被清空并重建。

局限与良好习惯

  • 穿透不保证直连路径。 严格的 NAT 和 CGNAT 可能迫使使用中继,要为额外延迟做好准备。
  • 端口转发是一扇长期开着的门。 只转发必需的内容,只转给一台设备,并保持该设备更新。
  • NAT 不是安全功能。 提供保护的是带认证和加密的隧道,而不是路由器的地址表。
  • 普通的客户端 VPN 用不上其中大部分内容。 如果你只想在公共 Wi-Fi 上保护手机,到网关的普通连接无需特殊步骤就能穿过 NAT。
  • 清理不再使用的东西。 删除配置里的旧转发规则、旧密钥和旧设备。

总结

NAT 把私有地址转换成共享的公网地址,只让由内部发起的对话得到回应。这对手机到网关的普通 VPN 连接毫无影响,却会阻挡各自藏在路由器后面的两台设备之间的直接链路。探测地址、打洞、keepalive、中继和谨慎的端口映射可以解决问题,而 CGNAT 或双重 NAT 能解释大多数顽固的情况。隧道失败时,先检查基本通路,查看是否双重 NAT,换个网络测试,并缩短 keepalive。

如果你只是想在共享网络上保护自己的设备,价格页面 说明了预付通行证的运作方式,下载页面 提供免费应用。

常见问题

VPN 里的 NAT 穿透是什么?

它是一组技术,让两台各自位于地址转换路由器后面的设备仍能建立隧道。包括同一时刻互发数据包,让两台路由器都建立映射;用小数据包保持映射不过期;以及在无法直连时回退到中继。

用手机连接 VPN 服务时需要 NAT 穿透吗?

通常不需要特别处理。手机主动向外发起连接,路由器记住它并让回应进来。穿透更多用在设备必须先被外部联系到的情况,比如家里的服务器。

NAT 就是防火墙吗?

不是。NAT 改写地址,使许多设备共用一个公网地址。副作用是未经请求的入站数据包无处可去,看起来像防火墙,但 NAT 并不是为安全而设计的工具。

什么是双重 NAT?为什么会带来麻烦?

双重 NAT 指两台路由器依次转换你的地址,例如运营商的光猫加上你自己的路由器。端口转发和直连就必须在两台上都安排好,而运营商那一台往往无法设置。

NAT 穿透会降低网络安全性吗?

这些技术只为你发起或认可的流量开临时映射,而且隧道本身经过加密和认证。真正的风险是长期开放的端口转发,以及遗留在允许名单里的旧设备。

关于作者

Bob Kanokphon Thongdee,XPASS VPN 创始人

Bob Kanokphon Thongdee

  • XPASS VPN 创始人
  • eSIMonline.asia 联合创始人
  • 7 年以上网络营销经验
  • Cojourney Visa 与 Cojourney Travel 创始人

短途出行或忙碌的一个月,需要 VPN?

XPASS 提供按天数计算的预付通行证。一次付款,不会自动续费。

查看通行证

继续阅读

设备指南

运营商级 NAT(CGNAT)下使用 VPN:能用与不能用的

CGNAT 让许多用户共用一个公网地址。了解为什么 VPN 应用在其后仍然可用,哪些功能会失效,以及你有哪些选择。

阅读约 9 分钟

VPN 基础

VPN 与 NAT 类型:对游戏连接有什么影响

游戏菜单会显示 Open、Moderate 或 Strict。本文讲清这些标签的含义、VPN 如何改变它们,以及哪些因素才真正决定联机手感。

阅读约 9 分钟

VPN 安全

VPN 与端口转发详解:用途与风险

端口转发能让外部连接访问内部网络中的某台设备。本文说明有无 VPN 时它如何运作、有哪些用途,以及开放端口可能带来的风险。

阅读约 9 分钟

VPN 基础

什么是公网 IP 地址?

公网 IP 地址是你连接网站时对方看到的地址。本文解释它如何分配、与家庭网络内的私有地址有何不同,以及它能和不能透露什么。

阅读约 9 分钟

VPN 基础

Mesh VPN 是什么:安全连接你自己的设备

Mesh VPN 让你自己的设备直接互联,而消费级 VPN 把流量送往服务商的服务器。本文说明两者的区别、组成部分,以及各自适用的场景。

阅读约 9 分钟