如何配置到连接计算机的反向SSH连接?


20

我将在不久的将来部署许多将在路由器后面的机器。在每个路由器上设置动态DNS并进行端口转发是不可行的,所以有没有办法配置这些计算机以启动与计算机的TCP连接,然后让计算机通过与外部计算机的SSH连接进行初始化这种联系?

IE浏览器:

COMPUTER A OPENS TCP CONNECTION TO COMPUTER B
COMPUTER B OPENS SSH CONNECTION OVER THE EXISTING TCP CONNECTION TO COMPUTER A
COMPUTER B NOW HAS SSH CONNECTION TO COMPUTER A

这可能吗?如果可以,我该怎么做?


2
相关文章(它如何
吉尔斯(Gilles)'所以

Answers:


21

/etc/ssh/sshd计算机B组:

AllowTcpForwarding yes
TCPKeepAlive yes

计算机A

$ ssh -R 2222:localhost:22 ip.of.computer.b

计算机B

$ ssh localhost -p 2222

注意2222是我选择的任意高端口号。然后,计算机B上的该端口将通过计算机A上初始化的SSH连接回传到端口22。如果您有多台计算机,则应为每台计算机使用不同的端口。

对于您的用例,您可能需要从脚本运行此脚本,以便可以使其成为守护程序,并在断开链接后定期尝试重新连接。您可能想要一个仅/bin/true计算机B上具有外壳程序的特殊帐户来处理传入的连接。然后,您可以为每台允许“回拨”的机器设置一个键或多个键。

计算机A上,您可能会发现-n-N-T选项对将其与本地输入断开连接(以便它可以在后台运行),不尝试运行任何远程命令,仅打开隧道而不创建tty很有用。

生成守护程序的大多数常规方法在建立这样的网络隧道时效果不佳。网络连接中的问题会使其尝试破墙而入。一个简单的循环等待睡眠即可解决问题。十分钟是一个不错的数字,因为如果出现问题(例如计算机B处于脱机状态),它不会淹没网络并尝试临时记录文件,但是如果断开连接,它仍然可以使您很快恢复正常。

#/bin/sh
while true; do
    sleep $((60*10))
    ssh -nNT -R 2222:localhost:22 ip.of.computer.b
done

这样的脚本可以在启动时运行/etc/rc.local。在计算机A启动后大约十分钟,您的第一次登录计算机的更改将开始。


1
真好 因此,我基本上会让每个远程计算机将本地SSH端口隧道传输到本地计算机上的端口吗?使每台机器仅按需建立连接隧道可能是明智的。我可能希望每台计算机打开一个保持活动状态的HTTP连接,并在我希望它尝试进行反向连接时推送XML数据,从而使管理更加容易(并且不会阻塞我的所有端口;])。谢谢!
Naftuli Kay 2011年

@TKKocheran:有很多端口可供选择……特别是您将拥有更多信息亭。与保持http连接打开相比,如何保持SSH隧道打开更糟?
卡莱布

我想您是对的,我可以这样做,但是然后我必须将端口映射到计算机,并记住哪个是哪个,而另一条路由将被延迟实例化,即仅在被询问时创建SSH隧道。
纳夫图利凯

1
@TKKocheran:您将必须以任何一种方式进行映射,否则即使您的惰性实例化也会遇到他们试图互相破坏的情况。
迦勒

1
我不知道它是否普遍适用,但是我的sshd配置现已启用/etc/ssh/sshd_config
gc5 2014年
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.