Support target-free SOCKS5 port mappings with reference protection and UI workflows. Include connection-stage diagnostics, SSH fingerprint confirmation, asset impact checks, listener traffic visibility, SQLite snapshots, account mapping improvements, and MySQL discovery fixes. Update feature rationale and validation docs; Go checks, frontend build and 121 browser tests passed.
5.3 KiB
SSH 连接测试
「资产管理 → 连接资产」的 SSH 转发项支持“测试连接”,验证跳板机连通性、已保存的主机指纹和账号密码,显示服务器版本、指纹与耗时。测试结束会关闭 SSH 连接,不执行远程命令。
探测、明确确认与严格保存
编辑连接资产时使用“探测 SSH 转发主机指纹(不发送账号密码)”。探测只使用主机和端口,在 SSH 主机密钥回调处主动中止握手;不发送用户名、密码或认证请求,不打开转发通道,不执行命令。它展示服务器出示的指纹,但探测成功不等于身份可信。
界面同时显示原指纹、新指纹和探测地址;指纹变更时显示警告,不自动替换已保存指纹。经可信渠道核对后,点击“已核对,确认此指纹并在保存时启用严格校验”,再保存连接资产。确认只修改当前编辑草稿,保存成功才持久化新指纹和 skipHostKeyVerify: false。关闭编辑器不会保存。
确认绑定当前登录会话、连接资产(新建时为该会话的草稿)、主机、端口、最近一次探测 ID、精确指纹及保存前的主机身份配置。五分钟后过期;新探测替换旧探测,成功保存消耗探测。编辑地址、指纹或跳过策略会清除界面确认。其他会话修改已保存主机身份配置后,旧确认也不能覆盖新配置。实际连接始终再次比对保存的指纹,探测后服务器换钥不会自动获得信任。
新增 API:
POST /api/v1/outbounds/probe:新建草稿探测,JSON{ "host": "jump.example", "port": 22 }。POST /api/v1/outbounds/{id}/probe:已有资产探测,同上;返回probeId、fingerprint、previousFingerprint、changed、host、port、expiresAt、authenticated: false。请求不接受凭据字段。POST /api/v1/outbounds/PUT /api/v1/outbounds/{id}:严格模式新建、换地址、换指纹或从持久跳过恢复严格模式时,必须同时提交顶层sshConfirmation: { "probeId": "…", "fingerprint": "SHA256:…" },以及outbound.hostFingerprint和outbound.skipHostKeyVerify: false。缺失或过期确认返回 409。不改变已保存严格身份配置的普通编辑无需重新确认。
此行为收紧旧 API:不再允许直接提交新的严格指纹来绕过确认流程;已有严格配置仍能连接,无数据库迁移。连接资产与目标 SSH/SFTP 的独立信任流程互不替代。
持久跳过与仅本次测试跳过
编辑 SSH 连接资产时,可以勾选“跳过主机指纹校验(不安全)”。默认关闭:必须填写并匹配 SHA256 指纹。开启后指纹输入禁用且可以留空,已有指纹不删除;保存后连接测试及实际 SSH 转发都跳过跳板机身份比对,但仍校验账号密码。连接测试返回服务器实际出示的指纹,这不表示其身份已验证。
API 对应 outbound.skipHostKeyVerify: true,未提供或为 false 时仍严格校验。无需数据库迁移;旧程序不支持此选项,回退前应补齐正确指纹。此选项只影响 SSH 转发跳板机,不改变目标 SSH/SFTP 的独立主机校验设置。共享连接资产的修改影响后续使用该资产建立的连接。
跳过校验存在中间人攻击风险,仅用于可信网络或临时排查。恢复严格模式须通过上述探测、核对、确认与保存流程。连接资产列表持续显示“未校验 · 持久跳过主机身份校验”,API 资产视图也返回 sshUnverified: true;认证成功不会清除此标记。
资源操作菜单另有“仅本次跳过指纹校验并测试(不安全)”,执行前要求确认密码可能发往不可信服务器。对应 POST /api/v1/outbounds/{id}/test 请求 { "testOnlySkipHostKeyVerify": true },只修改本次测试的配置副本,不写入配置、不保存或信任观察到的指纹。默认测试使用已保存策略。成功响应包含 hostKeyVerified 和 testOnlySkipHostKeyVerify,界面明确显示测试是否校验主机身份。持久跳过和仅本次测试跳过均不能绕过密码认证。
此测试不打开目标通道。验证转发权限、目标可达性和目标认证,请在「目标服务」中测试连接。SSH 目标测试前仍须先探测并确认目标主机指纹。
验证范围
新增 TestProbeSSHNeverAuthenticates、TestProbeSSHDeadline 使用进程内 SSH/停滞 TCP fixture,验证探测不进入认证、取消、超时及连接关闭。新增 API fixture 测试覆盖旧/新指纹、无确认拒绝、成功消费确认、地址/端口/指纹/会话/过期/被替换探测绑定,以及仅本次跳过不修改持久配置。web/tests/ssh-forward-fingerprint.spec.ts 使用模拟探测与保存响应验证列表警告、原/新指纹、显式确认和保存请求;不代表真实 SSH 服务器验证。
已执行前端 vue-tsc --noEmit -p web/tsconfig.json;使用 Go 1.25.0 的定向测试 go test ./internal/outbound ./internal/api -run 'Test(ProbeSSH|SSHForwarding|OutboundProbe|OutboundConfirmation|SharedOutbound)' -count=1 -timeout=120s 与 go vet ./internal/outbound ./internal/api 均通过。完整构建、全量 Go/vet 和新 executable 的实际 Playwright 结果见 testing.md;探测 UI 的模拟响应测试不等于真实 SSH 服务器验收。