不能直接连,因HTTP隧道不理解MySQL/MariaDB二进制协议;需用ngrok或frp等支持TCP隧道的工具封装MySQL流量,配置skip-name-resolve和ssl-mode=DISABLED,并确保bind-address、安全组及中间网络兼容。
HTTP隧道能连上MariaDB吗?不能直接连,必须中转
http隧道本身不理解mysql/mariadb协议,mysql客户端发的是二进制握手包,而http代理(比如nginx或curl)默认只处理get/post文本请求。强行把mysql流量塞进http通道,服务端会直接断连或返回400 bad request——这不是配置问题,是协议层不兼容。
真正可行的路径只有一条:用支持TCP隧道的HTTP代理工具,在客户端和服务端之间建立一条“伪装成HTTP流量”的长连接通道,让mysql流量走这个通道。关键不是“HTTP隧道”,而是“HTTP封装的TCP隧道”。
用ngrok或frp暴露MariaDB端口最省事
这类工具本质是反向代理+隧道,它们在客户端启动一个本地监听,把所有发往该端口的TCP连接(比如3306)加密后通过HTTPS发到公网中继节点,再由中继节点转发到你指定的MariaDB服务器。整个过程对mysql客户端完全透明。
-
frp更可控:服务端部署frps,MariaDB机器跑frpc,配置项type = tcp,不碰HTTP路由规则 -
ngrok更快捷:一行命令ngrok tcp 3306,但免费版域名随机、带宽限速、连接不稳定 - 别用
ssh -R反向隧道配HTTP代理:容易因Connection: keep-alive超时断开,且mysql空闲时不会发心跳,隧道极易被中间设备(如NAT网关)静默关闭
mysql客户端连接时必须绕过DNS解析和SSL验证
隧道建立后,你拿到的是一个公网地址(比如0.tcp.ngrok.io:12345),但mysql默认会尝试反向DNS查主机名,而这类动态域名通常没PTR记录,导致连接卡住或报错Host 'xxx' is not allowed to connect。同时,隧道中继节点不提供MySQL证书,ssl-mode=REQUIRED会直接失败。
- 强制跳过DNS:加参数
--skip-name-resolve,或在服务端my.cnf里设skip_name_resolve=ON - 禁用SSL验证:连接时加
--ssl-mode=DISABLED;如果服务端强制SSL(require_secure_transport=ON),得临时关掉它,否则隧道连不上 - 用户权限要按IP通配:授权语句得用
GRANT ... ON *.* TO 'user'@'%',不能写死内网IP,因为客户端看到的是隧道出口IP
防火墙放行≠能连通,检查三处链路状态
即使iptables开了3306、frp日志显示“tunnel started”,仍可能连不上。问题常出在链路中间某一层悄悄丢包或重置连接。
- MariaDB绑定地址:确认
bind-address = 0.0.0.0(不是127.0.0.1),否则只接受本地连接 - 云厂商安全组:除了放行
3306,还得允许隧道中继节点的出口IP段入站(frp需查server_addr,ngrok看文档公布的IP范围) - 运营商级拦截:某些IDC或校园网会深度检测并阻断非标准HTTP流量(如TLS握手后突然传MySQL包),这种情况下换端口(比如映射到
443)比换工具更有效
真正麻烦的从来不是“怎么搭隧道”,而是隧道两端对MySQL协议的理解是否一致、中间网络是否信任这段加密TCP流。一旦出现Lost connection to server during query,先抓包看是SYN被丢、还是TLS层之后的RST,别急着调wait_timeout。










