隧道/代理
通过 SSH 隧道、HTTP 隧道、SOCKS5 代理或 HTTP 代理连接内网数据库。
当数据库不能直接访问时,DBX 可以在连接窗口的 隧道/代理 页签里配置连接层。
DBX 支持三类隧道/代理:
| 类型 | 适用场景 |
|---|---|
| SSH 隧道 | 有跳板机、堡垒机或数据库服务器的 SSH 权限。 |
| 代理 | 网络环境要求通过 SOCKS5 或 HTTP CONNECT 代理。 |
| HTTP 隧道 | 只有内网 Web 服务器能访问数据库,不能使用 SSH/VPN。 |
对网络数据库来说,DBX 会先在本机打开一个本地端口,让数据库驱动连接这个端口,再由隧道/代理层把数据库协议字节转发到真实目标。
SSH 隧道
SSH 隧道是内置能力,不需要在终端里手动执行端口转发命令。
| 字段 | 说明 |
|---|---|
| SSH 主机 | SSH 服务器的地址 |
| SSH 端口 | SSH 端口,默认 22 |
| SSH 用户 | 登录 SSH 服务器的用户名 |
| 连接超时 | DBX 等待 SSH 连接建立的最长时间,默认 5 秒 |
选择本地的 SSH 私钥文件,例如 ~/.ssh/id_rsa、~/.ssh/id_ed25519:
- 密钥路径:浏览并选择私钥文件。
- 密钥密码:如果私钥设置了密码保护,在这里输入。
密钥认证比密码认证更安全,推荐优先使用。
直接输入 SSH 用户的登录密码。适用于允许密码登录的服务器。
允许局域网访问
启用“允许局域网访问”后,同一网络里的其他设备也可以通过你的机器访问转发后的数据库端口。只应在可信网络中启用。
默认情况下,SSH 隧道只监听 localhost。启用局域网访问后会绑定到 0.0.0.0,适合临时团队协作或多设备共享访问。
代理
如果当前网络要求通过代理访问数据库,可以添加代理层,而不是配置 SSH。
DBX 支持:
- SOCKS5 代理
- HTTP CONNECT 代理
- 可选代理用户名和密码
HTTP 隧道
功能类型叫 HTTP 隧道。DBX 当前随代码提供的部署脚本是
dbx_tunnel.php,所以部署文件是 PHP 实现,但连接类型本身不是“PHP 隧道”。当数据库在内网中,外部只能访问一台内网 Web 服务器,并且不能使用 SSH/VPN 时,可以使用 HTTP 隧道。这类场景和 Navicat、SQL-Front 的 HTTP 隧道类似。
部署脚本
把 deploy/dbx_tunnel.php 上传到一台能访问目标数据库的 PHP Web 服务器。
在 PHP 服务器上配置环境变量:
| 变量 | 必填 | 说明 |
|---|---|---|
DBX_TUNNEL_TOKEN | 是 | 共享 token。DBX 里填写同一个值。 |
DBX_TUNNEL_ALLOWED_HOSTS | 否 | 允许连接的目标主机列表,逗号分隔,强烈建议配置。 |
DBX_TUNNEL_DIR | 否 | 会话队列目录,默认使用临时目录。 |
DBX_TUNNEL_MAX_SESSION_SECONDS | 否 | 会话最长生命周期,默认 3600 秒。 |
DBX_TUNNEL_PHP | 否 | 当 PHP-FPM 没有 fastcgi_finish_request 时,用于启动 worker 的 PHP CLI 路径。 |
在 DBX 里添加 HTTP 隧道 层,并填写:
| 字段 | 说明 |
|---|---|
| 隧道脚本 URL | dbx_tunnel.php 的 URL,例如 https://example.com/dbx_tunnel.php |
| 隧道 Token | DBX_TUNNEL_TOKEN 的值 |
| 隧道超时 | 打开 HTTP 隧道以及连接目标数据库的超时时间 |
数据库主机和端口要填写“PHP 服务器视角下能访问到的地址”,不一定是你本机能直接访问到的地址。
HTTP 隧道流程
DBX 数据库驱动
-> 127.0.0.1:<本地临时端口>
-> DBX HTTP 隧道客户端
-> HTTP POST 请求
-> Web 服务器上的 dbx_tunnel.php
-> PHP 发起到内网数据库的 TCP 连接
-> 数据库具体协议是短 HTTP 轮询:
- DBX 在本机启动一个 TCP 监听端口。
- 数据库驱动连接这个本地端口。
- DBX 向
dbx_tunnel.php发送open,带上 session id、目标主机、目标端口和连接超时。 - PHP 脚本校验 token 和 allow-list,然后启动 worker,worker 打开到数据库的 TCP socket。
- 数据库驱动发出的字节由 DBX 通过
write发给脚本。 - DBX 通过
read轮询脚本;脚本返回数据库响应字节后,DBX 写回本地数据库驱动连接。 - 连接结束时,DBX 发送
close,PHP worker 关闭数据库 socket。
这个方案不需要部署 DBX Web,也不使用 WebSocket。
安全与限制
- 脚本 URL 建议使用 HTTPS。
DBX_TUNNEL_TOKEN应使用足够长的随机值。- 建议配置
DBX_TUNNEL_ALLOWED_HOSTS,避免脚本变成通用内网 TCP 转发入口。 - 如果条件允许,限制脚本路径的公网访问范围。
- HTTP 隧道部署方便,但通常比直连、VPN、SSH 慢,因为它通过 HTTP 轮询和服务器端队列搬运数据库字节流。
- 如果和其他连接层一起使用,HTTP 隧道必须放在隧道/代理第一层,因为它是最外层网络边界。
文件型数据库
SQLite 和 Access 是文件型连接,不使用隧道/代理。DuckDB 通常也使用本地文件,所以只有当当前驱动类型确实需要网络端点时才需要配置隧道/代理。