利用 autossh 管理 SSH 连接
1 功能
本地服务器需通过 端口映射 方式向外网提供访问。使用 SSH 反向隧道 实现该功能,并希望在系统重启后、用户登录之前,也能自动建立连接。
2 原理
autossh 通过定期检测连接状态,发现异常后自动重启 SSH
隧道,从而保持稳定连接。
它可通过 -M 选项指定一个
监控端口,用于发送心跳包检测连通性;若监控端口通信中断,则认为连接已断开并重新建立。
若未设置 -M,则依赖 SSH
自身的心跳机制(ServerAliveInterval、ServerAliveCountMax
等)进行检测。
3 开机自动启动 autossh
3.1 创建 systemd 服务
1 | sudo vi /etc/systemd/system/autossh.service |
写入以下内容:
1 | [Unit] |
3.2 启动与启用服务
1 | sudo systemctl daemon-reload |
3.3 注意事项
ExecStart需使用阻塞式命令,否则服务会立即退出。- 如遇错误,可查看日志:
journalctl -u autossh.service。 - 若同时启用多个监控端口(如
55556),需错开端口号,因 autossh 会占用55556和55557。 - 使用 autossh 前,先用一次 ssh 登录,确保目标服务器加入
known_hosts。 - 建议同时在 client 与 server 端设置心跳参数,避免“连接僵死”问题。
- 确保服务器开放相应端口范围(如
38200–38300)。
4 调试方法
4.1.1 常用命令
手动测试 SSH 映射:
1 | ssh -N -R 38201:192.168.10.168:22 user_name@serv_ip |
手动启动 autossh:
1 | autossh -M 58888 -N -R 38201:192.168.10.168:22 user_name@serv_ip |
后台运行:
1 | autossh -M 58888 -NTf -R 38201:192.168.10.168:22 user_name@serv_ip |
带密钥文件示例:
1 | autossh -M 33445 -NTf -R 8222:192.168.10.168:22 user_name@serv_ip -i /exports/shell/amazon_new.pem |
服务端检查命令:
1 | netstat -na | grep 38201 |
客户端检查命令: 1
telnet serv_ip 38201
4.1.2 参数说明
-v/-vv/-vvv:输出不同级别的调试信息-M <port>:指定监控端口-N:仅做端口转发,不执行命令-R a:b:c:远程端口转发,将远端 a 端口映射到本地 b:c-T:禁用伪终端分配,在前台可以去掉以便看到更多信息-f:后台运行
5 总结
要实现 自动端口映射,需确保: 1. SSH 可免密连接(公私钥配置正确) 2. 普通 SSH 命令可正常建立反向隧道
需配置以下文件: -
/etc/systemd/system/autossh.service:系统启动时自动映射(单端口)
- $HOME/.ssh/config:设置密钥路径及主机别名 -
$HOME/.bashrc:可加入多个映射命令
调试建议: - 启动前关闭旧的 autossh 实例,避免监控端口冲突 - 使用
ssh -v 诊断问题 - 注意 config
中主机别名与命令行登录名可能不同 - 更换域名对应 IP 后需清理
known_hosts,否则 autossh 可能“假连通”
All articles in this blog are licensed under CC BY-NC-SA 4.0 unless stating additionally.
