最稳妥的方案是使用 autossh 配合 systemd 管理,适合需要长期稳定的端口转发场景;如果是临时调试,screen 或 tmux 更灵活。
先说结论:单纯依赖 ssh 命令后台参数不够稳定,生产环境建议用进程守护工具。
- 适合:需要长期保持的本地端口转发或远程映射
- 先准备:配置 SSH 密钥免密登录并测试连通性
- 验收:关闭终端后检查进程存活及端口监听状态
环境准备与安装
1. 安装 autossh(推荐)
Debian/Ubuntu 系统:
sudo apt-get update sudo apt-get install autossh
CentOS/RHEL 系统:
sudo yum install autossh
2. 生成并配置密钥
ssh-keygen -t ed25519 ssh-copy-id 用户@主机
3. 修正私钥权限(关键步骤)
权限过高会导致 SSH 拒绝使用密钥,必须执行:
chmod 600 ~/.ssh/id_ed25519
4. 前台测试连通性
在后台运行前,先在前台测试隧道是否通畅,避免后台静默失败:
ssh -N -v -L 本地端口:目标主机:目标端口 用户@主机
确认连接成功且无报错后,按 Ctrl+C 退出。
命令速用版
1. 临时后台运行(原生 ssh)
ssh -f -N -o "ExitOnForwardFailure=yes" -L 本地端口:目标主机:目标端口 用户@主机
注意:添加 -o "ExitOnForwardFailure=yes" 可防止端口转发失败时进程仍驻留后台。
2. 稳定守护运行(autossh)
autossh -M 0 -f -N -o "ExitOnForwardFailure=yes" -o "ServerAliveInterval 30" -o "ServerAliveCountMax 3" -L 本地端口:目标主机:目标端口 用户@主机
参数说明:-M 0 禁用监控端口,依赖 SSH 心跳检测;ServerAliveInterval 设置心跳间隔。
Systemd 开机自启配置
若需开机自动启动隧道,建议创建 systemd 服务文件。
1. 创建服务文件
sudo vim /etc/systemd/system/ssh-tunnel.service
2. 填入以下配置内容
[Unit] Description=SSH Tunnel Service After=network.target [Service] User=你的用户名 ExecStart=/usr/bin/autossh -M 0 -o "ExitOnForwardFailure=yes" -N -L 本地端口:目标主机:目标端口 用户@主机 Restart=always RestartSec=10 [Install] WantedBy=multi-user.target
注意:请将“你的用户名”、端口及主机信息替换为实际值。
3. 启用并启动服务
sudo systemctl daemon-reload sudo systemctl enable ssh-tunnel.service sudo systemctl start ssh-tunnel.service
验证方法
1. 检查进程
ps -ef | grep ssh
2. 检查端口监听
ss -tlnp | grep 本地端口
3. 模拟终端关闭
退出当前 SSH 会话或关闭终端窗口,重新登录后再次执行上述检查命令,确认进程 PID 依然存在且端口仍在监听。
4. 查看服务状态(systemd 方式)
systemctl status ssh-tunnel.service
常见坑与排查
1. 密钥权限错误:私钥文件权限必须为 600,否则 SSH 会拒绝使用。执行 chmod 600 ~/.ssh/id_ed25519 修复。
2. 假成功后台化:未配置 ExitOnForwardFailure=yes 时,即使端口转发失败,进程也可能在后台运行。务必添加该参数。
3. 连接超时断开:默认 SSH 空闲超时可能切断连接,建议配置 ServerAliveInterval 保持心跳。
4. 端口冲突:确保本地监听端口未被其他程序占用,可使用 ss -tlnp 排查。
5. 僵尸进程:使用 -f 时若认证失败可能不会正确后台化,建议先前台测试成功再加 -f。