autossh隧道代理

1. autossh 是什么

autossh 是一个用来 自动重启 SSH 会话和隧道 的工具。
它主要解决 ssh 建立的端口转发/隧道在 网络抖动、超时、掉线 等情况下不会自动恢复的问题。

  • 它不是 SSH 的替代品,而是 SSH 的封装增强工具
  • 底层依然调用 ssh,只是在会话失效时帮你自动重连。

2. 工作原理

  • autossh 启动时,会同时拉起一个监控端口,用来检测隧道是否正常工作。
  • 如果隧道不可用(比如心跳包收不到),它会自动 kill 掉当前 ssh 并重新拉起。
  • 核心是利用 SSH 自身的 keepalive + autossh 的探测机制 保证隧道始终在线。

两种健康检测模式:

  1. 默认方式:autossh 启动一个监听端口 + 测试端口(20000 起),通过 loopback 检查隧道是否正常。
  2. 环境变量方式: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
2
3
4
5
6
7
8
# 禁用额外监控端口,只依赖 SSH keepalive
export AUTOSSH_GATETIME=0

# 设置重试间隔(默认10s)
export AUTOSSH_POLL=30

# 设置日志输出位置
export AUTOSSH_LOGFILE=/var/log/autossh.log

5. 最佳实践

  1. 与 ssh 配合:在 ~/.ssh/config 里设置好密钥认证、ServerAliveIntervalServerAliveCountMax,保证基础 keepalive。

    1
    2
    3
    4
    5
    6
    Host remote_host
    HostName 1.2.3.4
    User root
    IdentityFile ~/.ssh/id_rsa
    ServerAliveInterval 30
    ServerAliveCountMax 3
  2. 加 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 转发掉线。