Autokill 损坏的反向 ssh 隧道
Autokill broken reverse ssh tunnels
我有 1 台服务器位于 NAT 和防火墙后面,我有另一台服务器位于另一个位置,可通过域访问。 NAT 和防火墙后面的服务器在云环境中 运行 并且被设计成一次性的,即如果它坏了我们可以简单地用一个脚本重新部署它,在这种情况下,它是使用 heat 模板的 OpenStack。当该服务器启动时,它会运行以下命令来创建到 NAT 和防火墙之外的服务器的反向 SSH 隧道,以允许我们通过该服务器上的端口 8080 进行连接。我遇到的问题是,如果 OpenSSH 隧道被破坏(服务器可能关闭)隧道仍然存在,这意味着当我们重新部署热模板以再次启动服务器时,它将不再能够连接到该端口,除非我事先在NAT外的服务器上杀了ssh进程
这是我目前用来启动反向隧道的命令:
sudo ssh -f -N -T -R 9090:localhost:80 user@example.com
我遇到了类似的问题,并以这种方式解决了它:
首先,我在服务器的主目录中创建了一个名为 .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 }' | awk -F '/' '{print }' | 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
而无需输入密码。
也许(可能)有更好的方法来完成它,但这对我有用。
我有 1 台服务器位于 NAT 和防火墙后面,我有另一台服务器位于另一个位置,可通过域访问。 NAT 和防火墙后面的服务器在云环境中 运行 并且被设计成一次性的,即如果它坏了我们可以简单地用一个脚本重新部署它,在这种情况下,它是使用 heat 模板的 OpenStack。当该服务器启动时,它会运行以下命令来创建到 NAT 和防火墙之外的服务器的反向 SSH 隧道,以允许我们通过该服务器上的端口 8080 进行连接。我遇到的问题是,如果 OpenSSH 隧道被破坏(服务器可能关闭)隧道仍然存在,这意味着当我们重新部署热模板以再次启动服务器时,它将不再能够连接到该端口,除非我事先在NAT外的服务器上杀了ssh进程
这是我目前用来启动反向隧道的命令:
sudo ssh -f -N -T -R 9090:localhost:80 user@example.com
我遇到了类似的问题,并以这种方式解决了它:
首先,我在服务器的主目录中创建了一个名为 .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 }' | awk -F '/' '{print }' | 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
而无需输入密码。
也许(可能)有更好的方法来完成它,但这对我有用。