如何使用反向SSH隧道绕过防火墙和NAT

11

我试图在路由器后面的一台机器上生成SSH服务器。

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

ssh -R 10002:localhost:22 <ip_address>

然后我被要求输入密码,但我的用户名和密码似乎不起作用。

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

有什么建议如何解决这个问题吗?

如果您没有访问路由器,则任何关于如何在路由器后面创建SSH服务器的替代方法都会对我有所帮助。

iptables中的端口都是开放的。

更新

根据Thomas Oster的建议,我尝试了以下操作。

在路由器后面的计算机上执行了以下命令:

$ 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

您需要在remove_public_ip_address服务器的/etc/ssh/sshd_config文件中允许端口转发

我尝试在sshd_config文件中添加此命令以允许端口转发:

LocalForward 10002 <my_remote_public_server_ip>:22

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

Bad configuration option: LocalForward

在执行完"ssh -R...."命令后,你有没有保持窗口打开?

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

在创建隧道后,你能否在公共服务器上使用ssh -p 10002 localhost?

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

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

这也可以正常工作。

更新3

最后我终于能够使它工作了(再次感谢Thomas Oster

我们将使用三台机器:

目标机器:我们想要连接的机器。

中间机器:用于连接的中介服务器(在我的情况下为Linode)。

家庭电脑:我们将访问目标机器的地方。

以下是我遵循的步骤

第1步:

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

添加GatewayPorts选项:

GatewayPorts yes

重新启动ssh。

第二步:

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

这将通过4040端口将您的公共机器与目标计算机连接。

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

第三步:

从家里进行连接:

ssh destination-user@destination-ip -p4040

或者从中间机器连接:

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

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

来源


你必须在远程公共IP地址服务器的/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
我认为在第三步中,你意思是 ssh destination-user@middle-ip -p4040 - Slipp D. Thompson
3个回答

6

如你所说,我们有“目标主机”(我们想要使用ssh连接的主机),“中间主机”(作为转发器的公共服务器),“其他计算机”(网络上的任何其他计算机)

正如@thomas-oster所说,您需要使用

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

然而,为了使隧道绑定到0.0.0.0而不是本地主机,您需要在“中间机器”(公共服务器)的/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

公网“ip_address”上是否有运行ssh服务器?你正在尝试的是“打开到‘ip_address’的ssh连接,然后将端口10002的任何传入请求隧道传输到localhost:22”。

如果“ip_address”是您的dsl路由器的公共IP地址,则必须在路由器的配置中创建一个端口转发到您的主机:22。

如果您无法访问路由器,则唯一可能的事情是如果您可以访问在Internet上运行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

我不知道公共 IP 地址上运行的是哪个 SSH 服务器。但是我在另一个网络中有另一个运行着 SSH 服务器且具有公共 IP 和完全控制权的服务器。但我并不确切知道如何在那里创建一个与路由器后面的计算机链接的隧道。也就是说,我可以从路由器后面的计算机连接到另一个 SSH 服务器,但我不知道如何反过来做。 - rfc1484
好的。假设您的公共计算机具有IP地址public_ip。然后转到路由器后面的计算机,并执行“ssh -R10002:localhost:22 public_ip”。如果这样可以,您就可以使用“ssh -p 10002 public_ip”从任何地方连接到路由器后面的计算机。 - Thomas Oster
如果答案可行,请接受答案,否则请说明您的问题。 - Thomas Oster
我已经更新了帖子,添加了你的建议的答案。谢谢! - rfc1484

1

我最近遇到了同样的问题,但在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是一个很棒的网络工具,它在接口0.0.0.0上绑定TCP端口4040,因此可以从网络中看到,并将所有流量重定向到127.0.0.1:4041,其中SSHD正在侦听并将其重定向到客户端的端口22

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

ssh -p 4040 myserver.com 

它的工作原理如下:

SSH客户端 --> myserver.com:4040 (socat) --> 127.0.0.1:4041 (myserver.com, SSHD) --> SSH客户端端口22

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接