通过 VPN 玩 Minecraft:服务器列表里该填哪个地址?
VPN 端点负责建立隧道,游戏需要的是主机的私有地址和端口。先把角色对应到地址,再检查监听、路由和主机规则。
把 VPN 端点填进 Minecraft 的服务器列表看起来合乎逻辑,却每次都失败,因为这个地址只是隧道的终点,并不承载游戏。已经连上同一 VPN 的玩家本来就有通往游戏主机的路径,所以这一栏要写主机地址和游戏监听的端口。把这两点弄对,剩下的问题就是普通的服务可达性,一份比最初想象短得多的检查清单。
两个地址,两份职责
一个地址是公共基础设施:在节点之间搬运加密数据包的传输端点。另一个是运行专用服务器那台机器的私有地址。两者不能互换,用其中一个代替另一个,只会得到连接被拒绝或超时,看起来像防火墙问题。
| Role | Address | Where it belongs |
|---|---|---|
| Public transport endpoint | 203.0.113.40 | VPN client configuration, never the game |
| Game host on the VPN | 10.60.0.20 | Server address field, with the port |
| Player peer | 10.60.0.30 | Assigned 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 未必承载这些广播,所以局域网列表里缺少条目,并不能说明显式私有地址是否可用。先把地址填进去,再下结论。如果连得上,这个发现上的缺口只是使用上的不便,而不是故障,可以照实记录,不必去追查。
同时也别动游戏正常的账号认证和准入策略。可用的私有路由给的是路径,不是成员资格;再怎么调整网卡优先级,也代替不了判断客户端究竟该用哪个目标地址。