我最近设置了 VPN,用于和一些朋友玩 LAN 游戏。我正在运行一个 Linux 服务器pptpd
,并且能够使用操作系统内置的 VPN 客户端成功连接到 Windows。我已测试 VPN 是否正确路由客户端之间的信息(包括广播消息)。它在每个客户端上创建一个虚拟网络适配器,该适配器在系统上具有最高优先级。这意味着所有网络连接都默认使用它(例如 Web 浏览器),并且在执行名称查询时首先返回它(例如从套接字 API 返回的结果,如getaddrinfo()
和gethostbyname()
)。我遇到的问题是,我们要玩的特定游戏没有将其 UDP 套接字绑定到正确的网络接口。游戏进程反而明确绑定到原始网络连接的接口(Windows 等同于eth0
或wlan0
)。我希望它绑定到 VPN 适配器(Windows 等同于ppp0
)。
这款游戏由 EA Games 开发,名为 Battle For Middle-Earth。在 LAN 多人游戏大厅中,游戏将套接字绑定到 UDP 端口 8086。它使用此端口发送广播数据报,以提醒其他对等方它可用并接收来自其他对等方的警报。如果 8086 不可用,它将绑定到下一个连续端口。因此,它会将相同广播消息的副本发送到一系列端口(即 8086..8095)。一旦游戏开始,对等方就会开始向彼此发送定向数据报,而不是广播。就目前而言,没有任何游戏流量会进入 VPN。以下是一些netstat
输出,显示游戏绑定到10.0.1.0/24
网络(由家庭路由器分配),而不是网络192.168.0.0/24
(由 VPN 服务器分配):
UDP 10.0.1.18:137 *:*
UDP 10.0.1.18:138 *:*
UDP 10.0.1.18:1900 *:*
UDP 10.0.1.18:8086 *:* this is BFME
UDP 10.0.1.18:51955 *:*
UDP 127.0.0.1:1900 *:*
UDP 127.0.0.1:51956 *:*
UDP 192.168.0.100:137 *:*
UDP 192.168.0.100:138 *:*
UDP 192.168.0.100:1900 *:*
UDP 192.168.0.100:51954 *:*
显然,游戏会选择使用哪个接口,考虑到它需要用发现消息淹没用户的 LAN 来确定其他对等点的地址,这是有道理的。但 VPN 不是应该通过互联网连接提供 LAN 吗?为什么游戏选择旧接口而不是优先级更高的 VPN 接口?我想一定有一些模糊的设置可以让 Windows 将 VPN 网络配置为 LAN;但是我很难找到它。
任何正确的帮助都将不胜感激!
事后想想:我知道游戏正在使用 NetBIOS 功能(我转储了它的函数导入列表)。我还知道(从历史上看),如果任何同侪不是同一工作组的成员将被忽略。我面临的问题是否与网络的 NetBIOS 配置有关?
答案1
我能够使用特定于相关游戏的配置选项来解决这个问题(我偶然发现了这一点,而且运气不错)。这使我能够直接指定游戏应使用哪个界面。这可以通过向文件Options.ini
(位于%USERPROFILE%\AppData\Roaming\My Battle For Middle-Earth Files\
)添加以下条目来完成:
IPAddress = x.x.x.x
其中,x.x.x.x
您希望游戏进程使用的接口的 IPv4 地址的点分十进制表示形式。
我从来没有弄清楚为什么游戏会忽略优先级更高的虚拟接口,所以我得出结论,这一定是游戏工程中的设计缺陷,而不是可以在 Windows 中配置的东西。
还值得注意的是,我转而使用 OpenVPN,因为pptpd
它提供了更好的链路层支持(即我可以桥接服务器的虚拟适配器以更好地处理广播帧)。
答案2
这在某些机器上也可能有帮助。它是否能工作似乎完全是随机的,但安装服务仍然比每次切换网络时编辑配置文件更容易;)
BFME 处理网络的方式确实出了问题,不幸的是,开发人员已不复存在,而且它也不是开源的,所以我们永远不会知道……