可靠的反向SSH隧道

我使用autossh来使用私钥打开反向SSH隧道。 隧道用户的shell是rssh并validation为工作。

我遇到的问题是这样的,无论ClientAliveInterval( 15 )和ClientAliveCountMax( 3 )( sshd默认值),在客户端隧道打开:

 exec autossh -N \ -o "ServerAliveInterval 60" \ -o "ServerAliveCountMax 3" \ -o "StrictHostKeyChecking no" \ -R ${tunnel_port}:localhost:22 \ -i ./tunnel \ -v \ [email protected] 

${tunnel_port}来自一个小的curl调用,它在隧道主机上寻找一个空闲的端口,端口不会改变(它是根据请求框的mac地址来分配的)

问题是,当TERM进入隧道客户端时,端口在主机上保持占用,并且sshd进程继续运行:

在这里输入图像说明

我也无法通过隧道login到机器上:

 ubuntu@ip-10-252-138-233:~$ ssh -p 39777 pi@localhost ssh: connect to host localhost port 39777: Connection refused 

我想知道我能做些什么来使隧道更可靠,以确保何时哪一端完全死亡,拆除,不能进入“破碎”状态。

如果我是通过端口80或类似的隧道,我可以写一个check脚本(这个守护进程os启动runit )来检查一些HTML页面是端对端通过他的隧道可用,但是当它通过SSH,作为一个反向隧道,我不知道客户如何知道隧道是否真的运行而不是运行?

我想你在这里有两个问题。

首先是如何确保服务器sshd进程终止,释放端口,一旦客户端断开连接。 如果客户端断开连接,我不知道为什么服务器进程会停滞,除非他们有subprocess,但是你的截图显示他们没有。 如果客户端没有断开连接但只是停止响应,那么服务器进程应该在几秒后终止ClientAliveInterval * ClientAliveCountMax。

其次是客户端如何确定隧道是否工作。 这是autossh的端口监视function。 如果将-M 20000添加到autossh的调用中,它将设置端口转发,以在端口20000上向远程主机发送stream量,并在端口20001上接收该stream量。它将尝试在每个AUTOSSH_POLL秒周围发送stream量(默认值为600),并且如果它检测到连接已经停止工作,则终止它并启动一个新的ssh连接。

-M开关添加到autossh调用中,并且可能将AUTOSSH_POLL调低30,可能会有所帮助,前提是ssh没有正确终止。