autossh 是一个 SSH 代理客户端,允许监控并自动重启 SSH 代理服务,确保隧道连接的稳定性。
| 术语 | 说明 |
|---|
| local | 本地 Docker 容器(包含 autossh 进程的环境) |
| target | 隧道的终点和目的地,即最终要访问的服务所在位置 |
| remote | 隧道传输的“中间人”或“代理服务器”,通过它间接访问目标服务 |
| source | 你的初始端点,可以访问代理服务器,但无法直接访问远程服务 |
以下为一个反向代理配置示例(使用 -L 本地端口转发模式):
services:
proxy_server:
image: jnovack/autossh
container_name: proxy_server
restart: always
environment:
# 需要绑定的 IP 地址
- SSH_BIND_IP=0.0.0.0
# 远程 SSH 用户名
- SSH_REMOTE_USER=user
# 代理服务器的域名或 IP
- SSH_REMOTE_HOST=x.x.x.x
# 代理服务器的 SSH 端口号
- SSH_REMOTE_PORT=22
# 目标服务的地址(从代理服务器视角)
- SSH_TARGET_HOST=localhost
# 目标服务的端口号
- SSH_TARGET_PORT=8000
# 隧道入口端口号(本地监听的端口)
- SSH_TUNNEL_PORT=8000
# 隧道工作模式(-L 本地转发)
- SSH_MODE=-L
| 变量名 | 默认值 | 说明 |
|---|
SSH_REMOTE_USER | root | 远程 SSH 登录用户名 |
SSH_REMOTE_HOST | localhost | 远程 SSH 服务器地址(代理服务器) |
SSH_REMOTE_PORT | 22 | 远程 SSH 服务器端口号 |
SSH_TUNNEL_PORT | 随机 >32768 | 隧道入口端口号,根据 SSH_MODE 决定监听位置 |
SSH_TARGET_HOST | - | 最终要访问的目标服务地址(从代理服务器解析) |
SSH_TARGET_PORT | - | 最终要访问的目标服务端口号 |
SSH_BIND_IP | 视模式而定 | 绑定的 IP 地址:-R 模式用于远程地址,-L 模式默认为 127.0.0.1,可设为 0.0.0.0 允许所有访问 |
| 变量名 | 默认值 | 说明 |
|---|
SSH_STRICT_HOST_IP_CHECK | True | 是否检查主机 IP 地址,防止动态 IP 带来的中间人攻击风险 |
SSH_KEY_FILE | - | SSH 私钥文件路径,若使用 Docker secrets 可指定为 /run/secrets/<secret-name> |
SSH_SERVER_ALIVE_INTERVAL | - | 保活间隔(秒),无数据传输时发送心跳包 |
SSH_SERVER_ALIVE_COUNT_MAX | 3 | 最大心跳失败次数,超过后断开并重连,设为 0 禁用 |
SSH_OPTIONS | - | 附加的 SSH 命令行参数,例如:-o StreamLocalBindUnlink=yes 用于重新创建 Unix 套接字 |
| 模式 | 说明 | 等效 SSH 命令示例 |
|---|
R | 远程端口转发(默认):将代理服务器上的端口流量转发到本地服务 | ssh -R 9000:localhost:3000 user@remote_server |
L | 本地端口转发:将本地监听端口的流量通过代理服务器转发到远程目标服务 | ssh -L 3000:target_server:9000 user@remote_server |
-R 模式:在代理服务器上访问 <代理IP>:<SSH_TUNNEL_PORT>,流量会被转发到本地的 <SSH_TARGET_HOST>:<SSH_TARGET_PORT>。-L 模式:在本地访问 <SSH_BIND_IP>:<SSH_TUNNEL_PORT>,流量会经由代理服务器转发到 <SSH_TARGET_HOST>:<SSH_TARGET_PORT>。
| 挂载路径 | 说明 | Docker 挂载示例 |
|---|
/id_rsa | SSH 私钥文件,用于免密登录代理服务器 | -v /path/to/id_rsa:/id_rsa |
/known_hosts | 已知主机列表文件,用于跳过首次连接确认或固定主机指纹 | -v /path/to/known_hosts:/known_hosts |