18 KiB
网关账号与运维
网关支持先保存后逐账号关联目标。创建时可以省略目标映射;真实网关账号分别保存自己的 targetId 和 targetAccountId。更新时清空这些字段即可解除对应映射,管理界面的“断开连接”会清空该网关的全部账号映射。未完成所有启用账号映射的网关不能启动,缺少映射的账号也不能测试连接。网关运行中仍可打开配置并保存监听、认证账号、来源限制和访问策略;新连接使用新配置,已有连接保持接受时的配置。监听地址变化会先绑定新端口,绑定或保存失败不影响原监听。Redis、MongoDB 可在关闭认证时保存零账号,TCP 固定无协议账号;其他目标服务至少保留一个账号。Redis 一旦添加账号,默认 ACL 账号请显式填写 default 并选择对应账号。Redis、MongoDB 网关也可保存零账号以允许无认证客户端,其他账号型网关仍要求用户名和凭据。
运行中可通过「切换目标」或「拖拽连线」更换某个网关账号的一对一目标账号映射。保存成功后监听保持运行,但该网关的全部现有客户端连接会断开;客户端重连后使用新快照,被切换账号直接连接新目标。保存失败不会断开连接。详见 运行中切换目标。
多账号与权限
账号映射与连接测试
关联单位统一为“网关账号 → 目标账号”。拖动单个网关账号只修改该账号的 targetId/targetAccountId,不会改变其他网关账号的映射、密码和权限;目标只有一个账号时也显示可明确选择的账号入口。Redis、MongoDB 无认证配置显示“无认证账号”,TCP 显示“空账号”,这些端点的账号 ID 为空。网关和目标服务卡片均只展示,不提供整卡或批量关联。
拖拽页面新增“测试连接”,网关列表的测试入口使用相同流程。只有一个启用账号时直接测试;多个账号先选择要测试的网关账号,列表显示对应目标和目标账号,缺失映射不可选,禁用账号不参与。路径从选中账号关联的目标取得地址、TLS、认证库和连接资产,而不是读取网关本身可能为空的默认目标字段。K8s 卡片显示资源与 Kubernetes 资源端口,不要求维护 Pod IP。
POST /api/v1/proxies/{id}/test?gatewayAccountId={accountId} 按网关内的账号 ID 解析真实目标运行时;未知或禁用账号返回 400,不回退默认目标。未带参数仍保持原来的默认目标测试兼容行为,没有默认目标返回 409。测试不保存配置、不启动监听,也不验证客户端到网关的登录过程。测试完成后仍维持原账号关联。
2026-09-21 验证采用隔离 API/protocol fixture 及浏览器模拟失败响应:覆盖没有默认目标的账号映射、SOCKS5 出口解析、无效账号拒绝、K8s 拖拽和路径显示、多账号选择与其他账号保持不变。没有使用真实账号或修改真实目标数据。
gatewayAccounts 最多包含 32 个账号,每项包含 id、username、
password、disabled、accessMode、allowCIDRs 和 authorizedKeys。
ID 与用户名在同一网关内唯一;密码可以相同。账号 ID 是凭据更新的稳定标识。
支持的连接类型包括 MySQL、PostgreSQL、SQL Server(TDS SQL 登录)、MongoDB、Redis、RabbitMQ、SSH、SFTP、HTTP 和 HTTPS。SFTP 使用 SSH 的主机密钥校验和账号映射,但只允许 SFTP 子系统;HTTP/HTTPS 使用网关 Basic Auth,转发前会替换为目标账号凭据并移除代理伪造头;SQL Server 当前支持 SQL 密码登录和 TDS 请求审计。 更新时省略密码保留原密码,显式空字符串清除密码;非 SSH 网关不允许空密码。 SSH 可使用账号公钥代替密码。
旧 gatewayUser/gatewayPassword 配置仍可使用;一旦配置账号列表,认证仅
使用列表,不再回退到旧账号。MySQL、MongoDB、Redis、RabbitMQ 支持账号只读权限,账号无法
提升网关本身的只读限制。RabbitMQ 严格只读禁止消费,具体边界见 readonly.md。账号来源限制与网关来源
限制同时生效。每个真实网关账号必须用自己的 targetId/targetAccountId 选择同协议目标及其账号,不再从网关默认目标继承。旧顶层映射仍可读取;在界面编辑保存时会展开到各真实账号并清空顶层字段。Redis、MongoDB、TCP 的空网关账号继续使用顶层字段保存,空账号本身就是明确端点。解除网关关联会清空全部账号映射。
网关账号和目标账号支持 expiresAt(RFC3339)及 rotationReminderDays(0 默认 7 天,最多 365 天)。到期后拒绝新的认证,不主动终止既有会话。凭据仍需手动轮换;运行中保存轮换结果后,新连接使用新凭据,已有会话不主动终止。
密码通过账号编辑手动轮换;保存后对新连接生效。历史配置以主密钥 加密保存,你可通过配置历史恢复旧凭据。没有后台自动轮换或上游密码 修改功能。正常列表和历史元信息不返回密码。
六种协议记录 authentication_succeeded、authentication_failed 事件,
事件详情包含用户名,不包含密码。可通过事件类别和关键词筛选账号认证记录。
个人登录
项目采用个人使用模式,不提供管理用户、角色分配或多人权限管理。 启用认证后,使用首次初始化的个人账号登录;密码沿用本地重置命令。 旧版本的附加用户和它们的 API Token 无法继续认证,原始数据库记录保留。 重置个人登录密码会使旧会话及该账号的 Token 失效。免登录模式仍仅限本机访问,写入操作保留 CSRF 校验。
批量操作和监控
网关列表支持搜索、选择、批量启动/停止、复制创建和批量创建。 批量创建递增监听端口,逐项显示结果;部分失败不会撤销已成功项。 端口占用在启动监听时检测,不会抢占其他进程端口。
运维页面显示活动连接、认证成功/失败、连接失败率和平均认证耗时。目标健康检查会按协议执行轻量探测:MySQL 握手及 COM_PING 响应、PostgreSQL SELECT 1、MongoDB hello/buildInfo、Redis PING、RabbitMQ 虚拟主机连接、SQL Server TDS 登录、HTTP/HTTPS HEAD、SSH 认证,以及 SFTP 工作目录检查。结果包含协议、检查内容、阶段、延迟和协议返回摘要。
TCP 连接和协议认证分别计数。手动健康检查最多尝试 3 次,总超时 25 秒;
只重试固定健康探测,不重放业务命令。周期检查默认关闭,可设置为
10–86400 秒,每轮检查每个目标的全部账号;零账号 Redis 仍执行一次无认证探测。最多并发 4 个周期探测,慢账号不会阻塞整轮检查。每轮完成后再处理下一轮,不累积并发批次。
间隔设置持久保存并在进程重启后恢复,设为 0 会持久关闭。指标与检查结果仍在重启后重置。
停止或重新配置检查任务时,取消中的探测不会把目标标记为故障,保留上次已完成结果;真正的探测超时仍记为失败。结果按目标 ID、账号 ID 稳定排序。
监控页面默认每 5 秒刷新指标和健康结果,可关闭自动刷新;切到后台标签页时暂停新请求,返回后刷新,离开运维页面时停止刷新。自动刷新只读取结果,不触发目标探测,也不会改变后台检查间隔。请求尚未结束时不重叠发送;刷新失败保留原结果并显示提示。正在编辑的检查间隔不会被刷新覆盖,非法间隔不能提交。健康表优先显示可选账号备注和用户名,悬停可查看账号 ID;未填写备注时不影响健康检查。
/healthz 表示进程存活;/readyz 要求至少一个已绑定网关,且所有已绑定
网关的监听器均运行。两者都不保证目标服务可用或凭据正确。
会话、告警和 API Token
运维页面的活跃会话显示账号、来源、目标账号和连接时长,你可单独断开连接,其他会话和网关监听不受影响。
告警中心每 30 秒检查目标健康结果、认证失败增量、凭据到期及网关 TLS 证书到期。目标不可用告警依赖已启用的周期健康检查或手动健康检查结果。认证失败按采样窗口统计。告警支持确认、去重和恢复;默认仅在站内显示。管理员显式启用 Webhook 后才发送通知,可配置 HMAC-SHA256 签名密钥,每次状态变化最多尝试 3 次,不跟随 HTTP 重定向。Webhook 设置加密保存,查询接口不返回地址或密钥。
GET /api/v1/metrics 提供 Prometheus 文本指标,包括监听状态、连接数、认证成功/失败计数、认证耗时和目标健康状态。自动化调用可使用短期 API Token:登录后在运维页面或 /api/v1/tokens 创建并选择 read、write、audit 或 metrics 作用域,密钥只在创建时返回。页面支持查看所属账号、作用域、到期时间和撤销。重置个人登录密码会使其 Token 失效;退出网页登录不会撤销 Token。Token 无权获取加密备份、查看密码、管理 Token 或访问 Webhook 设置,读写响应均清除密码、私钥和 Kubernetes 配置等敏感字段。
配置备份和历史
从侧边栏「配置管理」进入配置导出、导入、配置模板和历史恢复页面。「导出配置」填写口令后下载加密文件,包含资产管理中的全部原始文件、上传文件名、资源引用和凭据,详见 配置备份。WebDAV 设备间配置同步使用独立的「多端同步」入口,详见 WebDAV 多端同步。
恢复历史配置前,页面显示当前配置与历史版本的差异。密码、私钥、口令和 Kubernetes 凭据仅标记变更,不返回原值;账号按稳定 ID 对比。 切换历史资源会立即清空旧列表,并忽略先前资源迟到的列表和差异响应。差异页与恢复确认页均显示资源名称、ID 或版本;恢复期间防止重复提交,操作始终绑定确认时的资源与版本。
POST /api/v1/configuration/backup:提交passphrase,下载加密配置包。POST /api/v1/configuration/import:提交{backup, passphrase, expectedRevision}或{bundle, expectedRevision};使用预览返回的 revision 防止覆盖预览后的修改,配置已变更返回 409。旧客户端仍可不传 expectedRevision。GET /api/v1/configuration/history?kind=gateways&id=...:历史元信息; kind 也支持targets和outbounds。POST /api/v1/configuration/restore:提交{kind,id,revision}恢复版本。GET /api/v1/configuration/diff?kind=gateways&id=...&revision=...:查看脱敏差异。POST /api/v1/configuration/import/preview:与实际导入共用合并及引用校验,返回资源数量、revision、新增/覆盖/未变更列表及脱敏字段差异;支持部分配置引用现有资源,不写入数据库。GET/POST/DELETE /api/v1/templates[/{id}]:保存、读取和删除脱敏配置模板。
模板页面支持将当前配置保存为模板、导入文件、查看/导出 JSON、补齐凭据后预览应用及删除。模板保存前清除秘密,读取旧模板时也会脱敏;只读运维和审计员无权访问。模板结构允许缺少凭据,实际应用必须通过完整配置校验。编辑器导出的当前 JSON 可能包含操作者刚填入的凭据。
备份采用随机盐、PBKDF2-SHA256 和 AES-GCM,包含恢复所需的凭据,可迁移到使用不同主密钥的实例。 导入先校验全部引用,事务提交;导入的网关保持停止。导入和回滚要求所有 网关先停止。配置包不包含个人登录凭据、审计数据库、网页 TLS 文件和完整历史, 不能代替完整数据目录备份。
高可用采用独立实例加外部负载均衡,见 高可用部署。 设备间配置可通过 WebDAV 多端同步手动或定时同步;不提供运行中会话迁移。
拖拽图中的目标多账号
目标服务的全部账号常驻显示可选账号备注和用户名,未填写备注时回退显示用户名或“未填写备注”;未选择源网关账号时也不折叠。选择或拖动源账号后,仅同协议目标账号可关联;连线起点和终点都为具体账号行,选择源账号不会改变目标位置。单账号关联仅修改该网关账号并保留其他映射,服务卡片不响应关联操作。窄屏可点击两端完成关联。
此显示调整无需数据迁移,不改变既有账号映射。最新嵌入程序的五项专项回归通过,桌面和窄屏截图已检查;完整验证范围见 docs/testing.md。
验证范围
数据库健康、慢请求与压力(2026-10-15)
运维监控增加数据库选择、目标账号选择和“采集健康与压力”。覆盖 MySQL、PostgreSQL、SQL Server、MongoDB、Redis、RabbitMQ;复用现有健康检查,压力采集使用独立连接,最多等待 10 秒。可选每 15 秒采集,仅页面可见时发起,不重叠请求。已有后台健康检查间隔不受影响。
压力采集仅执行固定只读统计请求:MySQL 的 GLOBAL STATUS/VARIABLES(连接、流量、锁和缓冲池),PostgreSQL 的 pg_stat_database/pg_stat_activity(会话、事务、缓存、锁等待),SQL Server DMV(会话、请求、调度队列、进程内存),MongoDB serverStatus(连接、内存、操作和锁队列),Redis INFO(连接、内存、吞吐、累计 CPU 秒数),RabbitMQ 管理 API overview/nodes(积压、内存、磁盘、文件描述符及告警)。RabbitMQ 使用目标管理端口,默认 15672,可独立启用 TLS,不要求开启网关管理监听。
统计权限由目标账号决定;MongoDB 通常需要 clusterMonitor,PostgreSQL 完整统计需要 pg_monitor/pg_read_all_stats,SQL Server 需要对应版本的 VIEW SERVER STATE 或 VIEW SERVER PERFORMANCE STATE,RabbitMQ 节点指标需要 monitoring/administrator。缺失指标给出提示,不伪造为零,不自动授予权限或修改配置。数据库统计不等于宿主机 CPU 利用率;累计值及集群单节点范围在界面注明。
慢请求只统计经过 LinkPort 且已收到完整响应的操作,阈值固定为 1000 ms,进程内保留最近 500 条,重启清空。仅保存时间、网关/目标/账号标识、协议、操作类别和耗时;不保存 SQL 参数、Redis 键值或消息正文,不读取上游慢日志。耗时包含网关、网络、排队及响应传输,不能当作纯数据库执行时间。
MySQL 按查询响应、MongoDB 按请求响应、Redis 按有序回复、SQL Server 按 SQL batch/RPC 响应计时。PostgreSQL 简单查询按 Query 周期、扩展查询按首个 Parse/Bind/Execute 到 ReadyForQuery 的周期计时(包含客户端发送 Sync 前的等待)。RabbitMQ 只计量有强制回复的通道开关及队列/交换机声明;异步发布、消费、推送、无回复操作和管理 HTTP 请求不在慢请求计时范围。订阅模式及无法可靠关联的响应停止计时,保持协议转发;每条连接待匹配队列上限 4096。
接口为 POST /api/v1/monitoring/database(targetId、accountId),返回 health 和 diagnostics;原 GET /api/v1/monitoring 新增按目标范围筛选的 slowRequests。新增响应字段兼容旧客户端,无数据库迁移,不修改已有目标数据。
本轮实际验证:Go 1.27.1 协议、model、gateway、api 测试通过,新增 MySQL 完成计时、Redis 流水线/推送/未知 RESP 保真、TDS 消息边界、RabbitMQ 通道关联和只读管理采集测试通过,API 验证指标不可用时仍保留健康结果且不泄露凭据。全量 Go 测试仅 internal/cluster/TestMySQLReplicationAndGroupDiscovery/mysql-replication 的既有测试桩在 go-mysql 公钥认证处空指针失败,其他包通过;go vet ./... 通过。前端生产构建、18 项 Node 测试通过。新构建 bin/dev-build/monitoring/linkport.exe 的监控、Redis/RabbitMQ 只读与管理端口专项浏览器回归通过;监控数据为模拟接口,协议测试为本地 fixture,未连接真实数据库。完整 Playwright 在既有 account-editor 测试的 .target-card/“配置目标”定位器处失败,设置首次失败停止,余下 175 项未运行;日志在 bin/dev-build/monitoring。未部署或重启当前服务。
TCP 端口映射为无协议账号的独立服务类型,默认监听 0.0.0.0;来源白名单和连接数限制仍生效。目标需同为 TCP 类型,画板通过网关“空账号”连接到目标“空账号”,不使用服务卡片建立绑定。完整操作与安全边界见 tcp-port-mapping.md。
新增后端测试使用临时 SQLite 和本地协议测试桩,前端测试使用独立数据目录 及新构建程序。角色界面的部分测试使用模拟接口,后端另有真实接口权限测试。 这些测试不等同于真实 MySQL/PostgreSQL/MongoDB/Redis/RabbitMQ/SSH 服务矩阵 或双节点高可用集群验收。
2026-09-12 验证结果:Go 1.25.0 全量 go test ./... -count=1 -timeout=120s
及 go vet ./... 通过,npm.cmd --prefix web run build 通过。
Playwright 使用新构建的 artifacts/linkport-e2e.exe,在
LINKPORT_BROWSER_CHANNEL=chromium 下 22 项全部通过。套件启动两个独立
临时数据库实例,18081 用于开发模式流程,18082 用于真实个人登录和 Token
创建、指标调用、权限拒绝及撤销;不会复用现有服务。
本轮回归覆盖模板存取脱敏、旧模板读取脱敏、角色访问限制、Token 读写响应
凭据隔离和到期/撤销/用户变更失效、导入合并校验及过期预览拒绝、模板界面
文件导入导出与校验失败保留输入、周期检查全部账号及间隔恢复。
MySQL 测试桩验证收到 COM_PING 后必须取得响应才算健康;SSH 请求回复与
通道关闭测试额外重复 50 轮通过。这些协议检查使用本地测试桩,未宣称通过
外部真实服务或生产高可用环境验收。
2026-09-13 优化验证:Go 1.25.0 全量测试、go vet 和前端构建通过;最新嵌入页面的程序通过 22 项既有浏览器回归,2 项新增回归在修正测试控件定位后单独运行通过。新增浏览器回归使用受控延迟响应验证历史资源切换、差异恢复对象、监控刷新去重、间隔草稿保护和后台页面暂停。后端慢探测测试桩验证周期检查并发上限为 4、账号完整覆盖、稳定排序及取消时保留已有结果;未连接生产目标进行测试。