我已经启动了 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 将无法执行任何操作,但我认为它应该尝试执行以下操作:
- 验证子 ssh 进程(
check on child ...
) - 验证远端!(通过隧道进行类似 ping 的操作)
- 意识到隧道已经塌陷
- 停止 ssh 进程
- 尝试再次创建隧道
- 意识到它不起作用,并设置一个(指数增加?)计时器以便尽快再次检查
这就是我运行 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 守护进程。但是,您可以在服务器上为ClientAliveInterval
in指定一个非零值(请参阅),然后重新启动服务器上的 sshd 服务以应用配置更改。然后,如果发生网络断开连接,ssh 守护进程将在几秒后被终止(但不是由 autossh 终止)。/etc/ssh/sshd_config
man sshd_config
ClientAliveInterval * 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。