首页 文章

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

提问于
浏览
11

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

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

ssh -R 10002:localhost:22 <ip_address>

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

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

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

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

iptables中的端口都是开放的 .

UPDATE

正如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中打开了所有端口 .

UPDATE 2

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

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

LocalForward 10002 <my_remote_public_server_ip>:22

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

Bad configuration option: LocalForward

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

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

创建隧道后,可以在公共服务器上使用ssh -p 10002 localhost吗?

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

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

这也有效 .

UPDATE 3

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

我们将使用三台机器:

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

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

家用电脑:我们将在何处访问目的地电脑 .

这些是我遵循的步骤

Step 1:

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

添加GatewayPorts选项:

GatewayPorts是的

重启ssh .

Step 2:

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

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

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

Step 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 回答

  • 5

    在公共“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
    
  • 1

    正如你所说我们有“目的地机器”(我们想要使用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以获得解释:"by default SSH only listens for connections to the forwarded port on the loopback address"

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

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

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

  • 5

    我最近偶然发现了同样的问题,但没有在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 ,因此它可以从网络中看到,并将所有流量重定向到SSHD正在侦听的 127.0.0.1:4041 并将其重定向到客户端的端口 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权限,则无法安装它) .

相关问题