摘要/背景
我正在尝试为 1999 年的旧 TBS 设置在线多人游戏。如果主机和其他 PC 在同一个 LAN 上,多人游戏就可以正常工作,但我正在尝试通过互联网建立连接,以便我可以和我爸爸一起玩。
多个非常古老的论坛帖子都同意游戏使用端口2300-2400, 47624
进行通信。以下是来自其中之一:
...请您的防火墙管理员配置防火墙以使用以下设置:允许端口 47624 上的初始出站 TCP 连接允许后续入站和出站 TCP 和 UDP 端口 2300-2400 的连接。为 DirectPlay(客户端)设置适当的权限。
我尝试在路由器上设置这些端口(2300-2400, 47624
)以转发到主机 PC,但不起作用。两台 PC 在游戏中无法看到对方。我知道我正确配置了路由器,因为我已将端口 22 转发到同一台 PC 以进行 SSH,并且可从任何外部网络位置进行操作。
我的想法
然后我想,既然它在 LAN 上工作,如果有办法让我让外部 PC 认为它与主机 PC 位于同一网络上,那么它应该可以工作。这就是让我想到使用带隧道的 SSH 的原因。
我的想法是:如果我可以通过 SSH 连接到与主机 PC 位于同一 LAN 内的计算机(主机本身或其他第三台计算机),并在初始连接期间转发所有正确的端口,游戏应该认为主机 PC 和远程 PC 位于同一 LAN 上,游戏应该像在 LAN 上一样运行。这个假设有效吗?
到目前为止我尝试过的方法
- 我在 Windows 10 PC 上设置了 SSHD(桌面) 使用OpenSSH。
- 我主持了一场 SMAC 游戏桌面. 第二台 PC (笔记本电脑) 可以在与桌面。
- 我断开连接笔记本电脑从 LAN 并连接到我邻居的 WiFi,这样我就可以从 LAN 外部尝试(他允许我使用它进行测试)。
- 我 SSH 到桌面从笔记本电脑在邻居网络上。使用命令
ssh Desktop_Username@myHomeIpAddress
SSH 连接成功了,但无论我在 SSH 命令中输入多少个 -L 和 -R 选项,似乎都无法让计算机在 SMAC 中互相看到对方。到目前为止,我最大的尝试是ssh Desktop_Username@myHomeIpAddress -L 2300:localhost:2300 -R 2300:localhost:2300 -L 2350:localhost:2350 -R 2350:localhost:2350 -L 47624:localhost:47624
(基于我对上述引用的解释)。我谨慎使用2300和2350是因为我发现了一篇帖子,上面写着:
发现主持者和加入者都需要转发端口 2300-2400 TCP/UDP(如果无法转发范围,请尝试 2300 TCP 和 2350 UDP),并且主持人需要转发端口 47624 TCP。这与所有 directplay 游戏相同。
我的问题
- 有没有办法让 SSH 隧道传输所有端口流量,从而模拟 PC 在同一网络上?几乎就像是进入我家庭网络的 VPN(也许我应该设置其中一个独立于 SSH 的 VPN?)。我认为这可以立即解决我的问题,但不确定是否可行。
- 如果不是,我对第一个区块引用的解释是否正确?我设置了2300和2350作为 -L 和 -R,因为它表示“入站和出站 TCP 和 UDP“
- 是否可以通过 SSH 发送 UDP 流量?我读到过 SSH 就是 TCP,我真的不明白它们有什么不同。如果 TCP 更好而且无损,为什么不能使用 UDP 代替它?
额外的怪异
当我将计算机通过 SMAC 中的 LAN 连接起来时,如步骤 2 所示。到目前为止我尝试过的方法然后使用端口跟踪软件当前端口双方桌面和笔记本电脑看看它们是如何连接的,它们似乎没有在每个人都说应该在的端口上进行通信。它们确实使用端口2300和2350但他们似乎也使用端口2301, 港口5000以及范围内的端口10000-70000定期。我还没有看到港口47624曾经使用过。
下面是当 PC 通过 LAN 连接时 CurrPorts 上的活动端口的屏幕截图(terran.exe 是 SMAC):
鉴于这些行的本地和远程端口不匹配,这让我担心我需要使用 -L 和 -R 选项转发 SSH 命令中所有可能的端口组合,这显然是不可行的。
最后说明
我在网上看到过关于使用 Hamachi 或 GameRanger 进行在线游戏的指南。我看到这些论坛上的许多人都说它不起作用,所以请不要让我参考这些帖子。我想找到一种无需额外软件即可模拟 LAN 游戏的解决方案。如果我能找到一个解决方案,只需要我爸爸将我发送给他的几行复制并粘贴到他的 CMD 或 WSL shell 中,那就最好了。过去,我没能让他正确安装软件。
提前感谢您的帮助!
答案1
有没有办法让 SSH 隧道传输所有端口流量,从而模拟 PC 在同一网络上?几乎就像是进入我家庭网络的 VPN(也许我应该设置其中一个独立于 SSH 的 VPN?)。我认为这可以立即解决我的问题,但不确定是否可行。
不,你真的应该使用 VPN。
原因之一是实际的 VPN 软件在 IP 层(有时甚至在以太网层)工作 - 一个实际的网络在参与主机之间创建,每个主机在 VPN 内都有一个 IP 地址,并且能够简单地将任何 IP 数据包发送到任何其他主机。
根据所使用的 VPN 软件,它甚至可能支持向整个“LAN”进行广播,这通常用于自动发现,但如果游戏允许您手动输入“游戏主机”的 IP 地址,则不需要这样做。
如果不是,我是否正确理解了第一个引文?我将 2300 和 2350 设置为 -L 和 -R,因为它表示“入站和出站 TCP 和 UDP”
我认为您的解释是正确的,但是您使用 SSH 隧道的方式不正确。
首先,SSH 只能隧道传输 TCP 流,而不能传输 UDP。与 VPN 不同,SSH 隧道传输发生在 TCP 层稍上方;它一点也不就像路由器中的“端口转发”。它的具体工作原理仅有的使用直接 TCP 连接,而这些连接实际上并不是端到端的。
也就是说,你不能告诉游戏直接连接到服务器,而是必须告诉它连接到“本地主机”您的 SSH 客户端接收连接、通过 SSH 通道传递数据,然后 SSH 服务器与目标建立全新的连接。
记住最后一段,如果你使用一个,你的-L
和-R
用法就可以了或者另一个,但当两者以这种方式组合时,你实际上是在进行一个无限循环 - -L 监听客户端:2300 并连接到服务器:2300,而 -R 监听服务器:2300 并连接到客户端:2300……结果是你的 SSH 客户端和服务器最终建立了隧道到彼此的隧道无限地,而无需触及游戏。
即使无限循环不是问题,也存在一个问题,那就是你的游戏和您的 SSH 客户端(由于-L
)试图在同一个系统上监听同一个端口(即它们都试图占用 localhost:2300),服务器端也会发生同样的情况。
是否可以通过 SSH 发送 UDP 流量?我读到过 SSH 就是 TCP,但我真的不明白它们有什么不同。
SSH 本身是基于 TCP 的,这一事实对可以通过隧道传输的内容没有太大影响超过许多 VPN 通过基于 TCP 的隧道传输整个 IP 数据包(包括 UDP)(尽管不一定能获得良好的结果)。
但是,SSH 中的“流隧道”功能仅适用于 TCP 连接。
如果 TCP 更好并且无损,为什么不能使用 UDP?
有时,“无损”确实是原因。(这在音频/视频流中更成问题,因为“实时”更为重要,但也可能影响游戏性。)
(笔记:接下来的两段主要是我重复我之前在互联网上读到的内容,因为我自己实际上并没有使用过 VoIP 软件——尽管我认为 MS Remote Desktop 很接近,因为最近的版本它本质上是一个通过 UDP 运行的视频流。)
在视频通话等情况下,如果物理连接丢失几秒钟,大多数人都会希望视频流恢复到原来的状态现在应该显示的内容——就像模拟流中断一样。信号变弱,一些携带视频帧的数据包丢失,完全可以忘记它们——等到连接修复时,它们反正已经过时了。
当相同的数据通过 TCP 发送时,它会专注于尝试重新传输那些丢失的数据包先于其他任何事情即使数据包可以再次通过,你也要等待 TCP 到达重传计时器,然后等待所有的老的视频帧必须经过(可能看起来就像视频正在快进),然后才能恢复正常数据。
所以就是可能的通过 TCP 隧道传输 UDP,但通常并不理想。当程序使用 UDP 时,它们通常会实现他们自己的可靠性和流量控制功能与 TCP 类似,但针对特定需求而构建。
我想找到一种无需额外软件就能模拟局域网游戏的解决方案
最简单的解决方案其实是 VPN。是的,它是“额外的软件”。但是,它可以将任何类型的数据包直接从一个玩家传输到另一个玩家,而无需任何额外的工作(这实际上是一份工作的 VPN);通常不需要在客户端进行任何额外的配置,例如“端口转发”(无论是 VPN 内部还是外部);并且大多数人都大致熟悉商业 VPN,并且可能更喜欢安装 OpenVPN 而不是运行神秘的控制台命令。
(此外,我不知道 GameRanger,但 Hamachi 实际上只是一个 VPN 程序!或者至少,上次我尝试时它是一个 VPN 程序。它以前的工作原理是将所有用户连接到一个大型 VPN 网络,这样每个玩家都有一个 VPN 颁发的 5.xxx IP 地址用于连接到其他玩家。)