Databasement的SSH隧道是如何工作的?通过堡垒机安全备份内网数据库 Databasement的SSH隧道是如何工作的通过堡垒机安全备份内网数据库【免费下载链接】databasementSelf-hosted database backup manager with a web UI. Schedule, backup, and restore MySQL, PostgreSQL, MariaDB, Microsoft SQL Server, MongoDB, SQLite Redis to S3, SFTP, Samba or local storage. SSH Tunnel support.项目地址: https://gitcode.com/gh_mirrors/da/databasementDatabasement 是一款自托管的数据库备份管理工具内置图形化 Web 界面可以为 MySQL、PostgreSQL、MariaDB、SQL Server、MongoDB、SQLite 和 Redis 定时执行备份与恢复并将快照上传到 S3、SFTP、Samba 或本地存储。它的SSH 隧道功能尤为实用当数据库藏在内网、或者只能经由堡垒机Jump Host / 跳板机访问时你无需开放任何数据库端口Databasement 就能自动借道 SSH 连接完成备份。为什么需要 SSH 隧道备份内网数据库内网数据库最常见的困境是数据库主机在私网/内网备份服务器根本无法直连数据库运行在远程 Docker 宿主机上端口没有对外发布安全策略要求数据库端口绝不出网只允许 SSH22 端口通行。传统做法是在数据库服务器上装 crontab 客户端工具维护一套又一套的脚本。而 Databasement 的思路是只连 SSH其余全交给隧道。数据库端口对公网完全不可见备份链路全程加密。配置 SSH 隧道指向堡垒机即可在数据库服务器表单中开启SSH Tunnel只需填写 5 个字段字段说明SSH Host堡垒机/跳板机的域名或 IPSSH PortSSH 端口默认 22SSH UsernameSSH 登录用户Auth TypePassword或Private Key可带密钥口令Enable compression追加-C压缩选项用少量 CPU 换带宽慢速链路上值得开启两个很贴心的设计复用配置保存一份 SSH 配置后多台数据库服务器可以共享同一份连接——改一次处处生效源码DatabaseServerSshConfig.php。一键生成密钥认证方式选择私钥时表单可以自动生成一对 Ed25519 密钥SshKeyGenerator.php把公钥粘贴到堡垒机的~/.ssh/authorized_keys即可。公钥只显示一次、不会存储避免服务器留存无用的授权凭证。SSH 隧道的工作流程核心原理核心实现在 SshTunnelService.php整个生命周期可以概括为四步1️⃣ 分配本地端口。启动隧道前系统先在127.0.0.1上申请一个空闲端口绑定 0 端口让系统自动分配作为本次隧道的本地入口。2️⃣ 启动 SSH 转发进程。系统执行类似如下命令自动拼接无需手写ssh -N -L 本地端口:数据库主机:数据库端口 -l 用户 堡垒机-N表示不执行远程命令只建立通道-L即本地端口转发把本地端口的流量经堡垒机加密送达数据库端口还带上了ServerAliveInterval、ExitOnForwardFailure等选项防止隧道静默断开。3️⃣ 轮询确认隧道就绪。系统每 100ms 探测一次本地端口是否可连接最多等待 30 秒一旦就绪就把备份连接的目标从内网数据库地址无缝替换为127.0.0.1:本地端口。4️⃣ 备份完成立即关闭隧道。这个用完即拆的设计由 UsesSshTunnel.php 提供BackupTask在 dump 之前调用establishSshTunnel()结束时调用closeSshTunnel()。隧道只存活于一次备份/恢复任务的窗口期内临时写入的密钥文件权限 0600也会随任务结束被删除最大限度缩小暴露面。数据流向非常简单直观Databasement 容器 → 127.0.0.1:随机端口 → SSH 加密通道 → 堡垒机 → 内网数据库 注意一个关键细节mysqldump、pg_dump、mongodump等工具运行在 Databasement 容器内堡垒机上不需要安装任何数据库客户端——它只负责转发。远程 Docker 主机的典型用法一个高频场景PostgreSQL 跑在远程机器的 Docker 里端口只发布到宿主机回环地址services: db: image: postgres:16 ports: - 127.0.0.1:5432:5432然后把数据库Host填127.0.0.1、Port填5432。回环地址正是隧道的落点——数据库对局域网都不可见却恰好是 Databasement 隧道能到达的位置。如果宿主机没开 SSH还可以在同一 Compose 项目里加一个轻量 sshd 容器只发布 SSH 端口数据库按服务名在内部网络可达数据库端口依然不对外。更多方案见官方文档ssh-tunnel.mdSQLite 的特殊处理走 SFTP 而非隧道SQLite 是文件型数据库没有端口可转发。当 SQLite 服务器配置了 SSH 时Databasement 会自动切换到SFTP 传输模式见 DatabaseServer.php 中的requiresSftpTransfer()通过同一份 SSH 配置直接把.sqlite文件拉到本地再备份同样不需要暴露任何数据库端口。安全设计凭证加密与最小授权Databasement 在安全细节上做得相当克制凭证加密落盘密码、私钥、密钥口令三个字段使用 Laravel 加密 cast 存储encrypted并且模型将其列入hidden字段——API 的 GET/列表接口永远不会返回它们属于只写数据进程参数不含密码密码通过SSHPASS环境变量 sshpass -e传递避免出现在进程列表中带口令的私钥通过临时SSH_ASKPASS脚本处理堡垒机侧可进一步收敛权限在authorized_keys中给 Databasement 的公钥加上restrict,port-forwarding前缀该密钥就只能做端口转发无法执行任何远程命令restrict,port-forwarding ssh-ed25519 AAAA... databasement-tunnel配合数据库端口绑定回环或内网隔离就实现了公网只能摸到 SSH 这一扇门而 SSH 密钥也只被允许用来开门。常见失败原因排查现象可能原因隧道 30 秒超时堡垒机防火墙拦截了来自 Databasement 的 22 端口或未允许 TCP 出站Permission denied (publickey)公钥未写入authorized_keys或误传了公钥而非私钥隧道建立后 dump 报连接拒绝数据库 Host 填错——应填堡垒机上能路由到的地址如127.0.0.1或内网 IP密码认证失败服务器需安装sshpass生产环境建议改用密钥认证备份任务的完整日志含SSH tunnel established / closed标记可在任务详情中查看便于定位是哪一步出了问题。总结Databasement 的 SSH 隧道把堡垒机 端口转发这件原本需要运维手工维护的事变成了一次性表单配置✅ 数据库端口零暴露备份链路全程 SSH 加密✅ 隧道按任务启停密钥临时落盘、用完即删✅ 凭证加密存储API 只写不读✅ 堡垒机无需安装任何数据库工具✅ 一份 SSH 配置可被多台服务器复用支持 API 与 Ed25519 密钥一键生成。如果你的数据库藏在跳板机后面这就是如何安全备份内网数据库的最短路径。【免费下载链接】databasementSelf-hosted database backup manager with a web UI. Schedule, backup, and restore MySQL, PostgreSQL, MariaDB, Microsoft SQL Server, MongoDB, SQLite Redis to S3, SFTP, Samba or local storage. SSH Tunnel support.项目地址: https://gitcode.com/gh_mirrors/da/databasement创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考