ssh 到私有 IP

ssh 到私有 IP

我有一台 CentOS 计算机(计算机 A),配置为具有私有 ip 10.150.5.141(带有受限防火墙),可以使用真实 ip wxyz 访问互联网和我的 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

答案1

您正在寻找的称为反向隧道。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. 现在应该回到lappy上

    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隧道端口绑定到除 localhost 之外的任何端口。

启用网关端口

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 上的连接。

测试连接(双部分)

现在我们这次测试时改变了设置。主要区别是我们不再需要连接到本地主机!

  1. 登录到remotey

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

    [user@remotey ~]$ ssh -p 12345 remotey
    
  3. 现在应该回到lappy上

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

参考

答案2

由于计算机 B 无法访问计算机 A,因此您需要先从计算机 A 打开远程隧道。

ssh user@computerB -R vvv:localhost:22

答案3

没关系,我找到了答案:

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

相关内容