autossh隧道代理
1. autossh 是什么
autossh 是一个用来 自动重启 SSH 会话和隧道 的工具。
它主要解决 ssh 建立的端口转发/隧道在 网络抖动、超时、掉线 等情况下不会自动恢复的问题。
- 它不是 SSH 的替代品,而是 SSH 的封装增强工具。
- 底层依然调用
ssh,只是在会话失效时帮你自动重连。
2. 工作原理
autossh启动时,会同时拉起一个监控端口,用来检测隧道是否正常工作。- 如果隧道不可用(比如心跳包收不到),它会自动 kill 掉当前
ssh并重新拉起。 - 核心是利用 SSH 自身的 keepalive + autossh 的探测机制 保证隧道始终在线。
两种健康检测模式:
- 默认方式:autossh 启动一个监听端口 + 测试端口(
20000起),通过 loopback 检查隧道是否正常。 - 环境变量方式:
AUTOSSH_GATETIME=0时,关闭额外端口探测,只依赖 SSH keepalive 来判断连接。
注意:新增监听端口必须是>20000
3. 基本语法
1 | autossh [autossh选项] [ssh选项] |
常见参数:
-M <port>→ 指定监控端口(默认从 20000 开始)。-f→ 后台运行。-N→ 不执行远程命令(仅做端口转发时使用)。-L→ 本地端口转发。-R→ 远程端口转发。-D→ 动态端口转发(SOCKS5 代理)。
4. 使用示例
4.1 本地端口转发 + 自动重连
1 | autossh -M 20000 -f -N -L 8080:127.0.0.1:80 user@remote_host |
解释:
- 访问
localhost:8080→ 实际流量转发到远端127.0.0.1:80。 -M 20000:用 20000/20001 作为心跳检测端口。- 自动掉线重连。
4.2 远程端口转发 + 自动重连
1 | autossh -M 0 -f -N -R 10022:127.0.0.1:22 user@remote_host |
解释:
- 远程
remote_host:10022→ 映射到本地127.0.0.1:22。 -M 0:关闭额外监控端口,仅依靠 SSH keepalive。
4.3 动态端口转发 (SOCKS5)
1 | autossh -M 0 -f -N -D 1080 user@remote_host |
解释:
- 在本地开一个 SOCKS5 代理端口
1080,走远程remote_host。
4.4 环境变量控制
常用的环境变量:
1 | # 禁用额外监控端口,只依赖 SSH keepalive |
5. 最佳实践
与 ssh 配合:在
~/.ssh/config里设置好密钥认证、ServerAliveInterval、ServerAliveCountMax,保证基础 keepalive。1
2
3
4
5
6Host remote_host
HostName 1.2.3.4
User root
IdentityFile ~/.ssh/id_rsa
ServerAliveInterval 30
ServerAliveCountMax 3加 systemd 守护:把 autossh 写成 systemd service,比单独跑 autossh 更稳定。
1
2
3
4
5
6
7
8
9
10
11
12[Unit]
Description=AutoSSH Tunnel
After=network.target
[Service]
User=dev
ExecStart=/usr/bin/autossh -M 0 -N -R 10022:127.0.0.1:22 user@remote_host
Restart=always
RestartSec=5
[Install]
WantedBy=multi-user.target
6. 使用场景
- 内网穿透:在内网主机上跑 autossh,把 ssh 映射到外网服务器,随时能远程管理。
- 长期代理:比如跑一个稳定的 SOCKS5 隧道。
- 高可用隧道:防止批量 ssh 转发掉线。