可靠的反向 SSH 隧道

可靠的反向 SSH 隧道

我正在autossh使用私钥打开反向 SSH 隧道。隧道用户的 shell 已rssh验证正常运行。

我遇到的问题是这样的,无论 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 进程仍在运行:

在此处输入图片描述

我也无法通过隧道登录机器:

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

我想知道如何才能让隧道更加可靠,以确保当任一端发生故障时隧道就完全瘫痪、被拆除并且不会进入“损坏”状态。

如果我通过端口 80 或类似端口建立隧道,我可以编写一个check脚本(此守护进程操作系统以 开始runit)来检查某个 HTML 页面是否可以通过隧道端到端访问,但是当它通过 SSH 并作为反向隧道时,我不知道客户端如何知道隧道是否真的在职的而不是仅仅跑步?

答案1

我认为你这里有两个问题。

首先是如何确保客户端断开连接后,服务器 sshd 进程终止,释放端口。如果客户端断开连接,那么我不知道为什么服务器进程会挂起,除非它们可能有子进程,但您的屏幕截图显示它们没有。如果客户端没有断开连接,只是停止响应,那么服务器进程应该在大约 ClientAliveInterval*ClientAliveCountMax 秒后终止。

第二是客户端如何确定隧道是否正常工作。这就是 autossh 的端口监控功能所做的。如果您将例如添加-M 20000到对 autossh 的调用中,它将设置端口转发以将流量发送到端口 20000 上的远程主机,并在端口 20001 上接收流量。它将尝试每 AUTOSSH_POLL 秒(默认 600 秒)在循环中发送流量,如果它检测到连接已停止工作,则终止它并启动新的 ssh 连接。

-M如果 ssh 尚未正确终止,则将开关添加到您的 autossh 调用中,并可能将 AUTOSSH_POLL 设置得更低(比如说 30),这可能会有所帮助。

相关内容