回顾这问题,我正在通过 OpenSSH 执行下面的操作(客户端:Mac OS X 10.6 | 服务器:Linux Mint)但是,正在隧道化的端口不公开工作:
ssh -R 8080:localhost:80 -N [email protected]
- 目的是在远程计算机上打开本地端口
- 似乎远程端仅绑定在 上
localhost
,而不是所有接口上 - 在远程计算机上打开端口时它可以工作
localhost
,但是当尝试从本地计算机访问远程计算机的公共 IP 时,端口似乎没有打开
我如何才能使隧道在 IP 上公开以供任何人访问?
答案1
如果你检查 ssh 的手册页,你会发现它的语法如下-R
:
-R [绑定地址:]港口:主持人:主机端口
什么时候bind_address
省略(如您的示例所示),则端口仅绑定在环回接口上。为了使其绑定到所有接口,请使用
ssh -R \*:8080:localhost:80 -N [email protected]
或者
ssh -R 0.0.0.0:8080:localhost:80 -N [email protected]
或者
ssh -R "[::]:8080:localhost:80" -N [email protected]
第一个版本单独绑定到所有接口。第二个版本创建通用的 IPv4 专用绑定,这意味着该端口可通过 IPv4 在所有接口上访问。第三个版本在技术上可能等同于第一个版本,但它同样只创建与 的单一绑定::
,这意味着该端口可通过 IPv6 本机访问,并通过 IPv4 通过IPv4 映射的 IPv6 地址(不适用于 Windows、OpenBSD)。(您需要使用引号,[::]
否则可能会被解释为 glob。)
注意如果你使用 OpenSSH服务器,则需要启用sshd
服务器的选项GatewayPorts
(clientspecified
,或者在极少数情况下yes
)才能使其工作(检查/etc/ssh/sshd_config
服务器上的文件)。否则(此选项的默认值为no
),服务器将始终强制端口仅绑定在环回接口上。
答案2
编辑:
-g
适用于本地转发端口,但您想要的是反向/远程转发端口,这是不同的。
你想要的是这。
本质上,在 上example.com
,设置GatewayPorts=clientspecified
在 中/etc/ssh/sshd_config
。
--- 上一个(错误)答案 ---
使用 -g 选项。来自 ssh 的手册页:
-g Allows remote hosts to connect to local forwarded ports.
答案3
以下是我的完整答案:
我最终使用ssh -R ...
它进行隧道传输,并将socat
其用于将网络流量重定向到127.0.0.1
:
隧道绑定到127.0.0.1:
ssh -R mitm:9999:<my.ip>:8084 me@mitm
socat:
mitm$ socat TCP-LISTEN:9090,fork TCP:127.0.0.1:9999
另一个选择是在此基础上建立一个仅限本地的隧道,但我发现很多慢点
mitm$ ssh -L<mitm.ip.address>:9090:localhost:9999 localhost
答案4
使用“网关端口”选项。
ssh -g -R REMOTE_PORT:HOST:PORT ...
为了使用它,您可能需要将“ GatewayPorts yes
”添加到您的服务器的/etc/ssh/sshd_config
。