【问题标题】:How to connect to the server behind NAT using mosh如何使用 mosh 连接到 NAT 后面的服务器
【发布时间】:2014-12-18 06:01:48
【问题描述】:

我想通过 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。

谢谢。

【问题讨论】:

    标签: udp nat mosh


    【解决方案1】:

    您遇到的问题在于端口重定向。您在路由器上的 NAT 转发正在将发送到 <domain>:9807 的传入流量发送到 <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 监听端口9807
    2. mosh 服务器退出,告诉通过 ssh 连接的客户端,要连接的 UDP 端口是9807
    3. mosh 客户端关闭 ssh 连接并尝试连接到端口 9807 的服务器
    4. NAT 路由器在端口9807 上看到此传入流量,并通过端口60000 将其发送到您的服务器
    5. 您的机器在端口60000 通过UDP 接收数据包,这符合iptables 规则并被重定向到它们的目的地(在这种情况下是服务器的IP),但在端口9807
    6. 您的 NAT 路由器未更改客户端流量的 SRC 端口,因此 mosh-server 将数据包发送回您的客户端,并在客户端正在侦听的端口上正确接收。

    【讨论】:

    • 这对我不起作用。如何撤消您提供的 iptables 命令?
    • -A 标志是附加一条规则,反之则是用-D 删除。试试iptables -t nat -D PREROUTING -p udp --dport 60000 -j REDIRECT --to-port 9807
    【解决方案2】:

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

    • client_host 在 NAT 后面,我们想从它连接到 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
      
      该脚本使用ssh SERVER_SSH_NAME <mosh-nat-server.sh ARGS> 调用server_host,记录密钥并使用它来运行mosh-client。棘手的部分是在服务器的 NAT 上打一个洞,让双方在udprelay 相遇。

    另见一个很好的blog post,描述了一个稍微不同的情况。在上面的术语中,它显示了如何从 relay_host 连接到 server_host。作者不使用 udp 中继,但他仍然需要笨重的 LD_PRELOAD 机器。令人惊讶的是,它确实起到了作用。

    【讨论】:

      猜你喜欢
      • 2016-09-09
      • 2011-07-01
      • 1970-01-01
      • 1970-01-01
      • 2021-03-17
      • 2013-04-27
      • 2012-02-20
      • 2012-07-24
      • 1970-01-01
      相关资源
      最近更新 更多