您遇到的问题在于端口重定向。您在路由器上的 NAT 转发将传入流量发送到<domain>:9807
on <internal-ip>:60000
。当您使用该-p
选项启动 mosh 时,客户端通过 ssh 连接到服务器并告诉服务器启动,侦听指定的端口。然后 mosh-server 将打开的端口号(在本例中为您指定的端口号)传回给客户端,客户端关闭 ssh 连接并尝试连接到<domain>:<port>
. 客户端正在尝试与服务器正在侦听的同一端口进行通信。问题是您的 NAT 路由器正在将流量从 WAN 端的一个端口重定向到 NAT 机器上的另一个端口。这行不通。
最好的办法是进行直接转换,例如请求路由器将 WAN 侧的端口 9807 转发到端口 9807 上的 mosh-server 机器。
如果这不是一个选项,我能想到的下一个最好的事情是使用 iptables 破坏服务器机器上的流量。
iptables -t nat -A PREROUTING -p udp --dport 60000 -j REDIRECT --to-port 9807
按照您的描述执行您的客户
mosh -p 9807 user@my_server
会发生什么:
- 您机器上的 mosh 客户端打开到您的服务器的 ssh 连接(可能通过 NAT 路由器转发到您的机器),该服务器
mosh-server
在 port 上执行侦听9807
。
- mosh 服务器退出,告诉通过 ssh 连接的客户端要连接的 UDP 端口是
9807
- mosh 客户端关闭 ssh 连接并尝试在端口连接到服务器
9807
- NAT 路由器在端口上看到此传入流量
9807
并将其发送到您的服务器端口60000
60000
您的机器在端口over接收数据包UDP
,该端口与 iptables 规则匹配并被重定向到它们的目的地(在这种情况下是服务器的 IP),但在端口9807
- 您的 NAT 路由器不会更改客户端流量的 SRC 端口,因此 mosh-server 在客户端正在侦听的端口上将数据包发送回您的客户端,这些端口被正确接收。