ssh -R 仅在远程绑定到 127.0.0.1

ssh -R 仅在远程绑定到 127.0.0.1

我正在运行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

相关内容