1 功能

我有一个本地服务器,想通过网络服务器端口映射的方式供其他主机连接。具体使用 SSH 端口映射的方式,并且希望在重新启动后,登录之前也能正常连接。

2 原理

定期检查 SSH 连接是否仍然正常,并在发现连接中断或不稳定时重新启动 SSH 进程。

它会创建一个额外的 " 监控端口 "(通常由 -M 选项指定),通过这个端口发送和接收数据包。如果发现数据包不能通过这个监控端口到达远程服务器,就认为连接已断开。如果不设置 -M 端口,autossh 会依赖于 SSH 本身的心跳(通过 ServerAliveInterval 等参数)来进行监控。

3 操作

3.1 配置服务

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ vi /etc/systemd/system/autossh.service

编辑如下:

[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
$ systemctl daemon-reload
$ systemctl enable autossh
$ systemctl start autossh

3.3 注意

  • 设置中的 ExecStart 需要设置阻塞命令,否则无法正常运行。
  • 如遇到错误,可以使用以下命令进行调试:journalctl -u autossh.service。
  • 如果需要开启多个端口(如 55556),最好在它们之间空出一些号码,以免出现错误(设为 55556 时,会同时开启 55556 和 55557)。
  • 在使用 autossh 前至少用 ssh 连一次,使服务器进入 known_hosts
  • 最好在 server client 都设置心跳,否则可能发生连接僵死,用 autossh 会发生一开始正常,后面就连不通的情况,详见 租用云服务器_配置