在服务器上装好宝塔面板后,很多项目需要让另一台机器上的程序或者本地电脑的数据库工具连过来。宝塔自带的安全组和软件防火墙、MySQL自身的访问权限是三道独立关卡,任何一层没开都会连不上。下面按真实环境把配置过程拆开讲。
一、在宝塔面板中放行数据库端口
宝塔面板自己带了一个防火墙模块,它管的是系统层的iptables或firewalld规则。即便你在云厂商那里开了端口,如果面板防火墙把3306给拒了,照样不通。进入宝塔后台,点击左侧“安全”,在“端口规则”里添加一条:端口填3306,协议TCP,备注写MySQL远程,策略允许。保存后规则立即生效。
需要注意的是,有些人在这里只看到SSH的22端口,以为数据库默认开放,其实MySQL安装后监听在127.0.0.1时,宝塔并不会自动加放行。你可以到“软件商店”找到已安装的MySQL,点“设置”里面的“性能调整”,确认监听地址不是强制绑定内网才放心。如果监听是127.0.0.1,远程包根本进不了MySQL进程。
1.1 检查监听地址
在服务器命令行执行以下命令,看MySQL绑定到哪个IP:
netstat -tunlp | grep 3306 # 若显示 127.0.0.1:3306 说明只本地 # 若显示 0.0.0.0:3306 或 :::3306 则可接受外部
如果绑定到本地,要修改MySQL配置文件。宝塔的配置文件一般在 /www/server/mysql/my.cnf 或 /etc/my.cnf,把 bind-address=127.0.0.1 改成 bind-address=0.0.0.0 然后重启数据库。改之前建议先备份原文件。
二、云服务器安全组入站放行
这是最容易漏的一步。宝塔防火墙只管机器内部,云厂商的安全组是外部网络的第一道闸。以常见云为例,登录控制台,找到对应实例的安全组,添加入站规则:协议TCP,端口3306,授权对象填你想放行的IP。如果是临时测试,可填 0.0.0.0/0 表示全部放行,但生产环境绝不建议。
安全组和宝塔防火墙是“与”的关系,两边都要允许才通。很多人改完面板发现还是连不上,用 telnet 你的服务器IP 3306 测试超时,八成就是安全组没配。配置后通常秒级生效,不需要重启实例。
| 层级 | 位置 | 作用 |
|---|---|---|
| 云安全组 | 厂商控制台 | 控制外部流量能否到达网卡 |
| 系统防火墙 | 宝塔安全页 | 控制本机iptables规则 |
| MySQL权限 | 数据库内用户host | 控制账号能从哪台机器登录 |
三、数据库用户权限授权
端口通了只是网络通,MySQL还会校验你用的账号是否允许从远程IP连。默认安装的root@localhost只能本机登。我们要么新建一个远程用户,要么改root的host。
3.1 新建专用远程账号
进宝塔“数据库”页面,点“添加数据库”,设好名称和密码,这时候建的用户默认也是本地。我们到“phpMyAdmin”或用SSH进MySQL命令行授权:
-- 创建允许从任意IP连接的用户 CREATE USER 'remote_user'@'%' IDENTIFIED BY '你的强密码'; -- 授予某库全部权限 GRANT ALL PRIVILEGES ON your_db.* TO 'remote_user'@'%'; FLUSH PRIVILEGES;
上面的 % 代表所有IP。如果只想给固定IP,比如办公网络 1.2.3.4,就把 % 换成 '1.2.3.4'。这样即使别人扫到端口,没有这个IP也登不进来,安全性更好。
3.2 修改已有账号host
如果不想新建用户,也可以直接改表:
USE mysql; UPDATE user SET host='%' WHERE user='root'; FLUSH PRIVILEGES;
不过把root放开到全网风险很高,推荐只给特定IP或者新建低权限账号。改完可以用本地Navicat填服务器公网IP、3306、刚设的账号密码测试,能进说明三层都通了。
四、常见故障与排查顺序
连不上时按下面顺序查:先用 telnet IP 3306 看网络层;通了再看MySQL错误提示,如果是 access denied 就是权限host不对;如果是 timeout 就是安全组或面板防火墙没开。不要一上来就改配置文件,容易把监听搞错。
另外宝塔有时候装了Fail2Ban这类防爆破插件,多次输错会封IP,远程调试时若被ban,要在面板里解封。整体来说,只要安全组、面板端口、MySQL用户host三处对齐,宝塔下的数据库远程连接就能稳定跑起来。