ssh -R 8080:localhost:80 -N root@example.com
目的是可以在远程计算机上打开本地端口
好像远程端仅绑定在
localhost
上所有接口的接口在打开远程计算机上的
localhost
上的端口时有效,但是当尝试从本地计算机访问远程计算机的公用IP时,该端口似乎未打开我如何将隧道在IP上公开供任何人访问?
#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
评论
公共IP是什么意思?如果您尝试通过路由器并通过Internet连接到本地计算机,则大多数路由器将不允许这种环回。