7

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

那么,无论如何在客户端和/或服务器端通过命令行参数或conf文件指定服务器端口?

注意:以下无效!!

mosh -p 9807 user@my_server

编辑:

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

Error binding to IP my_server_ip: bind: Address already in use

那说:

  1. 端口转发正在工作。
  2. mosh 尝试在端口 60000 上安装 mosh-server。

谢谢。

4

2 回答 2

7

您遇到的问题在于端口重定向。您在路由器上的 NAT 转发将传入流量发送到<domain>:9807on <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

会发生什么:

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

让我建议以下在 NAT 后面连接到 mosh 服务器的概念验证方法。假设我们有以下计算机:

  • NAT后面的client_host,我们想从它连接到mosh服务器
  • server_host在另一个 NAT 后面,mosh 服务器正在运行。请注意,在此方法中,client_host 仍然需要对 server_host 的直接 SSH 访问才能启动 mosh-server。ssh -R ... relay_host在服务器上可能会有所帮助。
  • relay_host具有公开可见的 IP 地址并由我们控制。

所以我们这样做:

  1. relay_host 上安装并运行udprelay工具。它将从一个端口接收到的所有内容重复到另一个端口,反之亦然。
    relay_host> udprelay 0.0.0.0 34730 34731
    
    上面提到的端口号被硬编码到客户端脚本中,但它们可以很容易地更改。另请注意,udprelay 目前非常不安全。
  2. server_host 上安装mosh-nat-server.sh,只需将其放入 PATH 中提到的任何文件夹即可。确保socat那里也安装了流行的工具。
  3. 最后,在客户端上运行mosh-nat-client.sh如下
    client_host> mosh-nat-client.sh SERVER_SSH_NAME RELAY_IP
    
    该脚本使用 调用server_hostssh SERVER_SSH_NAME <mosh-nat-server.sh ARGS>记录密钥并使用它来运行 mosh-client。它的棘手部分是在服务器的 NAT 上打一个洞,让双方在udprelay.

另请参阅描述略有不同的情况的一篇不错的博客文章。在上面的术语中,它显示了如何从relay_host连接到server_host。作者不使用 udp 中继,但他仍然需要笨重LD_PRELOAD的机器。令人惊讶的是,它完成了它的工作。

于 2019-09-15T21:05:48.813 回答