2013-10-09 97 views
11

我想生成机器中的路由器后面的SSH服务器。如何绕过防火墙和NAT与反向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中打开。

更新2

你必须允许在/ etc/SSH /的 remove_public_ip_address服务器的sshd_config portforwarding

我试图让在sshd_config portforwarding添加此命令的文件:

LocalForward 10002 <my_remote_public_server_ip>:22 

但它给了我这个e RROR消息:

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是

重新启动SSH。

第2步:

[destination computer]$ ssh -R 4040:localhost:22 [email protected] 

这将通过端口4040

你的公共机器与目标计算机连接后会连接到中间的机器,并提示终端,则必须将此选项卡打开。

第3步:

ssh [email protected] -p4040 

或者从中间机器连接:

从家里连接

[home computer]$ ssh [email protected] 

[middle computer]$ ssh [email protected] -p4040 

Source

+0

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

+0

在“ssh -R ....”之后,您是否打开窗口?只要连接处于打开状态,隧道就会处于活动状态。它显示了任何错误消息,如“无法绑定到10002”?创建隧道后,您可以在公共服务器上使用ssh -p 10002 localhost吗? –

+0

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

回答

5

是否有一个SSH服务器运行在公众面前“ip _地址”?你要做的是“打开ssh连接到”ip_address“,然后将端口10002上的任何传入请求隧道到localhost:22”。

如果“ip-address”是dsl路由器的公共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 
+0

我不知道公共IP地址上运行着哪个SSH服务器。但我确实有另一台服务器运行带有公共IP的SSH服务器,并在另一个网络中完全控制它。但是我不知道如何在那里创建一个与路由器后面的计算机相连的隧道。这意味着我可以从路由器后面的计算机连接到另一台SSH服务器,但我不知道如何以其他方式进行操作。 – rfc1484

+0

好的。假设您的公用计算机具有IP地址public_ip。然后到路由器后面的机器上执行“ssh -R10002:localhost:22 public_ip”。如果这样做,你可以使用“ssh -p 10002 public_ip” –

+0

从任何地方连接到路由器后面的机器,如果它适合你,请接受答案或者描述你的问题在哪里。 –

5

正如你所说,我们有“目标计算机”(我们wanto连接到使用SSH),“中间机”(公共服务器工作作为代理),“其他计算机”(任何其它计算机上的网络)

正如@托马斯 - 奥斯特说,你必须使用

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

然而,为了使隧道绑定到0.0.0.0,而不是本地主机,你必须使用GatewayPorts的/ etc/SSH/“中间机器”(公共服务器)上的sshd_config:

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。

1

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

如上所述GatewayPorts yes是必要的,因此网络中的客户端也可以连接到SSH服务器上的远程转发端口。默认情况下,它被设置为no。因此,如果您没有root权限,则无法更改SSHD设置以将GatewayPorts选项设置为true。其中SSHD监听

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:但在这种情况下,你可以使用以下解决方法并将其重定向到您的客户的端口22

因此,如果有人想为你描述(客户端)到您的本地SSH连接端口22,他的作用:

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权限,则无法安装它)。