第 10 章SSH 隧道
数据库只允许内网访问时,通过一台跳板机把连接转发进去。 配置好之后,用户不需要在终端里手动开隧道——连接行为和直连完全一样。
它是怎么工作的
ssh 子进程做端口转发。
用的是系统的 ssh
TableLite 不自己实现 SSH 协议,而是调用 macOS 自带的 /usr/bin/ssh
做本地端口转发(-L)。这样做有三个好处:
- 你的
~/.ssh/config、known_hosts、ssh-agent 全部直接生效,和在终端里连一模一样。 - 各种密钥类型、跳板机、代理,系统都已经处理好了。
- 不用维护一份 SSH 实现。
代价是:需要在界面上管好这个子进程,退出时必须清理干净,不能留后台进程。
配置项
都在连接配置表单的「SSH 隧道」区域里。
| 字段 | 说明 |
|---|---|
| 通过 SSH 连接 | 总开关。勾上后下面这些字段才可用 |
| SSH 主机 | 跳板机的域名或 IP。开启「使用 ssh config 别名」时,可以填 ~/.ssh/config 里的 Host 名 |
| SSH 端口 | 默认 22 |
| SSH 用户 | 登录跳板机的用户名 |
| 认证方式 | 三选一,见下 |
| 使用 ssh config 别名 | 勾选后完全交给系统 SSH 配置解析该主机(包括别名、端口、用户、密钥) |
| 跳板机 | 形如 user@proxy:22,用于「先连 A 再跳 B」的场景 |
三种认证方式
连接过程中的提示
连接时状态栏依次显示两条:
正在建立 SSH 隧道…正在连接 MySQL…
隧道建立成功后,状态栏的提示里会带上隧道信息,但只在悬停详情里显示—— 主界面不显示本地端口,避免干扰。
首次连接一台新主机
自动接受新指纹,但不接受变化的指纹
系统 SSH 会记录主机指纹。TableLite 的行为是:
- 首次连接一台新主机时,自动接受它的指纹——等同于系统 SSH 默认的
accept-new。 这样你不用先在终端里连一次。 - 如果主机指纹发生了变化(可能是服务器重装,也可能是中间人攻击), 直接失败并展示完整警告,不会静默忽略。
隧道断开
- 连接状态变成红点。
- 状态栏提示
SSH 隧道已断开。 - 不自动重连——避免在你不知情的时候反复建立隧道。
- 点「重新连接」后,会重开隧道并重连数据库。
断开与退出时的清理
不能留后台 ssh 进程
- 关闭连接时同时关掉隧道,不残留后台进程。
- 退出 App 时清理所有隧道。
这一点是要专门验证的:如果在终端里 ps aux | grep ssh
还能看到隧道进程,说明清理有 bug。
错误提示
| 情况 | 提示 |
|---|---|
| 跳板机无法连通 | 无法连接到 SSH 主机 bastion.example.com:22(连接超时) |
| 用户 / 密码错误 | SSH 认证失败:Permission denied (password). |
| 私钥错误或需要口令 | SSH 认证失败:私钥需要口令,或密钥未被接受 |
| 目标数据库不可达 | SSH 隧道建立成功,但无法从跳板机访问 10.0.2.5:3306 |
| 主机指纹变化 | 见上方的警告面板 |
| 跳板机上没有权限 | 原样展示 SSH 的错误输出 |
明确不做
关于 SSH 的边界
- 不支持在界面里生成或管理 SSH 密钥(用
ssh-keygen) - 不支持端口转发之外的其他 SSH 功能(远程执行命令、SFTP)
- 不支持保存多个跳板机的层级——只支持一个「跳板机」字段
- 不支持在 App 内编辑
~/.ssh/config,请用文本编辑器 - 不自动修改
known_hosts