Linux 后台运行 SSH 隧道断开后如何配置自动重连机制?

文章导读
对于需要长期稳定的后台 SSH 隧道,最推荐的做法是使用 autossh 工具配合 systemd 服务管理,这样能在网络波动或进程意外退出时自动拉起连接。
📋 目录
  1. 命令速用版
  2. 为什么会这样
  3. 分步处理
  4. 怎么验证是否生效
  5. 常见坑
  6. 参考来源
A A

对于需要长期稳定的后台 SSH 隧道,最推荐的做法是使用 autossh 工具配合 systemd 服务管理,这样能在网络波动或进程意外退出时自动拉起连接。

先说结论:单纯依靠 ssh 参数无法实现进程级重连,需引入守护进程管理。

  • 适合:需要 7x24 小时运行的端口转发或远程映射场景
  • 先准备:配置好 SSH 免密登录并确认目标端口未被占用
  • 验收:模拟断网后观察进程是否自动恢复且端口监听正常

命令速用版

autossh -M 0 -N -o "ServerAliveInterval 30" -o "ServerAliveCountMax 3" -L 本地端口:目标 IP:目标端口 用户@主机

参数说明:

  • -M 0:禁用监控端口,使用内部机制检测连接状态。
  • -N:不执行远程命令,仅建立隧道。
  • -L:本地端口转发,注意冒号为半角符号。
  • -o:传递 SSH 配置选项,保持心跳检测。

为什么会这样

SSH 客户端本身设计为交互式或单次任务,网络波动导致 TCP 连接中断时,ssh 进程通常会退出而不是重试。此外,中间网络设备(如防火墙、NAT 网关)可能会清理空闲连接,导致隧道假死。

分步处理

1. 安装 autossh:大多数发行版源中可直接安装,如 Ubuntu 下执行 apt install autossh

2. 配置免密登录:使用 ssh-keygen 生成密钥,并通过 ssh-copy-id 将公钥写入目标服务器。确保私钥权限为 600(chmod 600 ~/.ssh/id_rsa)。

3. 编写 systemd 配置文件:在 /etc/systemd/system/ 下创建 autossh-tunnel.service,参考以下完整配置:

[Unit]
Description=AutoSSH Tunnel Service
After=network.target

[Service]
User=root
Environment="AUTOSSH_GATETIME=0"
ExecStart=/usr/bin/autossh -M 0 -N -o "ServerAliveInterval 30" -o "ServerAliveCountMax 3" -i /root/.ssh/id_rsa -L 8080:127.0.0.1:80 user@host
Restart=always
RestartSec=10

[Install]
WantedBy=multi-user.target

配置注意:请根据实际情况修改 ExecStart 中的私钥路径 -i、端口映射 -L 及用户主机信息。

Linux 后台运行 SSH 隧道断开后如何配置自动重连机制?

4. 加载并启动服务:执行 systemctl daemon-reload 刷新配置,随后执行 systemctl enable `--now` autossh-tunnel.service

怎么验证是否生效

1. 检查服务状态:使用 systemctl status autossh-tunnel.service 查看状态应为 active (running)。

2. 查看运行日志:使用 journalctl -u autossh-tunnel.service -f 实时查看日志,确认无认证错误或连接拒绝信息。

3. 模拟断网测试:断开网络后等待片刻,再次检查状态,若显示重启计数增加且状态恢复,说明重连机制生效。同时可用 ss -tlnp 确认本地端口处于监听状态。

常见坑

1. 端口冲突:重启后若旧进程未完全退出,新进程可能因端口占用启动失败,需在 systemd 中配置 KillMode 或确保干净停止。

2. 密钥权限:私钥文件权限必须为 600,否则 SSH 会拒绝使用并导致连接失败。

3. 监控端口冲突:autossh 默认使用监控端口检测连接,若设为 0 则使用内部机制,避免与业务端口冲突。

参考来源

  • Linux 系统手册页:autossh(1), ssh_config(5)
  • systemd 文档:systemd.service(5)