systemd-socket-proxyd 的存活时间可能超过它的 SSH SOCKS 隧道
让套接字转发辅助单元的生存周期与 SSH 依赖保持一致,避免隧道已断而前端仍看似健康。
如果 SSH 退出后前端端口仍能接受连接,就检查全部三个单元。激活套接字、systemd-socket-proxyd 辅助单元以及 SSH 创建的 SOCKS 监听器各有不同的生存周期:
| 套接字 | 辅助单元 | SSH | 解读 |
|---|---|---|---|
| 监听中 | 未激活 | 未激活 | 可能正在正常等待需求 |
| 监听中 | 已激活 | 已激活 | 进程存在;但后续目标的健康状况仍未得到证明 |
| 监听中 | 已激活 | 未激活 | 前端可以在没有后端的情况下接受工作 |
把辅助单元与 SSH 一起启动并不能定义之后的停止转换。对于不得在没有隧道时保持激活的辅助单元,systemd 文档给出了更强的关系:
[Unit]
BindsTo=ssh-socks.service
After=ssh-socks.service在实际设计中把它应用到合适的单元。Requires= 与顺序只解决关系的一部分。否则,已经激活的前端在后端消失后可能再也不会触发激活。还要检查失败单元的状态和启动频率限制;依赖不会覆盖这些限制。
接下来建立启动就绪条件。After= 只对任务排序,并不代表 Type=simple SSH 监听器已就绪。固定睡眠在认证缓慢时可能失败。请使用能确立所需监听器的启动契约;ExitOnForwardFailure=yes 捕获的是转发设置失败,而不是之后的目标可达性。
最后,定义空闲退出与重新激活。转发守护进程的空闲退出选项针对的是没有活动连接,而不是已打开连接上没有字节。安静的会话可以让它保持活动。下一次需求应激活所需服务,重启循环应保持有界且可见。重建监听器会接纳新连接;它不会恢复旧的代理 TCP 会话。