我有一台 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 隧道的工作方式如下。
登录到
remotey
[user@lappy ~]$ ssh remotey
测试反向隧道端口
[user@remotey ~]$ ssh -p 12345 localhost
现在应该回到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 上的连接。
测试连接(双部分)
现在我们这次测试时改变了设置。主要区别是我们不再需要连接到本地主机!
登录到
remotey
[user@lappy ~]$ ssh remotey
测试反向连接
[user@remotey ~]$ ssh -p 12345 remotey
现在应该回到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