把 VPN 端点填进 Minecraft 的服务器列表看起来合乎逻辑,却每次都失败,因为这个地址只是隧道的终点,并不承载游戏。已经连上同一 VPN 的玩家本来就有通往游戏主机的路径,所以这一栏要写主机地址和游戏监听的端口。把这两点弄对,剩下的问题就是普通的服务可达性,一份比最初想象短得多的检查清单。

两个地址,两份职责

一个地址是公共基础设施:在节点之间搬运加密数据包的传输端点。另一个是运行专用服务器那台机器的私有地址。两者不能互换,用其中一个代替另一个,只会得到连接被拒绝或超时,看起来像防火墙问题。

RoleAddressWhere it belongs
Public transport endpoint203.0.113.40VPN client configuration, never the game
Game host on the VPN10.60.0.20Server address field, with the port
Player peer10.60.0.30Assigned by the tunnel, nothing to type

使用默认端口时,玩家只需输入 10.60.0.20:25565,别的都不用填。Mojang 的 Java 服务器下载页面把 25565 列为默认端口;如果服务器管理员改过端口,应当相信他,而不是拿旧教程去质疑。

让那个地址成为真正的服务

地址可达是必要条件,并不充分。专用服务器必须在运行,必须与玩家客户端使用的版本兼容,并且必须监听隧道能够投递到的地址。只绑定在 loopback 上的进程,不会因为有人给机器加了另一个地址就变得可达。

在碰防火墙之前,先确认监听状态:

ss -lntp | grep 25565
nc -vz 10.60.0.20 25565

第一行显示进程实际绑定到了什么,第二行显示对端能否完成 TCP 握手。当绑定是 127.0.0.1 时,任何 VPN 配置都改变不了结果,而正是这一个细节解释了数量惊人的「VPN 坏了」的报告。

对端策略、防火墙与返回路径

监听之上还有两个权限问题。VPN 的对端配置必须允许两个对端之间通信,游戏主机的防火墙必须接受来自该对端的游戏端口。两者都应限制在游戏服务和已授权的对端范围内,而不是关掉主机防火墙——那等于用两行规则换一个更大的问题。窄规则也是唯一能通过安全评审、又不必附上一段辩解理由的做法。

然后要记住成功的 ping 能证明什么。能到达 VPN 网关,或者能从游戏主机得到回应,只说明 ICMP 穿过了路径。游戏连接需要特定端口在双向都开放,返回路径和去程同样重要。

当服务器位于网关之后

上面的例子让游戏服务器充当对端,地址规划因此很简单。如果服务器位于 VPN 网关后面的局域网里,玩家需要服务器可路由的私有地址,网关需要为那个网段配置转发,而且 局域网主机需要一条回到隧道客户端的路由。漏掉返回路径,握手就会半途而废,这是三种故障里最令人困惑的一种。

不要为了照搬这个拓扑,把示例里的对端地址复制到另一台机器上。示例中的地址描述的是角色,把一个地址用在两个角色上会造成路由无法解决的重叠。

发现、账户以及不要改动的地方

自动发现局域网是建立在广播通告之上的便利功能。经过路由的 VPN 未必承载这些广播,所以局域网列表里缺少条目,并不能说明显式私有地址是否可用。先把地址填进去,再下结论。如果连得上,这个发现上的缺口只是使用上的不便,而不是故障,可以照实记录,不必去追查。

同时也别动游戏正常的账号认证和准入策略。可用的私有路由给的是路径,不是成员资格;再怎么调整网卡优先级,也代替不了判断客户端究竟该用哪个目标地址。

相关文章