可靠的反向SSH隧道

Lee*_*ley 6 ssh ssh-tunnel

我正在使用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                              \
  tunnel@directory.mytunnelhost.com
Run Code Online (Sandbox Code Playgroud)

${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
Run Code Online (Sandbox Code Playgroud)

我想知道我能做些什么来使隧道更可靠,以确保当任一端发生故障时,它已经完全死机,被拆除并且不能进入“损坏”状态。

如果我通过端口 80 或类似端口建立隧道,我可以编写一个check脚本(这个守护进程runit以,我不知道客户如何知道隧道是否真的运行而不是在运行?

And*_*man 5

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

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

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

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

  • 如果 ClientAliveInterval 5、ClientAliveCountMax 1 - 主机上的隧道端口将按预期立即丢弃。至于 AUTOSSH_POLL,我还不需要尝试它。 (2认同)