问题 如何通过反向SSH隧道绕过防火墙和NAT


我正在尝试在路由器后面的机器中生成SSH服务器。

首先,我尝试将SSH绑定到我的公共IP地址:

ssh -R 10002:localhost:22 <ip_address>

然后我提示密码请求,但我的用户名密码似乎不起作用。

显然我知道我的用户名密码,所以在我看来它正在尝试在同一网络下的另一台计算机上进行身份验证。

有任何建议如何解决这个问题?

当您无法访问路由器时,它还可以帮助我了解如何在路由器后面创建SSH服务器。

iptables中的端口都是开放的。

UPDATE

如建议的那样 托马斯奥斯特 回答我尝试了以下内容。

在路由器后面的机器中,我执行了以下命令:

$ ssh -R10002:localhost:22 <remote_public_ip_address> -l <my_remote_server_username>

<remote_ip_address> 作为具有公共IP和SSH服务器的服务器的remote_ip_address,我可以完全控制它。

<my_remote_server_username> 是远程服务器用户名。

之后,我尝试从远程服务器连接到路由器后面的服务器,如下所示:

$ ssh -p 10002 <remote_public_ip_address>

但是,此命令显示以下输出:

ssh: connect to host <remote_public_ip_address> port 10002: Connection refused

所以我使用以下命令在iptables防火墙中打开了10002端口:

sudo iptables -A INPUT -p tcp --dport 10002 -j ACCEPT

之后,我再次执行了命令,但它显示相同的错误消息。

在路由器后面的我的机器中,我在iptables中打开了所有端口。

更新2

你必须在/ etc / ssh / sshd_config中允许端口转发   remove_public_ip_address服务器

我试图在sshd_config文件中允许portforwarding添加此命令:

LocalForward 10002 <my_remote_public_server_ip>:22

但它给了我这个错误信息:

Bad configuration option: LocalForward

在“ssh -R ....”之后你是否打开了窗户?

执行该命令后,它连接到远程公共机器,是的,我打开了窗口。

你可以在公共服务器上使用ssh -p 10002 localhost吗?   隧道是否已创建?

是的,如果我在公共服务器中执行该命令,它会在询问我的凭据后连接。

请在路由器后面的机器上尝试“ssh localhost”,检查sshd是否正在运行。

这也有效。

更新3

