隧道生命周期管理¶
本文档描述了 SSH 隧道在整个生命周期中的管理方式,包括启动、关闭和状态管理。
隧道状态¶
每个隧道可以处于以下状态之一:
| 状态 | 描述 |
|---|---|
| RUNNING | 隧道处于活动状态并已连接 |
| STOPPED | 隧道未运行 |
| STARTING | 隧道正在启动过程中 |
| DEAD | 隧道进程异常终止 |
| INTERACTIVE | 隧道需要手动输入密码 |
生命周期阶段¶
1. 容器启动¶
当容器启动时:
- 清理旧状态:删除
/tmp/autossh_tunnels.state确保状态准确 - 创建基础设施:
- 创建状态文件(权限 666)
- 创建日志目录
/tmp/autossh-logs(权限 777) - 设置正确的所有权(myuser:mygroup)
2. 启动单个隧道¶
处理流程:
- 检查隧道是否已运行
- 启动 autossh 进程
- 写入状态文件:记录 PID 和配置信息
- 创建日志文件:
/tmp/autossh-logs/tunnel-<哈希值>.log
3. 停止单个隧道¶
处理流程:
- 停止进程(先 SIGTERM,后 SIGKILL)
- 删除状态条目:从状态文件中移除该隧道记录
- 删除日志文件:清理对应的日志文件
4. 停止所有隧道¶
处理流程:
- 停止所有隧道进程
- 清空状态文件:删除所有记录
- 删除所有日志:清理整个日志目录
文件管理¶
状态文件¶
位置:/tmp/autossh_tunnels.state
格式:
示例:
cloud.usa2 127.0.0.1:33000 0.0.0.0:33001 remote_to_local done-hub 7b840f8344679dff5df893eefd245043 186
日志文件¶
位置:/tmp/autossh-logs/tunnel-<哈希值>.log
每个隧道都有自己的日志文件,便于隔离调试。
文件管理策略¶
| 操作 | 状态文件 | 日志文件 |
|---|---|---|
| 容器启动 | 清空(重新创建) | 保留目录结构 |
| 启动隧道 | 添加条目 | 创建新日志 |
| 停止隧道 | 删除对应条目 | 删除对应日志 |
| 停止服务 | 清空整个文件 | 删除所有日志 |
权限¶
| 文件/目录 | 权限 |
|---|---|
| 状态文件 | 666 (rw-rw-rw-) |
| 日志目录 | 777 (rwxrwxrwx) |
| 日志文件 | 由进程所有者创建 |
智能重启¶
当配置文件更新时,系统会:
- 检测配置变化
- 停止已删除的隧道
- 启动新增的隧道
- 保持未变化的隧道继续运行
这确保了对现有连接的最小干扰。
交互式隧道¶
在配置中标记为 interactive: true 的隧道:
- 需要手动输入密码或 2FA/TOTP 验证码
- 不会自动启动
- 在列表中显示为
INTERACTIVE状态 - 可以通过以下两种方式进行认证:
- CLI:使用
autossh-cli auth <hash>命令 - 浏览器:通过 Web 面板的 xterm.js 终端弹窗(需配置 WebSocket 服务器)
- CLI:使用
清理规则¶
- 单个隧道停止:仅清理该隧道的资源
- 服务停止:清理所有资源
- 容器重启:以空状态重新开始
- 死进程清理:删除孤立的条目和日志
使用 autossh-cli cleanup 手动清理死进程。
监控¶
检查隧道健康状态¶
常见问题¶
隧道持续重启¶
可能原因:
- 网络不稳定
- SSH 服务器配置问题
- 认证失败
查看日志获取详细信息:
状态不同步¶
如果状态显示不正确:
这将删除孤立的条目并将状态文件与实际运行的进程同步。