我正在运行ssh -N -f -R127.0.2.3:23000:127.1.2.3:23000 user@remote
,并且我预计远程隧道已在 打开127.0.2.3:23000
,但它只在 打开127.0.0.1:23000
,这很不方便,因为我需要在远程打开几个隧道,但监听同一个 tcp 端口。
在本地机器中,隧道指向正确的 IP 地址 (127.1.2.3:23000)。
我曾尝试在远程创建多个环回设备,但无济于事。
Linux 和 Freebsd 服务器也是如此(openbsd-ssh)
那么,为什么 ssh -R 没有绑定到 127.0.0.1 以外的远程环回 IP?
谢谢。
(抱歉删减得不好:)
答案1
虽然当地的可选绑定地址由 SSH 客户端控制(使用-L
/LocalForward
或改为-g
/GatewayPorts
在里面客户的配置),偏僻的客户端使用-R
/指定的可选绑定地址RemoteForward
由 SSH 控制服务器站在服务器配置GatewayPorts
。默认情况下为no
。应将其设置为,clientspecified
以允许客户端选择要绑定到哪个地址:
GatewayPorts
指定是否允许远程主机连接到客户端转发的端口。默认情况下,sshd(8) 将远程端口转发绑定到环回地址。这可防止其他远程主机连接到转发端口。GatewayPorts
可用于指定 sshd 应允许远程端口转发绑定到非环回地址,从而允许其他主机连接。该参数可能是no
强制远程端口转发仅对本地主机可用,yes
强制远程端口转发绑定到通配符地址,或clientspecified
允许客户端选择地址转发所绑定的。默认值为no
。
此外,客户的RemoteForward
条目同样告诉我们:
[...]
如果未指定 bind_address,则默认仅绑定到环回地址。如果 bind_address 为 '*' 或空字符串,则请求转发以侦听所有接口。 指定远程 bind_address 仅在服务器的GatewayPorts
选项已启用(请参阅 sshd_config(5))。
因此,您必须能够在服务器上更改 ssh 的服务器配置(通常具有 root 访问权限),并在文件中添加(或编辑)此条目sshd_config
,以便显示:
GatewayPorts clientspecified
如果不能,您可以使用服务器端的其他可用工具(如果存在或本地可安装)来克服这个(相当弱的)安全限制。例如socat
或者ssh
通过使用LocalForward
从服务器到自身的加密(即使这无用地增加了一层加密)。
答案2
事实证明,你无需改变就可以实现GatewayPorts
它远程服务器. 诀窍是在远程服务器上创建另一个 ssh 连接来转发
- 在客户端,与您的代码相同
ssh -N -f -R127.0.2.3:23000:127.1.2.3:23000 user@remote
- 在远程端,除了现有的监听端口外
23000
,还要从远程创建一个新的连接
# Should be on your remote node
ssh -g -L 23001:localhost:23000 user@remote_ip
Remote
-------- |-------------------------------------------------
|client|-------->| Port 23000 ---- // (127.0.0.1:23000 LISTEN)
-------- | |
| Port 23001 <--- // (0.0.0.0:23001 LISTEN)
|--------------------------------------------------
参考:Kudo 致@FaST4:https://askubuntu.com/a/789275/523440