🎬 配套视频教程
点击观看:Debian宝塔MySQL外网连接排坑完整实操视频踩坑实录:阿里云、腾讯云 Debian 宝塔部署 MySQL,外网 Navicat 连不上的完整排坑经验
最近先后在阿里云、腾讯云两台 Debian 系统的云服务器上,用宝塔搭建 MySQL 服务,两次都碰到一模一样的奇葩问题:宝塔里已经放开数据库远程权限、云厂商控制台安全组也提前放行 3306 端口,但本地电脑用 Navicat 就是死活连接不上。一开始我反复核对账号密码、数据库权限、安全组规则,折腾很久都找不到问题,最后求助阿里云工程师,他给了一套标准化排查流程,我按步骤操作直接定位根源;后面腾讯云机器复现同款故障,照搬这套流程顺利解决,这里把完整真实操作、踩坑心路整理出来,完全是我自己实操记录,给大家避坑。
一、我最初的错误认知,反复踩坑的前置操作
之前一直想当然认为:云服务器外网访问端口,只要云控制台的安全组放通对应端口就万事大吉。拿 MySQL 的 3306 端口举例,两台服务器我都提前做完这几步:
宝塔面板新建数据库用户,把访问权限改成所有人可访问(%),不是仅本地localhost;
登录阿里云 / 腾讯云后台,进入实例安全组,添加入站规则开放 TCP 3306;
服务器本地登录 MySQL 测试,数据库服务正常运行,本地访问完全没问题。
全部配置做完打开 Navicat 填公网 IP、账号密码连接,结果全是超时失败。来回核对几十遍配置,甚至重装 MySQL 都没用,当时特别疑惑,难道阿里云有什么隐藏拦截机制?找官方工程师反馈问题后,他没有直接给解决方案,而是发了 3 条排查命令,让我一条一条执行,把返回结果发给他分析。
二、阿里云工程师提供的 3 步排查命令(我完整实操流程,无多余 iptables 操作)
工程师原文让我依次执行 3 条命令收集服务器状态,分别检查端口监听、防火墙类型、UFW 放行规则,没有让我执行iptables -nvL这条,实操全程我也没用到这条,这里还原真实操作过程:
1. 第一条:检查 MySQL 是否正常监听 3306 端口
运行以下命令:
netstat -ano | grep 3306
执行返回:tcp6 0 0 :::3306 :::* LISTEN
看到这个结果就能确定两点:MySQL 服务正常启动,同时监听服务器所有 IPv4、IPv6 地址,数据库本身配置、服务启停没有任何问题,连接失败和 MySQL 本身无关,问题出在网络拦截层面。
2. 第二条:确认服务器用的是什么防火墙
运行以下命令:
systemctl status firewalld
执行提示:Unit firewalld.service could not be found.
我之前长期用 CentOS 服务器,习惯 firewalld 防火墙,但 Debian 系统默认不带 firewalld,原生用 UFW 管理系统防火墙,这条命令直接排除 firewalld 拦截流量的可能性,锁定排查目标就是 UFW。
3. 第三条:查看 UFW 防火墙已经放行的端口(本次故障核心卡点)
运行以下命令:
ufw status
执行后清晰看到:UFW 防火墙是 active 开启状态,已经放行 21、22、80、443、FTP 被动端口段等日常使用端口,唯独没有 3306 端口放行规则。
这里讲清楚两层防火墙逻辑,也是我踩坑的关键:
云服务器存在两道独立防火墙,一层是阿里云 / 腾讯云控制台的云厂商安全组,管控外网流量能不能抵达服务器;另一层是服务器系统内部的 UFW 防火墙,管控流量进入系统后能不能抵达对应程序。
我只在云后台放行 3306,外网流量能进到服务器网卡,但系统内部 UFW 默认拒绝所有没手动添加放行的端口,3306 不在白名单里,流量直接被系统丢弃,MySQL 永远收不到 Navicat 的连接请求,自然一直连接超时。
补充说明:工程师没要求我执行iptables -nvL,是因为 UFW 本身就是 iptables 的简化可视化工具,普通用户只需要通过ufw status查看放行规则就足够定位问题,底层 iptables 属于内核底层规则,日常排错完全不需要手动查看,新手不用接触复杂的 iptables 命令。
三、一键修复操作,两台云服务器通用
工程师告知,只需要一条命令在 UFW 放行 3306 端口即可解决拦截问题,直接复制执行:
ufw allow 3306/tcp
执行成功会提示两条规则新增完成,自动适配 IPv4 和 IPv6 协议。
再次执行ufw status刷新查看,列表里多出3306/tcp放行条目,此时再打开 Navicat 连接阿里云服务器,直接连通成功。
后续腾讯云 Debian 服务器出现完全一样的故障,我直接照搬这套排查流程:先 netstat 确认端口监听、排除 firewalld、查看 ufw 缺少 3306 放行,执行放行命令后,再核对腾讯云安全组 3306 端口已放开,数据库远程权限为 %,顺利完成连接。
四、必须留意的兜底校验点,放行端口后依旧连不上再排查
云厂商安全组一定要同步放行 3306
只放行服务器内部 UFW 不够,阿里云、腾讯云的安全组是独立外层防护,两个地方都要添加 TCP 3306 入站规则,临时测试可以放通 0.0.0.0/0,长期使用建议只放行自己本地公网 IP 更安全。
MySQL 用户远程权限不能是localhost
宝塔数据库用户访问权限必须设置为所有人 %,如果仅允许本地访问,就算端口全放行,外部客户端依旧登录失败。
延伸踩坑:FTP 同类故障思路通用
之前我还遇到 FTP 登录成功,但无法读取服务器目录的报错,原理和本次 MySQL 问题高度相似:除 21 控制端口外,UFW、安全组都要放行 FTP 被动端口段 39000:40000,同时 FTP 配置强制绑定服务器公网 IP,避免服务返回内网 IP 导致客户端无法建立数据通道。
五、个人实操总结,后续运维避坑心得
连续在阿里云、腾讯云两台 Debian 机器踩同一个坑,让我整理出一套稳定端口连通排查顺序:
1. 检查程序端口是否全网监听(netstat)
2. 判断服务器使用哪种系统防火墙(firewalld/UFW)
3. 查看系统防火墙放行端口,缺失端口直接放行
4. 核对云厂商控制台安全组端口规则
5. 最后校验应用自身远程访问权限
以前部署服务只记得配置云安全组,完全忽略 Debian 自带的 UFW 防火墙,白白浪费大量排错时间。现在新服务器开放外网端口,我都会同步在 UFW 放行对应端口,两层防火墙同步配置,能直接避开 90% 的外网端口连接失败问题。