自动杀死损坏的反向 ssh 隧道

Posted

技术标签:

【中文标题】自动杀死损坏的反向 ssh 隧道【英文标题】:Autokill broken reverse ssh tunnels 【发布时间】:2019-08-12 21:50:06 【问题描述】:

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

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

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

【问题讨论】:

【参考方案1】:

我有一个类似的问题,并以这种方式修复它:

首先,在服务器上,我在主目录中创建了一个名为 .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在执行netstat命令时配置sudo而不需要密码。

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

【讨论】:

以上是关于自动杀死损坏的反向 ssh 隧道的主要内容,如果未能解决你的问题,请参考以下文章

两步建立 ssh 反向隧道

反向 SSH 隧道监控

mysql ssh隧道(然后杀死PID)

使用 JSCH Java 反向 SSH 隧道 [关闭]

将 SSH 隧道反向到 AWS Batch 阵列作业

反向ssh隧道