HTTP隧道本质是PHP脚本中转TCP流量,非真正基于HTTP协议;Navicat通过上传tunnel.php到公网Web服务器,由其连接内网数据库(如192.168.1.100:3306)并透传请求,需确保PHP≥5.6、sockets扩展启用、allow_url_fopen开启、脚本权限644且数据库地址填内网IP而非localhost。
HTTP隧道不是走HTTP协议,而是用PHP脚本中转TCP流量
navicat 的「http 隧道」功能实际不依赖 http 协议本身,它只是把 tunnel.php(或 ntunnel_mysql.php)当作一个 tcp 流量转发器。脚本运行在公网 web 服务器上,由它主动连接内网数据库(如 192.168.1.100:3306),再把 navicat 的请求包一层层透传过去。所以它能绕过防火墙限制,本质是“让数据库看起来像在 web 服务器本地”。
常见错误现象包括:Connection refused、Script not found、浏览器访问 tunnel.php 返回 PHP 错误或下载弹窗——这些问题几乎都跟脚本没真正跑起来有关。
- PHP 版本必须 ≥ 5.6(Navicat 官方硬性要求),且
allow_url_fopen = On - Linux 下需确认
sockets扩展已启用(extension=sockets在php.ini中未被注释) -
tunnel.php文件权限设为644,所在目录不能被.htaccess拒绝访问(例如别放/admin/子目录下) - 脚本里硬编码的数据库地址必须填内网 IP(如
192.168.1.100),不能写localhost或127.0.0.1(那是 Web 服务器本机)
Navicat 15 中 HTTP 隧道配置的关键字段填什么
配置入口在「连接设置 → SSH 标签页」,注意不是「常规」或「高级」页,更不是 SSH 设置本身——这里 UI 设计容易误导人。填错位置会导致 Navicat 完全忽略 HTTP 隧道选项。
-
HTTP 隧道 URL:必须是完整可访问地址,如https://your-domain.com/ntunnel_mysql.php;必须带http://或https://,末尾不能有斜杠 -
目标主机:填内网数据库真实 IP(如192.168.1.100),不是 Web 服务器 IP,也不是localhost -
目标端口:填 MySQL/PostgreSQL/SQLite 实际监听端口(MySQL 默认3306,但内网可能改过) -
用户名和密码:填数据库账号凭据,不是 Web 登录凭证;Navicat 不会把它们发给 PHP 脚本,脚本里也不读取这些字段
填完后,先别急着点测试。打开浏览器直接访问那个 HTTP 隧道 URL,应返回纯文本 OK 或空白响应;任何 PHP 报错、404、500 或文件下载行为,都说明脚本未就绪。
SQLite 连接时路径和权限最容易出错
SQLite 不是服务型数据库,ntunnel_sqlite.php 必须能以 Web 进程身份读写数据库文件。很多人填了绝对路径却失败,根本原因是 PHP 进程无权访问该路径,或路径相对于脚本位置算错了。
- 数据库文件路径必须是相对于
ntunnel_sqlite.php所在目录的相对路径(例如脚本在/var/www/html/,db 文件在同级data/test.db,就填data/test.db) - 若填绝对路径(如
/home/user/db.sqlite),需确保 Web 用户(如www-data或apache)对该路径有读+执行权限(execute权限对目录是必须的) - PHP 必须启用
SQLite3扩展:Ubuntu/Debian 下运行sudo apt install php-sqlite3,CentOS/RHEL 下用sudo yum install php-sqlite - Apache/Nginx 日志里若出现
Permission denied或no such file or directory,优先检查文件路径拼写和父目录的x权限
为什么连得上却查不出数据?注意字符集和超时设置
HTTP 隧道本质是长连接 + 多次 HTTP 请求模拟 TCP 流,中间环节多,比直连或 SSH 隧道更容易触发超时或编码异常。尤其当查询返回大量结果、含中文字段、或数据库启用了严格模式时。
- Navicat「高级」选项卡中,
Initial charset建议设为utf8mb4,否则中文可能乱码或报错Illegal mix of collations - PHP 脚本默认执行时间短(
max_execution_time = 30),大数据量导出易中断;需在ntunnel_*.php开头加set_time_limit(300) - Web 服务器(如 Nginx)可能有
fastcgi_read_timeout限制,默认 60 秒;若备份大库卡住,需同步调高该值 - 某些 CDN 或 WAF(如 Cloudflare)会拦截非标准 HTTP 请求体,导致隧道静默失败;调试阶段建议暂时关闭
最常被忽略的是:HTTP 隧道无法支持所有 MySQL 协议特性,比如存储过程调试、部分 PREPARE 语句、以及实时 binlog 订阅——它只保证基础 CRUD 和结构同步可用。











