如何使用Mosh连接到NAT背后的服务器

Als*_*san 5 udp nat mosh

我想通过mosh连接到位于NAT后面的服务器。我无法触摸路由器将其设置为upnp支持,但是我已经申请了UDP端口转发9807-> 60000,以及ssh端口转发原因。

因此,是否有通过客户端和/或服务器端的命令行args或conf文件指定服务器端口的方法?

注意:以下不起作用!!

mosh -p 9807 user@my_server
Run Code Online (Sandbox Code Playgroud)

编辑:

我尝试先SSH到服务器,然后手动运行mosh-server -p 60000,然后从另一个终端运行mosh -p 9807 my_server。这会导致错误:

Error binding to IP my_server_ip: bind: Address already in use
Run Code Online (Sandbox Code Playgroud)

说:

  1. 前进端口正在工作。
  2. Mosh尝试在端口60000上安装mosh服务器。

谢谢。

Mea*_*ode 5

您遇到的问题在于端口重定向。您在路由器上的 NAT 转发正在将传入流量发送<domain>:9807到<internal-ip>:60000。当您使用该-p选项启动 mosh 时,客户端通过 ssh 连接到服务器并告诉服务器启动,监听指定的端口。然后 mosh-server 将打开的端口号(在本例中为您指定的端口号)传送回客户端,客户端关闭 ssh 连接并尝试连接到<domain>:<port>. 客户端正在尝试与服务器正在侦听的同一端口通信。问题是您的 NAT 路由器正在将流量从 WAN 端的一个端口重定向到 NAT 机器上的另一个端口。这是行不通的。

最好的办法是获得直接转换,例如请求路由器将 WAN 端的端口 9807 转发到端口 9807 的 mosh 服务器机器。

如果这不是一个选项,我能想到的下一个最好的方法是使用 iptables 来破坏服务器机器上的流量。

iptables -t nat -A PREROUTING -p udp --dport 60000 -j REDIRECT --to-port 9807
Run Code Online (Sandbox Code Playgroud)

按照您的描述执行您的客户

mosh -p 9807 user@my_server
Run Code Online (Sandbox Code Playgroud)

发生的事情是:

  1. 您机器上的 mosh 客户端打开到您的服务器的 ssh 连接(大概是通过 NAT 路由器转发到您的机器),该连接mosh-server在端口上执行侦听9807。
  2. mosh 服务器退出,告诉通过 ssh 连接的客户端要连接的 UDP 端口是 9807
  3. mosh客户端关闭ssh连接并尝试在端口连接服务器 9807
  4. NAT 路由器在端口上看到此传入流量9807并将其发送到端口上的服务器60000
  5. 你的机器在 port 60000over接收数据包UDP,它匹配 iptables 规则并被重定向到它们的目的地(在这种情况下是服务器的 IP),但在端口9807
  6. 您的 NAT 路由器不会改变客户端流量的 SRC 端口,因此 mosh-server 在客户端正在侦听的端口上将数据包发送回您的客户端,这些数据包被正确接收。