回到这个问题,我正在通过OpenSSH(客户端:Mac OS X 10.6 |服务器:Linux Mint)执行以下操作,但是正在建立隧道的端口无法公开运行:
 ssh -R 8080:localhost:80 -N root@example.com
 


目的是可以在远程计算机上打开本地端口
好像远程端仅绑定在localhost上所有接口的接口
在打开远程计算机上的localhost上的端口时有效,但是当尝试从本地计算机访问远程计算机的公用IP时,该端口似乎未打开

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

评论

公共IP是什么意思?如果您尝试通过路由器并通过Internet连接到本地计算机,则大多数路由器将不允许这种环回。

#1 楼

如果检查ssh的手册页,您会发现-R的语法为:为了使其绑定到所有接口,请使用
-R [bind_address:]port:host:hostport
ssh -R \*:8080:localhost:80 -N root@example.com
ssh -R 0.0.0.0:8080:localhost:80 -N root@example.com

第一个版本分别绑定到所有接口。第二个版本创建了仅IPv4的常规绑定,这意味着可通过IPv4在所有接口上访问该端口。从技术上讲,第三个版本可能与第一个版本相同,但是再次,它仅创建到bind_address的单个绑定,这意味着该端口可以通过IPv6本机访问,也可以通过IPv4映射的IPv6地址通过IPv4访问(在Windows,OpenBSD上不起作用) )。 (需要引号,因为::否则可能会被解释为glob。)
请注意,如果您使用OpenSSH [::]服务器,则需要启用服务器的sshd选项(GatewayPorts,或者在极少数情况下,请选择clientspecified)以用于这可以正常工作(检查服务器上的文件yes)。否则(此选项的默认值为/etc/ssh/sshd_config),服务器将始终强制端口仅在回送接口上进行绑定。

评论


哦,我的天啊!!!我已经做了一百万次!!我只是忘了*在bash中会提供文件,而我需要\ *

–特雷弗·鲁道夫
13年5月6日在7:08



是的,这就是为什么我总是更喜欢0.0.0.0的原因-它仅是IPv4,但是在大多数情况下都会起作用:

– Stefan Seidel
13年5月6日在7:51

GatewayPorts是解决了我的问题。

– Sunry
16-10-25在8:18

GatewayPorts =是(在远程sshd配置上)也为我修复了它

– Phil_1984_
16 Dec 5'在13:29

感谢@StefanSeidel,这是“ GatewayPorts是”的一天

– karser
17-10-27在10:40



#2 楼

编辑:

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

您想要的是这个。 >
基本上,在example.com上,在GatewayPorts=clientspecified中设置/etc/ssh/sshd_config

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

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

-g     Allows remote hosts to connect to local forwarded ports.


评论


似乎没有工作...它启动了,但我无法远程连接

–特雷弗·鲁道夫
13年4月28日在6:21



尝试从单独的tty中运行netstat -elnpt以确定哪些端口绑定到了哪个地址。如果没有-g,则端口应绑定到127.0.0.1:PORT。使用-g时,应将其绑定到0.0.0.0:PORT,这样可以远程访问它。

–花式鞋
2013年4月28日14:58



pastebin.com/q6f4kJyd

–特雷弗·鲁道夫
13年4月28日在16:11



GatewayPorts =客户端指定或GatewayPorts客户端指定

–特雷弗·鲁道夫
13年4月29日在0:01

并将其添加到客户端或远程吗?

–特雷弗·鲁道夫
13年4月29日在0:04

#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

评论


我喜欢这样的事实,我不必处理sshd配置,并且无需sudo就可以完成所有操作。另外,我了解到socat存在。谢谢!

– BrutusCat
2014年6月12日14:00

+ up,你好先生。我试图告诉ssh绑定到0.0.0.0,但没有成功..然后看到*语法,尝试了一下,没有骰子。我想这可能是sshd config上的某种安全功能或不允许的功能。终于看到了这篇文章,socat的工作很棒。超级有用,可以把它放在我的后兜里;]

– Jaime
19年6月24日在23:45

#4 楼

如果您不愿意,也可以使用双转发,也可以更改/ etc / ssh / sshd_config。转发到此处以将所有接口上的端口10080重定向到80:

ssh -A -R 10080:localhost_or_machine_from:80 user@remote.tld "ssh -g -N -L 80:localhost:10080 localhost"


评论


这实际上可以绕过转发规则!

–迈克尔·舒伯特(Michael Schubert)
16 Dec 3'在18:49

喜欢这个解决方案。当您不想更改计算机上的配置时,这是一个很好的解决方法

–格雷佐
17年8月18日在14:54



#5 楼

使用“网关端口”选项。

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

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

评论


实际上,这可行。我要做的是将EC2实例用作REST服务器的转发器。这样,我不需要将服务器固定在DMZ中,也不需要公共IP。有趣的是,在我创建的第一个EC2实例中,ssh -R remote_port:localhost:port xxx @ ec2xxx正常工作,但是由于某种原因,我后来不得不创建另一个实例,从那时起,我一直在:拒绝了用tcpdump查看我得到了什么,并且没有太多信息。 -g加上GatewayPorts可以解决问题。

– E.T
17年1月24日,19:12



#6 楼

跳转主机是OpenSSH的新增功能。这需要SSH访问中间件,但无需额外配置即可工作。

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


此命令指示SSH首先连接到root@example.com,然后从该计算机连接到在localhost用户名下在remoteuser(即从跳转主机到远程主机的隧道连接端口)上启动到端口8080的连接。

#7 楼

我没有足够的声誉在适当的位置进行评论,所以我添加了一个新答案。配置(GatewayPorts等)。如果客户端假设她将转发范围限制为f.e.本地主机因此,通常需要将yes设置为sshd

#8 楼

如果您想将配置放入您的~/.ssh/config中而不是使用命令行参数,则可以尝试类似

Host REMOTE_HOST_NAME RemoteForward \*:8080 127.0.0.1:80

记住要让远程主机的防火墙允许连接到8080,并确保将GatewayPorts配置的/etc/ssh/sshd选项未设置为no