SSH到私有IP


18

我有一台配置了CentOS的计算机(计算机A)具有私有IP 10.150.5.141(具有受限制的防火墙),可以使用真正的IP wxyz访问Internet和我的ArchLinux VPS(计算机B)

如何制作另一台可以访问计算机B的计算机(计算机C)连接到计算机A,但是计算机C无法直接连接到计算机A(因为它在计算机A的专用网络上)?

我知道隧道可以将本地端口打开到另一台计算机:端口,但是相反该怎么做?

我想ssh通过计算机B访问计算机A,但是计算机B无法访问计算机A,因为计算机A上的网络是限制性的(可以访问,但不能进入,因为我无法访问其路由器)

我想要这样的东西:

ssh -connect-to w.x.y.z:22 -open-port vvv -forward-to 10.150.5.141 -port 22

这样当我ssh w.x.y.z:vvv从计算机C中转发到专用网络时10.150.5.141:22

Answers:


14

您正在寻找的被称为反向隧道。ssh通过-R开关提供它:

-R [bind_address:]port:host:hostport
       Specifies that the given port on the remote (server) host is to 
       be forwarded to the given host and port on the local side.  This 
       works by allocating a socket to listen to port on the remote side, 
       and whenever a connection is made to this port, the connection is
       forwarded over the secure channel, and a connection is made to host 
       port hostport from the local machine.

正如OP通过其答案发现的那样,语法如下:

$ ssh -f -N -R vvv:localhost:22 w.x.y.z

我的网络上有2台计算机,lappy并且remotey。因此,我在上运行以下命令lappy

$ ssh -f -N -R 12345:localhost:22 remotey

我可以确认它正在工作:

$ ps -eaf|grep "[l]ocalhost:22"
saml     27685     1  0 11:10 ?        00:00:00 ssh -f -N -R 12345:localhost:22 remotey

现在,如果我ssh单独转到远程系统,remotey然后运行此命令,我可以看到它现在正在接受远程系统本地接口上的端口12345上的连接:

$ netstat -an|grep :12345
tcp        0      0 127.0.0.1:12345             0.0.0.0:*                   LISTEN      
tcp        0      0 ::1:12345                   :::*                        LISTEN      

测试连接

您可以看到反向ssh隧道的工作方式如下。

  1. 登录到 remotey

    [user@lappy ~]$ ssh remotey
    
  2. 测试反向隧道端口

    [user@remotey ~]$ ssh -p 12345 localhost
    
  3. 现在应该重新放牧了

    user@localhost's password: 
    Last login: Thu Aug  1 17:53:54 2013
    /usr/bin/xauth:  creating new authority file /home/user/.Xauthority
    [user@lappy ~]$ 
    

除localhost(lo)以外的接口上的端口?

如果您尝试这样的命令,但它似乎不起作用,或者它始终绑定到localhost(lo)接口上的端口,则可能会让您挠头。

例如:

lappy$ ssh -f -N -R remotey:12345:lappy:22 remotey

注意:此命令说打开端口12345 @ remotey并将所有连接通过隧道连接到端口22 @ lappy。

然后在远程:

remotey$ netstat -an|grep 12345
tcp        0      0 127.0.0.1:12345              0.0.0.0:*                   LISTEN   

发生的是sshd的配置不允许您执行此操作。实际上,如果未启用此功能(GatewayPorts),您将无法将任何ssh隧道端口绑定到除本地主机以外的任何端口。

启用网关端口

remotey$ grep GatewayPorts /etc/ssh/sshd_config
#GatewayPorts no

要启用它,请编辑此文件/etc/ssh/sshd_config

GatewayPorts clientspecified

并重新启动sshd

remotey$ sudo service sshd restart

现在再试一次,我们应该看到效果:

lappy$ ssh -f -N -R remotey:12345:lappy:22 remotey

并再次在远程检查它:

remotey$ netstat -anp | grep 12345
tcp        0      0 192.168.1.3:12345           0.0.0.0:*                   LISTEN      9333/sshd

注意:在上面,我们可以看到该sshd进程现在正在监听IP地址为192.168.1.3的接口上的端口12345连接。

测试连接(部分deux)

现在,我们这次进行测试时,请使用更改后的设置。主要区别在于我们不再需要连接到本地主机!

  1. 登录到 remotey

    [user@lappy ~]$ ssh remotey
    
  2. 测试反向连接

    [user@remotey ~]$ ssh -p 12345 remotey
    
  3. 现在应该重新放牧了

    root@remotey's password: 
    Last login: Wed Aug 21 01:49:10 2013 from remotey
    [user@lappy ~]$ 
    

参考文献


有没有办法在同一台计算机上使隧道从0.0.0.0:12346到127.0.0.1:12345?
Kokizzu

1
@Kokizzu-我尝试进行设置,但是我被包围在有关您要的内容的轴上。我发现这听起来像您想要的,anattatechnologies.com/q/2012/08/chaining-ssh-tunnels。我会在今晚晚些时候尝试解决该问题,请随时使用它,并让我知道您是否有所改进。
slm

这不是我的意思,我想它绑定到WXYZ:vvv2而不是127.0.0.1(在计算机B),所以其他人可以..也用它
Kokizzu

1
@Kokizzu-查看更新。
slm


1

没关系,我找到了答案:

ssh -f -N -R vvv:localhost:22 w.x.y.z

从计算机A

编辑:TL; DR,正确的解决方案:

ssh -f -N -R w.x.y.z:vvv:localhost:22 w.x.y.z
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.