链接断开时 autossh 不会终止 ssh

链接断开时 autossh 不会终止 ssh

我已经启动了 autossh,轮询时间为 30 秒:

AUTOSSH_POLL=30 AUTOSSH_LOGLEVEL=7 autossh -M 0 -f -S none -f -N -L localhost:34567:localhost:6543 user1@server1

并且它运行良好:

Sep  5 12:26:44 serverA autossh[20935]: check on child 23084
Sep  5 12:26:44 serverA autossh[20935]: set alarm for 30 secs

但是,如果我物理移除了网络电缆,这意味着隧道不再工作,autossh 不会终止 ssh 守护进程。为什么?我知道如果链接断开,autossh 将无法执行任何操作,但我认为它应该尝试执行以下操作:

  1. 验证子 ssh 进程(check on child ...
  2. 验证远端!(通过隧道进行类似 ping 的操作)
  3. 意识到隧道已经塌陷
  4. 停止 ssh 进程
  5. 尝试再次创建隧道
  6. 意识到它不起作用,并设置一个(指数增加?)计时器以便尽快再次检查

这就是我运行 autossh 的原因:如果隧道出现问题(无论是软件还是硬件问题),它应该尝试重新启动它。相反,它只是在等待 ssh 进程终止。它难道不应该尝试重新启动它吗,即使没有希望重新建立连接?

autossh 会进行哪种检查?只是验证 ssh 是否已启动并正在运行?它不进行任何类型的远端检查吗?

编辑

根据要求,我添加了 ssh 配置的相关部分:

# (see http://aaroncrane.co.uk/2008/04/ssh_faster)
# The ServerAliveInterval tells SSH to send a keepalive message every 60 seconds while the connection is open;
#   that both helps poor-quality NAT routers understand that the NAT table entry for your connection should
#   be kept alive, and helps SSH detect when there’s a network problem between the server and client.
ServerAliveInterval 60
# The ServerAliveCountMax says that after 60 consecutive unanswered keepalive messages, the connection should
#   be dropped. At that point, AutoSSH should try to invoke a fresh SSH client. You can tweak those
#   specific values if you want, but they seem to work well for me.
ServerAliveCountMax 60

TCPKeepAlive yes

答案1

但是如果我物理移除网线,意味着隧道不再工作,autossh 不会终止 ssh 守护进程。为什么?

autossh 运行在您的客户端计算机上,因此它无法直接终止服务器上的 ssh 守护进程。但是,您可以在服务器上为ClientAliveIntervalin指定一个非零值(请参阅),然后重新启动服务器上的 sshd 服务以应用配置更改。然后,如果发生网络断开连接,ssh 守护进程将在几秒后被终止(但不是由 autossh 终止)。/etc/ssh/sshd_configman sshd_configClientAliveInterval * ClientAliveCountMax

现在,如果你想问“为什么 autossh 不终止 ssh 客户端进程?”,您已指定-M 0,这将关闭监控。来自 autossh 手册页:

Setting the monitor port to 0 turns the monitoring function off, and autossh will only restart ssh upon ssh's exit

您没有使用 autossh 来监控连接,而是在超时几秒后等待 ssh 退出ServerAliveInterval * ServerAliveCountMax。您已请求在 ssh 退出前进行 60 次服务器活动检查,连续检查间隔 60 秒,因此您将等待一个小时后 ssh 客户端才会退出。

您还应该强烈考虑ExitOnForwardFailure在客户端使用该选项(参见man ssh_config),这样,如果 ssh 无法建立隧道,它就会退出,然后 autossh 可以尝试再次启动 ssh。

相关内容