我终于能够使它工作了(再次感谢 托马斯奥斯特

我们将使用三台机器:

目的地机器:我们要连接到的。

中间机器:充当连接中介的服务器(在我的情况下是Linode)

家用电脑:我们将在哪里访问目的地电脑。

这些是我遵循的步骤

步骤1:

[destination computer]$ vi /etc/ssh/sshd_config

添加GatewayPorts选项:

GatewayPorts是的

重启ssh。

第2步:

[destination computer]$ ssh -R 4040:localhost:22 middle-machine-user@middle-machine-public-ip

这将通过端口4040将您的公共计算机与目标计算机相关联

它将连接到中间机器并提示终端,您必须打开此选项卡。

第3步:

从家里连接:

ssh destination-user@destination-ip -p4040

或者从中间机器连接:

[home computer]$ ssh middle-machine-user@middle-machine-ip

[middle computer]$ ssh destination-user@localhost -p4040

资源


968
2017-10-09 10:23


起源

您必须在remove_public_ip_address服务器的/ etc / ssh / sshd_config中允许端口转发 - Thomas Oster
在“ssh -R ....”之后你是否打开了窗户?只要连接打开,隧道就会处于活动状态。它是否显示任何错误消息,如“无法绑定到10002”?创建隧道后,可以在公共服务器上使用ssh -p 10002 localhost吗? - Thomas Oster
请在路由器后面的机器上尝试“ssh localhost”,检查sshd是否正在运行。 - Thomas Oster
如果你不是HTTP或HTTPS,你也可以尝试 burrow.io,免费帐户允许您打开1个HTTP反向隧道,而您所要做的就是在正在侦听端口4040的计算机上运行curl命令。您可以在网站上设置隧道。它太酷了。 - Paulo Arruda
我想在第3步你的意思 ssh destination-user@middle-ip -p4040 - Slipp D. Thompson


答案:


在公共“ip_address”上运行ssh服务器吗?你要做的是“打开ssh连接到”ip_address“然后将端口10002上的任何传入请求隧道传送到localhost:22”。

如果“ip-address”是dsl-router的公共IP地址,则必须在路由器的配置中为主机创建端口转发:22。

如果您无法访问路由器,唯一可能的情况是,您可以访问另一台在互联网上运行ssh的服务器,您可以从中进行隧道访问。

# open a session to the public available machine and create a tunnel from port 10002 back  to your local sshd (22)
ssh -R 10002:localhost:22 ip_of_public_server
# as long as this session is open, all calls to the public available machine on port 10002 will be tunneled to your local machine (make sure sshd is running on port 22)
ssh -p 10002 ip_of_public_server

5
2017-10-09 10:28



我不知道哪个SSH服务器在公共IP地址上运行。但我确实有另一台服务器运行带有公共IP的SSH服务器,并在另一个网络中完全控制它。但是我不确切知道如何在那里创建一个与路由器后面的这台计算机相连的隧道。这意味着我可以从路由器后面的计算机连接到另一台SSH服务器,但我不知道如何以相反的方式进行操作。 - rfc1484
好。假设您的公共计算机具有IP-Adrress public_ip。然后转到路由器后面的机器并执行“ssh -R10002:localhost:22 public_ip”。如果这样可行,您可以使用“ssh -p 10002 public_ip”从任何地方连接到路由器后面的机器 - Thomas Oster
请接受答案,如果它适合您,或描述您的问题所在。 - Thomas Oster
我已根据您的建议更新了帖子。谢谢! - rfc1484


如你所说我们有“目的地机器”(我们想要使用ssh连接),“中间机器”(公共服务器作为货运代理),“其他计算机”(网上任何其他计算机)

正如@ thomas-oster所说,你必须使用

[destination computer] $ ssh -R 2222:localhost:22 ip_of_public_server

但是,为了使隧道绑定到0.0.0.0而不是localhost,您必须在“中间计算机”(公共服务器)上的/ etc / ssh / sshd_config中使用GatewayPorts:

GatewayPorts yes

当然,添加此选项后必须重新启动sshd。

http://www.snailbook.com/faq/gatewayports.auto.html 作出解释: “默认情况下,SSH仅侦听到环回地址上转发端口的连接”

这将允许您使用中间计算机(公共服务器)的IP从网络上的任何计算机连接到目标计算机:

[any computer on the net] $ ssh -p 2222 ip_of_public_server

确保公共服务器上的防火墙允许连接到端口2222 / tcp。


5
2017-11-30 04:23





我最近偶然发现了同样的问题,但没有在SSH服务器上拥有root权限。

如上所述 GatewayPorts yes 因此,网络中的客户端也可以连接到SSH服务器上的远程转发端口。默认情况下,它设置为 no。因此,如果您没有root权限,则无法更改要设置的SSHD设置 GatewayPorts 选项 true。但在这种情况下,您可以使用以下解决方法:

ssh -R 4041:localhost:22 myserver.com 'socat TCP-LISTEN:4040,fork TCP:127.0.0.1:4041'

socat 是一个伟大的网络实用程序,它绑定TCP端口 4040 在界面上 0.0.0.0 所以从网络上可以看到它并将所有流量重定向到 127.0.0.1:4041 SSHD正在侦听并将其重定向到客户端的端口 22

因此,如果有人想要如您所描述的那样(在客户端上)在端口22上连接本地SSH,他会:

ssh -p 4040 myserver.com 

它的工作原理如下:

SSH client --> myserver.com:4040 (socat) --> 127.0.0.1:4041 (myserver.com, SSHD) --> SSH client port 22

socat 可以从源构建,也可以已安装在系统上。它存在于RHEL / CentOS的RPMForge存储库中(但是如果您没有root权限,则无法安装它)。


1
2018-01-15 17:00