mysql默认只监听127.0.0.1,需修改bind-address为内网ip(如192.168.1.100)或0.0.0.0并重启服务,再配置系统防火墙、云安全组及mysql用户host权限,四层协同方可实现安全内网访问。

直接写内网IP(比如 192.168.1.100)连不上,大概率不是防火墙没开,而是 MySQL 服务压根没监听那个地址,或者系统级防火墙/云平台安全组双重拦截。先别急着配防火墙,得一层层确认通路是否真正打通。
MySQL 服务必须监听内网IP
默认安装的 MySQL(尤其是 MariaDB 或较新版本)通常只绑定 127.0.0.1,也就是只接受本地连接。你要它响应内网请求,得改配置:
- 编辑 MySQL 配置文件,常见路径:
/etc/mysql/mysqld.cnf(Ubuntu/Debian)或/etc/my.cnf(CentOS/RHEL) - 找到
bind-address行,把它改成:bind-address = 0.0.0.0(监听所有接口)
或更安全的:bind-address = 192.168.1.100(仅指定内网IP) - 保存后重启 MySQL:
sudo systemctl restart mysql或sudo service mariadb restart - 验证是否生效:运行
sudo ss -tlnp | grep :3306,看 LISTEN 地址是不是你设的 IP,而不是只有127.0.0.1:3306
系统防火墙要放行 3306 端口
Linux 自带的 ufw 或 firewalld 默认会拦外部访问,必须显式放行:
- Ubuntu/Debian(ufw):
sudo ufw allow from 192.168.1.50 to any port 3306(只允许某台客户端)
或宽泛点:sudo ufw allow 3306 - CentOS/RHEL(firewalld):
sudo firewall-cmd --permanent --add-port=3306/tcpsudo firewall-cmd --reload - 注意:不要只开
3306就完事,还得确认规则是针对入站(inbound)且生效中,用sudo ufw status verbose或sudo firewall-cmd --list-all检查
云服务器或虚拟化平台有额外安全组
如果你用的是阿里云、腾讯云、AWS、DigitalOcean 或 VMware 等环境,系统防火墙只是其中一环,上面还有「安全组」或「网络ACL」:
- 登录控制台,找到对应云服务器实例的安全组设置
- 添加一条入站规则:
协议类型:TCP
端口范围:3306
源IP:填具体内网IP(如192.168.1.50/32),或最小范围的 CIDR(如192.168.1.0/24) - 保存后,规则通常秒级生效,但有些平台需要重启实例才加载新规则(少见,但别忽略)
CI4 的 .env 配置要匹配且无空格
确认 CodeIgniter4 的数据库配置没低级错误:
-
database.default.hostname = "192.168.1.100"—— 用双引号包住,不能有前后空格 -
database.default.port = 3306—— 显式写上端口,避免依赖默认值 - 用户名密码必须是已在 MySQL 中创建、且授权给该 IP 的用户(例如:
CREATE USER 'ci4user'@'192.168.1.50' IDENTIFIED BY 'pass123';) - 别忘了授权:
GRANT ALL PRIVILEGES ON yourdb.* TO 'ci4user'@'192.168.1.50'; FLUSH PRIVILEGES;











