自动杀死破碎的反向SSH隧道

时间:2019-03-21 23:17:44

标签: ssh ssh-tunnel

我有1台位于NAT和防火墙后面的服务器,我还有另一台可以通过域访问的位置。 NAT和防火墙后面的服务器在云环境上运行,并且设计为可抛弃的,即,如果发生故障,我们可以使用单个脚本简单地重新部署它,在这种情况下,它是使用热量模板的OpenStack。当该服务器启动时,它运行以下命令来创建到NAT和防火墙之外的服务器的反向SSH隧道,以允许我们通过该服务器上的端口8080连接。我遇到的问题是,如果OpenSSH隧道损坏(服务器可能关闭),则该隧道仍然存在,这意味着当我们重新部署热模板以再次启动服务器时,它将无法再连接到该端口,除非我事先在NAT之外的服务器上杀死了ssh进程。

这是我当前用来启动反向隧道的命令:

sudo ssh -f -N -T -R 9090:localhost:80 user@example.com

1 个答案:

答案 0 :(得分:0)

我遇到了类似的问题,并通过以下方式解决了该问题:

首先,在服务器上,我在主目录中创建了一个名为.kill_tunel_ssh.sh的脚本,其内容如下:

#this finds the process that is opening the port 9090, finds its PID and kills it
sudo netstat -ltpun | grep 9090 | grep 127 | awk -F ' ' '{print $7}' | awk -F '/' '{print $1}' | xargs kill -9

然后,在客户端,我创建了一个名为connect_ssh.sh的脚本,内容如下:

#this opens a ssh connection, runs the script .kill_tunnel_ssh.sh and exit
ssh user@remote.com "./.kill_tunel_ssh.sh"

#this opens a ssh connection opening the reverse tunnel
ssh user@remote.com -R 9090:localhost:80

现在,我总是使用connect_ssh.sh打开SSH连接,而不是直接使用ssh命令。

在执行user命令时,它要求远程主机上的sudo进行netstat的配置而不要求输入密码。

也许(也许)有更好的方法来完成它,但这对我有用。