1 功能

本地服务器需通过 端口映射 方式向外网提供访问。使用 SSH 反向隧道 实现该功能,并希望在系统重启后、用户登录之前,也能自动建立连接。


2 原理

autossh 通过定期检测连接状态,发现异常后自动重启 SSH 隧道,从而保持稳定连接。

它可通过 -M 选项指定一个 监控端口,用于发送心跳包检测连通性;若监控端口通信中断,则认为连接已断开并重新建立。
若未设置 -M,则依赖 SSH 自身的心跳机制(ServerAliveIntervalServerAliveCountMax 等)进行检测。


3 开机自动启动 autossh

3.1 创建 systemd 服务

1
sudo vi /etc/systemd/system/autossh.service

写入以下内容:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
[Unit]
Description=Autossh Tunnel
Wants=network-online.target
After=network-online.target

[Service]
Type=simple
User=xieyan
ExecStart=autossh -M 55556 -N -R 8222:192.168.10.168:22 ubuntu@tencent.xyan666.com -i /exports/shell/xieyan_tencent.pem
Restart=on-failure
RestartSec=20s

[Install]
WantedBy=multi-user.target

3.2 启动与启用服务

1
2
3
sudo systemctl daemon-reload
sudo systemctl enable autossh
sudo systemctl start autossh

3.3 注意事项

  • ExecStart 需使用阻塞式命令,否则服务会立即退出。
  • 如遇错误,可查看日志:journalctl -u autossh.service
  • 若同时启用多个监控端口(如 55556),需错开端口号,因 autossh 会占用 5555655557
  • 使用 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
2
netstat -na | grep 38201 
telnet localhost 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 可能“假连通”