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

时间:2013-10-09 10:23:32

标签: ssh firewall nat ssh-tunnel

我正在尝试在路由器后面的机器中生成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

  

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

我尝试在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

我们将使用三台机器:

目标计算机:我们要连接到。

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

家庭计算机:我们将访问目标计算机的位置。

这是我遵循的步骤

第1步:

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

添加GatewayPorts选项:

GatewayPorts yes

重新启动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

Source

3 个答案:

答案 0 :(得分:5)

是否在公共“ip_address”上运行了ssh-server?您要做的是“打开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

答案 1 :(得分:5)

正如你所说我们有“目的地机器”(我们想要使用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。

答案 2 :(得分: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是一个很棒的网络实用程序,它绑定接口4040上的TCP端口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权限,则无法安装它。)