我有两个流动主持人,打电话给他们家和办公室。它们各自位于防火墙后面,因此无法访问,但它们确实具有可靠的外部连接。
在网络上,我有一个主机,叫它实习生,具有静态 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