phpMyAdmin无法直连堡垒机,必须通过Web服务器本地建立持久SSH隧道,将堡垒机作为网关转发至内网MySQL,再配置其host为'127.0.0.1'、port为对应隧道端口,并确保MySQL授权匹配堡垒机内网IP。

phpMyAdmin 不能直连堡垒机,必须绕过 SSH 跳转
phpMyAdmin 是纯 PHP Web 应用,不支持 SSH 隧道、ProxyJump 或 ssh -J 这类客户端跳转逻辑。它只做 TCP 连接,所有数据库通信都走 HTTP 请求背后的 PHP mysqli 或 PDO 扩展。所以你不能在 $cfg['Servers'][$i]['host'] 里填堡垒机地址并指望它自动 SSH 过去——那会直接报 #2002 Cannot log in to the MySQL server。
真正可行的路径只有一条:把堡垒机当作「SSH 网关」,在 Web 服务器本地建立持久 SSH 隧道,让 phpMyAdmin 认为后端 MySQL 就在本机或内网可直连地址上。
- 堡垒机本身不暴露 MySQL 端口(3306),也不转发 MySQL 协议;它只提供 SSH 访问入口
- 必须由运行 phpMyAdmin 的机器(通常是 Apache/Nginx 所在服务器)主动发起隧道连接
- 隧道目标是最终 MySQL 实例的 IP:port,不是堡垒机的 MySQL 端口
- 隧道需常驻、自动重连,不能靠浏览器每次登录才启动
用 autossh 建隧道:绑定本地端口到远端 MySQL
假设你的环境是:
- 堡垒机地址:
jump.example.com,SSH 端口 22,用户jumpuser - 内网 MySQL 1 地址:
10.10.20.5:3306(对应生产库) - 内网 MySQL 2 地址:
10.10.20.6:3307(对应测试库) - phpMyAdmin 运行在
web-server(IP192.168.1.100)上
在 web-server 上执行:
安装、修复、更新或打包一个基于 Python 和 PyMySQL 实现的 Windows `mysql` 命令。适用于用户希望在 PowerShell/CMD 中输入 `mysql` 时重定向到 Python 实现、需要交互式输入 MySQL 连接信息、需要同步到当前用户本地 bin 目录,或需要将该能力封装成可公开复用的 Codex skill。
autossh -M 0 -f -N -L 33061:10.10.20.5:3306 jumpuser@jump.example.com autossh -M 0 -f -N -L 33062:10.10.20.6:3307 jumpuser@jump.example.com
-
-L 33061:...表示把本地 33061 端口映射到远端 MySQL 1;后续 phpMyAdmin 就连127.0.0.1:33061 -
-M 0关闭监控端口(避免端口冲突),-f -N后台静默运行 - 务必用系统服务管理它(如 systemd unit),否则重启后隧道消失,phpMyAdmin 立刻断连
- 确认
web-server上能ssh jumpuser@jump.example.com成功,且已配置免密登录(用 ssh key)
phpMyAdmin 配置多实例:指向本地隧道端口
编辑 config.inc.php,用循环定义多个服务器,host 全部写 127.0.0.1,port 对应隧道端口:
$hosts = [
'prod' => ['host' => '127.0.0.1', 'port' => 33061, 'user' => 'dbadmin', 'password' => 'xxx'],
'test' => ['host' => '127.0.0.1', 'port' => 33062, 'user' => 'devuser', 'password' => 'yyy'],
];
$i = 0;
foreach ($hosts as $name => $conf) {
$i++;
$cfg['Servers'][$i]['auth_type'] = 'cookie';
$cfg['Servers'][$i]['host'] = $conf['host'];
$cfg['Servers'][$i]['port'] = $conf['port'];
$cfg['Servers'][$i]['user'] = $conf['user'];
$cfg['Servers'][$i]['password'] = $conf['password'];
$cfg['Servers'][$i]['extension'] = 'mysqli';
$cfg['Servers'][$i]['AllowNoPassword'] = false;
}
- 不要用
$cfg['AllowArbitraryServer'] = true—— 它只允许手动输 host,但无法保存凭据,每次切库都要重输密码,且不支持端口指定 - 每个
$cfg['Servers'][$i]的索引必须从 1 开始连续,不能跳(比如[1], [2], [3]),否则下拉列表可能只显示第一个 - 删掉任何残留的
$cfg['Servers'][$i]['socket'],它和 TCP 隧道冲突
关键检查点:隧道通了,但 phpMyAdmin 还连不上?
常见失败不是配置错,而是底层链路没打通。按顺序排查:
- 在
web-server上执行telnet 127.0.0.1 33061:不通 → autossh 没跑起来或被防火墙拦了 - 执行
ssh -v jumpuser@jump.example.com -L 33061:10.10.20.5:3306 -N手动测试一次:卡在 auth → SSH key 权限不对(~/.ssh/id_rsa应 600,目录 700) - MySQL 报
Access denied for user→ 检查远端 MySQL 是否授权了'dbadmin'@'127.0.0.1'?注意:隧道后,MySQL 看到的 client IP 是堡垒机的内网 IP(比如10.10.10.20),不是127.0.0.1;授权语句得写成GRANT ... TO 'dbadmin'@'10.10.10.20' - phpMyAdmin 页面空白或 500 → 查 PHP 错误日志,大概率是
config.inc.php语法错误(比如少括号、分号)
隧道是活的,权限是对的,配置索引没乱,就一定能连上。别试图让 phpMyAdmin “理解”堡垒机——它只认 TCP,其它全是你的事。
php免费学习视频:立即使用
踏上前端学习之旅,开启通往精通之路!从前端基础到项目实战,循序渐进,一步一个脚印,迈向巅峰!










