端口转发与端口触发几乎总在家庭路由器的同一个菜单里,因此常被当成做同一件事的两种办法。转发是静态规则:无论此刻还有没有别的流量,打到 WAN 端口的入站连接都会被转换到固定的内网地址和端口。触发是有条件的:路由器盯着出站流量,只有当一条匹配的连接先出去,才会打开入站映射。VPN 服务器总是等别人先连进来,所以这个条件恰恰是它永远无法满足的那一条。

生命周期不同的两条规则

IPv4 的 NAT 是有状态的。内网主机把数据包发出去时,路由器会建立映射,让回程的应答找得到路;没有匹配映射的入站数据包会被丢弃,正是这个行为让未打补丁的桌面机留在互联网之外。转发是手工添加的永久转换条目。触发则是由流量模式守护的临时缺口。

实际差别在于时间。转发从保存那一刻起一直存在,直到有人删除。被触发的映射只在触发条件成立后存在,并随空闲计时器关闭;消费级硬件上以分钟计,重启则立即关闭。

抽象地说,两者都不更安全。转发把一个端口长期暴露在外;触发只在特定出站流量之后才暴露它。对于必须接受陌生人发来的第一个数据包的服务,只有其中一种符合要求。

为什么触发无法把服务器发布出去

VPN 服务器天生是接受方。对端无论是咖啡馆里的笔记本还是走移动数据的手机,都会先发第一个数据包,而路由器没有为它建立任何映射。内部没有任何东西向触发端口发起流量,规则就永远不会成立,连接在握手开始之前就断了。

在触发看似可用的场合,真正在触发端口上造流量的是别的东西:局域网里的客户端、监控探针,或服务器自己的出站检查。映射只为那一台主机打开,流量一停就关闭,于是下一个外部对端再次失败,而第一次成功躺在日志里,看上去像证据。

触发通常还是单主机的。很多实现只允许一台内网设备在同一时刻持有映射,这对需要应答多个对端的服务器来说恰好是错的。该功能是为那些主动向外开控制连接、再在第二个端口上等待入站数据的应用设计的,如今依旧只适合这种形态。

转发到底映射了什么

转发就是一条转换记录:WAN 端口与协议,对应到内网地址和端口。它要求另一端已经有监听在运行,也要求内网地址保持不变。租约迁到别的机器后,DHCP 会把每条隧道悄悄送到错误的主机,所以在写规则之前先做地址保留。

RuleOpens whenCloses whenFits a VPN listener
Port forwardSaved, at bootYou delete itYes
Port triggerMatching outbound trafficIdle timeout or rebootNo

协议比表单看起来更重要。走 UDP 的 OpenVPN 需要 UDP 转发,WireGuard 需要 UDP,而 IPsec 数据以 ESP 形式到达,IP 协议号 50,根本没有端口。只接受 TCP 或 UDP 的转发表单无法表达这种情况,所以 IPsec 需要 passthrough 或静态一对一映射,而不是一条端口规则。

路由器之上的一层

转发只管你拥有的那层转换。如果 WAN 地址不属于你,也就是运营商级 NAT 后面的情形——用户共享 100.64.0.0/10,见 RFC 6598——入站连接永远到不了你的路由器,因为运营商先转换了一次。你设备上的任何规则都无法改变这个顺序。

双重 NAT 只是同一问题的小号版本。你的路由器把流量转给 ISP 的路由器,而后者没有匹配规则,直接丢弃。要么在外层设备上加规则,要么把外层设备设为桥接模式,让你的设备持有公网地址。

所以测试必须从外面发起。从同一局域网经公网地址回环的测试依赖 hairpin NAT 支持,成功或失败都可能与规则无关;用移动数据的手机,或另一个网络上的朋友,才是更干净的验证。

把规则收窄,然后验证两端

只把一个端口转发到一个地址。因为最初几次尝试失败就加一整段范围,正是管理界面暴露到互联网上的常见路径;VPN 监听并不需要在旁边再发布一个路由器管理页面。

保留原本保护该监听的一切:证书或密钥身份、主机防火墙、当前的软件包版本。转发只负责放数据包进来;认证决定这个数据包会不会变成隧道。出问题时,这是两种不同的故障。

验证有两半。握手必须能从外部网络完成,接着服务器后面的私有资源必须能通过隧道回应。转发只放行隧道连接,别的都不管;10.8.0.0/24 的路由与授权是另一块屏幕上的另一项设置。

用三个问题决定

三个问题比任何对照表都更快定下选择:

  • 有没有东西从外面主动连进来,作为第一个数据包?那就用转发,或者中继。没有出站流量,触发永远不会打开,而那种流量不会存在。
  • 这个缺口必须活过空闲时间吗?那就用转发,因为被触发的映射会按自己的计划关闭。
  • WAN 地址是你的、可以公开吗?如果不是,先修上层再改任何规则。

如果三个答案都是否——一台自己拨号连商用服务商的笔记本就是这种情况——两条规则都不需要。NAT 后面的客户端能工作,是因为它自己建立了有状态映射;半夜读端口转发页面的绝大多数人,都属于这一类。

相关文章