您正在寻找的被称为反向隧道。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
现在应该重新放牧了
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)
现在,我们这次进行测试时,请使用更改后的设置。主要区别在于我们不再需要连接到本地主机!
登录到 remotey
[user@lappy ~]$ ssh remotey
测试反向连接
[user@remotey ~]$ ssh -p 12345 remotey
现在应该重新放牧了
root@remotey's password:
Last login: Wed Aug 21 01:49:10 2013 from remotey
[user@lappy ~]$
参考文献