将两个 SSH 连接中继在一起

eri*_*nla 2 ssh ssh-tunnel

我有三台机器:

  1. 我有物理访问权限 localhost
  2. 我想通过 ssh 进入host1. 但是,它位于运营商级 NAT 之后,因此我无法从 ssh 直接连接到它localhost
  3. relayhost设置为帮助我连接localhosthost1

我想SSH从每个localhosthost1relayhost,然后有relayhost中继从我的ssh连接localhosthost1

这样的回答表明,我可以创建一个通道relayhost使用ssh -L,如果我知道的URI或IP地址host1。但是,由于运营商级 NAT,我不知道。所以我可以想象一个像这样中继它的过程:

  1. host1ssh user@relayhost
  2. relayhost 正在监视这个连接,当它看到它说“我要创建一个从我的端口 9999 到这个连接的隧道”
  3. localhostssh 9999:relayhost

这是解决这个问题的正确方法吗?如何进行第 2 步?

Mar*_*ost 5

您不需要任何专门的触发器relayhost。您需要做的就是使用远程端口转发ssh -R而不是本地端口转发ssh -L

现在,如果我理解正确的话——你的问题是既没有localhosthost1没有公开访问的 IP——两者都在 NAT 之后。否则它会更容易从创建隧道host1localhostssh -R,然后运行该隧道内的第二个SSH连接。

如果我们必须使用继电器,可以按照以下步骤完成。为了清楚起见,让我们将您的localhost机器重命名为myhost现在。

  1. 运行这个host1

    ssh -R 12345:localhost:22 user@relayhost
    
    Run Code Online (Sandbox Code Playgroud)

    这将打开的端口12345relayhost,当任何人连接它,数据将被转发到SSH端口22host1

  2. 现在,您可以连接到端口12345relayhostmyhost

    ssh user@relayhost -p 12345
    
    Run Code Online (Sandbox Code Playgroud)

    如果您有限制性防火墙relayhost禁止外部访问端口12345,您可以使用本地端口转发在本地打开端口myhost

    ssh -N -L 56789:localhost:12345 user@relayhost
    
    Run Code Online (Sandbox Code Playgroud)

    然后连接到host1from myhost

    ssh user@localhost -p 56789
    
    Run Code Online (Sandbox Code Playgroud)

但是,不要期望在远程端口转发上构建任何永久网络解决方案(请参阅:https : //serverfault.com/q/595323以了解未来可能出现的问题)。您应该考虑在服务器上使用 VPNrelayhost进行长期设置。