2013-04-27 22:14:51 +0000 2013-04-27 22:14:51 +0000
189
189

如何使ssh隧道对外开放?

好吧,回到 这个 的问题,我在 Mac 上运行命令

ssh -R 8080:localhost:80 -N root@example.com

。然而,被隧道的端口却没有公开工作。我运行这样的命令是为了使本地端口能够在远程计算机上打开。而且在远程计算机上打开localhost上的端口时,确实可以工作,但当我试图从本地计算机访问远程计算机的公共IP地址时,端口似乎并没有打开。我如何将隧道的IP公开,让任何人都可以访问?

EDIT:好像远程端只在localhost上绑定,而不是所有接口都绑定。

EDIT 2:客户端是Mac OS X 10.6,服务器是Linux Mint,但它们都是OpenSSH。

答案 (7)

368
368
368
2013-05-06 06:11:42 +0000

如果你查看了ssh的man页面,你会发现-R的语法是这样的。

-R [_bind\_address_:]_port_:_host_:_hostport_

当省略了`bindaddress`_时(就像你的例子一样),端口只绑定在回环接口上。为了使它绑定到所有的接口,可以使用

ssh -R \*:8080:localhost:80 -N root@example.com

ssh -R 0.0.0.0:8080:localhost:80 -N root@example.com

ssh -R "[::]:8080:localhost:80" -N root@example.com

第一个版本会单独绑定到所有的接口。第二个版本创建了一个通用的IPv4-only bind,这意味着该端口可以通过IPv4在所有接口上访问。第三个版本可能在技术上等同于第一个版本,但它同样只创建了一个单一的绑定到::,这意味着端口可以通过IPv6本机访问,也可以通过 IPv4映射的IPv6地址(在Windows、OpenBSD上不起作用)。

注意,如果你使用OpenSSH [::]服务器,服务器的sshd选项需要被启用(设置为GatewayPortsyes)才能工作(检查服务器上的文件clientspecified)。否则(该选项的默认值为/etc/ssh/sshd_config),服务器将始终强制只在环回接口上绑定端口。

40
40
40
2013-04-28 03:34:48 +0000

编辑:

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

你想要的是【这个】(https://serverfault.com/questions/379344/selecting-interface-for-ssh-port-forwarding)。

基本上,在example.com上,设置GatewayPorts=clientspecified中的/etc/ssh/sshd_config。 从ssh的man页面。

-g Allows remote hosts to connect to local forwarded ports.
15
15
15
2013-10-29 12:09:40 +0000

这是我的答案,供完成。

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

tunnel binded to 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

10
10
10
2016-08-01 22:37:07 +0000

如果你不会或能够改变/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"
```。
8
8
8
2013-04-28 13:58:50 +0000

使用 “网关端口 "选项。

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

为了使用,你可能需要在你的服务器的GatewayPorts yes中添加 ”/etc/ssh/sshd_config“。

2
2
2
2019-06-03 20:09:02 +0000

跳转主机是最近才加入OpenSSH的。这需要SSH访问中间层,但不需要额外的配置就可以工作。

ssh -J root@example.com remoteuser@localhost -p 8080

这条命令指示SSH首先连接到root@example.com,然后,从该机器以localhost的用户名发起对remoteuser的8080端口(即从跳转主机到远程主机的隧道端口)的连接。

0
0
0
2018-08-26 15:50:49 +0000

如果你想把配置放在你的~/.ssh/config中,而不是使用命令行参数,你可以尝试像

Host REMOTE_HOST_NAME RemoteForward \*:8080 127.0.0.1:80

记得让你的远程主机的防火墙允许连接到8080,并确保你的GatewayPorts配置中的/etc/ssh/sshd选项没有设置为no