在一个可靠的主机上,在两个移动主机之间提供直接的 ssh 通道

在一个可靠的主机上,在两个移动主机之间提供直接的 ssh 通道

我有两个流动主持人,打电话给他们办公室。它们各自位于防火墙后面,因此无法访问,但它们确实具有可靠的外部连接。

在网络上,我有一个主机,叫它实习生,具有静态 IP 地址,因此可以访问。

我想连接到办公室, 使用实习生作为一个跳跃。简单的方法是办公室做类似的事情:

office$ ssh -R 2222:localhost:22 intern

...然后,从

home$ ssh intern
intern$ ssh -p 2222 localhost

这很好用,让我进入 shell办公室。但我想要的是跳过“第二个 shell”步骤,例如:

  • 办公室, 连接到实习生,并提供一条直接隧道回到端口办公室;这是我不清楚的部分;
  • 然后,从: ssh 到实习生备用端口直接转发至办公室无需任何中间连接。

我的第一个猜测是:

home$ ssh -p 2222 intern

...抛出“连接被拒绝”,所以这是错误的。我尝试了各种安排-R-D-W... 显然我正在努力。线索?

谢谢。

答案1

这是通过的第四个参数完成的-R。当省略时(如您的示例所示),它指定远程端口 2222 仅绑定到服务器的“localhost”地址,这就是为什么当您尝试连接到服务器其他地址的 :2222 时会收到“连接被拒绝”的信息。

要将侦听器绑定到所有地址,请指定一个*(只要:存在分隔符,空值也可以工作):

-R \*:2222:localhost:22

请注意,服务器可能会拒绝设置这样的监听器 - 您需要在服务器的配置(而不是客户端的配置)中启用该GatewayPorts选项以允许这样做:intern

GatewayPorts clientspecified

建立连接后,在服务器上运行netstat -ltn或验证结果——它将准确地显示你ss -ltn“当地的”新侦听器绑定到的地址(从服务器的角度来看)。(*您应该看到两个,一个绑定到 IPv4 的 0.0.0.0:2222,另一个绑定到 IPv6 的 [::]:2222,同样,默认的“localhost”行为也有两个。)

$ ss -ltn "sport = :2222"
State       Recv-Q      Send-Q     Local Address:Port     Peer Address:Port
LISTEN      0           128            127.0.0.1:2222          0.0.0.0:*
LISTEN      0           128                [::1]:2222             [::]:*

答案2

@user1686 在回答中提到了一种方法(使用-R \*:2222:localhost:22并添加GatewayPorts clientspecified到您的sshd配置中intern)。

如果由于某种原因您无权更改配置sshd,则intern可以ssh使用-J参数(jumphost)将这两个步骤结合起来,基本上如下所示:

home$ ssh -J intern -p 2222 localhost

为了更加方便,您可以~/.ssh/config像这样添加一个条目:

Host office
    ProxyJump intern
    Port 2222
    Hostname localhost

此后,您只需执行以下操作即可进行连接:

home$ ssh office

相关内容