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

Tre*_*lph 225 ssh openssh ssh-tunnel

回到这个问题,我正在通过 OpenSSH (Client: Mac OS X 10.6 | Server: Linux Mint) 执行以下操作,但是被隧道连接的端口没有公开工作:

ssh -R 8080:localhost:80 -N root@example.com
Run Code Online (Sandbox Code Playgroud)
  • 目的是可以在远程计算机上打开本地端口
  • 似乎远程端只绑定在localhost,而不是所有接口上
  • localhost在远程计算机上打开端口时它可以工作,但是当尝试从我的本地计算机访问远程计算机的公共 IP 时,该端口似乎没有打开

我如何在 IP 上公开隧道供任何人访问?

Ste*_*del 444

如果您查看 ssh 的手册页,您会发现其语法-R如下:

-R [ bind_address:]端口主机HOSTPORT

bind_address被省略(如在你的例子),端口绑定只回送接口上。为了使其绑定到所有接口,请使用

ssh -R \*:8080:localhost:80 -N root@example.com
Run Code Online (Sandbox Code Playgroud)

或者

ssh -R 0.0.0.0:8080:localhost:80 -N root@example.com
Run Code Online (Sandbox Code Playgroud)

或者

ssh -R "[::]:8080:localhost:80" -N root@example.com
Run Code Online (Sandbox Code Playgroud)

第一个版本单独绑定到所有接口。第二个版本创建了一个通用的 IPv4-only 绑定,这意味着端口可以通过 IPv4 在所有接口上访问。第三个版本在技术上可能与第一个版本相同,但它再次只创建一个绑定到::,这意味着端口可以通过本机 IPv6 访问,也可以通过 IPv4 通过IPv4 映射的 IPv6 地址访问(不适用于 Windows,OpenBSD) . (您需要引号,因为[::]否则可能会被解释为 glob。)

请注意,如果您使用 OpenSSHsshd服务器,则GatewayPorts需要启用服务器的选项clientspecified或在极少数情况下,启用yes)才能使其工作(检查/etc/ssh/sshd_config服务器上的文件)。否则(此选项的默认值为no),服务器将始终强制端口仅绑定在环回接口上。

  • GatewayPorts 是解决了我的问题。 (57认同)
  • 哦,天哪,它奏效了!!!!!我已经完成了 100 万次!!我只是忘记了 bash 中的 `*` 会给出文件,我需要 `\*` (15认同)
  • 是的,这正是我总是喜欢“0.0.0.0”的原因——它只是 IPv4,但它大部分时间都可以:) (4认同)
  • GatewayPorts = yes(在远程 sshd 配置上)也为我修复了它 (4认同)
  • “GatewayPorts yes”让我开心,谢谢@StefanSeidel (3认同)

sna*_*hoe 44

编辑:

-g 适用于本地转发端口,但您想要的是反向/远程转发端口,这是不同的。

你想要的是这个

本质上,在example.com,设置GatewayPorts=clientspecified/etc/ssh/sshd_config

--- 上一个(错误的)答案---

使用 -g 选项。从 ssh 的手册页:

-g     Allows remote hosts to connect to local forwarded ports.
Run Code Online (Sandbox Code Playgroud)

  • `GatewayPorts=clientspecified` 或 `GatewayPorts clientspecified` (3认同)
  • 尝试从单独的 tty 运行 `netstat -elnpt` 以确定哪些端口绑定到哪些地址。如果没有 `-g`,端口应该绑定到 `127.0.0.1:PORT`。使用`-g`,它应该绑定到`0.0.0.0:PORT`,这使得它可以远程访问。 (2认同)

Mig*_*ing 18

这是我的完成答案:

我最终ssh -R ...用于隧道,并socat在此基础上用于将网络流量重定向到127.0.0.1

隧道绑定到 127.0.0.1: ssh -R mitm:9999:<my.ip>:8084 me@mitm

社交: mitm$ socat TCP-LISTEN:9090,fork TCP:127.0.0.1:9999

其他选择是在此基础上做一个仅限本地的隧道,但我发现这慢得多

mitm$ ssh -L<mitm.ip.address>:9090:localhost:9999 localhost

  • +你去好先生。我试图告诉 ssh 绑定到 0.0.0.0 没有成功..然后看到了 \* 语法,试过了,没有骰子。我想这可能是 sshd 配置上的某种安全功能或不允许的东西。终于看到这篇文章了,`socat` 效果很好。超级有用,把它放在我的后口袋里;] (2认同)

小智 13

如果您不想或可以更改 /etc/ssh/sshd_config,您也可以使用双转发。

首先转发到远程机器上环回设备上的临时端口(例如 10080),然后使用本地转发将端口 10080 重定向到所有接口上的 80:

ssh -A -R 10080:localhost_or_machine_from:80 user@remote.tld "ssh -g -N -L 80:localhost:10080 localhost"
Run Code Online (Sandbox Code Playgroud)

  • 这实际上可以绕过转发规则! (4认同)

Raú*_*udo 8

使用“网关端口”选项。

ssh -g -R REMOTE_PORT:HOST:PORT ...

为了使用它,您可能需要GatewayPorts yes在服务器的/etc/ssh/sshd_config.