如何使 SSH 隧道可公开访问?

如何使 SSH 隧道可公开访问?

回顾问题,我正在通过 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服务器的选项GatewayPortsclientspecified,或者在极少数情况下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

相关内容