phpMyAdmin如何通过SSH隧道安全连接

作者:袖梨 2026-08-07

phpMyAdmin本身不支持SSH隧道,需在Web服务器上手动建立本地端口转发并配置host为'127.0.0.1'、port匹配隧道端口,同时确保数据库用户授权包含堡垒机内网IP,否则即使隧道正常也会因认证失败报#2002错误。

phpMyAdmin 本身不支持 SSH 隧道,所谓“通过 SSH 隧道连接”,实际是靠你在运行 phpMyAdmin 的服务器上手动建立本地端口转发,再让 phpMyAdmin 去连 127.0.0.1 上的某个本地端口——它完全感知不到背后有跳板机。

为什么 phpMyAdmin 连不上 SSH 隧道?常见报错 #2002

这个错误几乎总是因为连接参数和隧道状态不匹配,不是 phpMyAdmin 坏了,而是没对上。典型表现是页面提示 Cannot log in to the MySQL server,但你确认密码没错、MySQL 服务也正常。

  1. host 写成了 'localhost':PHP 会尝试走 Unix socket,直接绕过你的 SSH 隧道;必须改成 '127.0.0.1'
  2. 隧道进程已退出:执行 ps aux | grep ssh,看不到那条 -L 33061:10.0.1.10:3306 命令,说明隧道断了
  3. phpMyAdmin 配置没生效:改的是错的 config.inc.php 文件(比如改了模板文件却没覆盖实际加载的那个)
  4. 浏览器 Network 标签里看到请求发到了 :3306 而不是你配的 :33061,说明配置根本没加载

如何在 Web 服务器上建立并守护 SSH 隧道

隧道必须建在运行 phpMyAdmin 的机器上(比如 web01),不能建在你本地电脑。否则 phpMyAdmin 根本访问不到那个端口。

  1. 基础命令:ssh -fN -L 33061:10.0.1.10:3306 [email protected],其中 33061 是本地空闲端口,10.0.1.10:3306 是内网数据库地址
  2. 必须加 -fN:后台运行且不执行远程命令,只做端口转发
  3. 必须提前配好免密登录:在 web01 上跑 ssh-copy-id [email protected],否则隧道启动就卡住
  4. 重启后自动恢复:用 autossh 或 systemd --user service,例如 autossh -M 0 -fN -L 33061:10.0.1.10:3306 [email protected]

phpMyAdmin 配置要点:host、port、授权三者必须一致

config.inc.php 时,只动这三项,其他保持默认即可:

  1. $cfg['Servers'][$i]['host'] = '127.0.0.1';(严禁用 localhost
  2. $cfg['Servers'][$i]['port'] = '33061';(必须和 ssh -L 后面的本地端口完全一致)
  3. 数据库用户授权必须包含堡垒机的内网 IP,比如 GRANT ALL ON *.* TO 'dbuser'@'10.0.0.5';,而不是 'dbuser'@'%''dbuser'@'localhost'

最容易被忽略的是数据库授权范围——隧道连得通,但认证失败,90% 是因为 MySQL 用户只允许从 localhost 或某个公网 IP 登录,而实际连接来源是堡垒机的内网出口 IP。这个细节不检查,其他全对也白搭。

相关文章

精彩推荐