MySQL必须设bind-address为具体内网IP(如192.168.10.5),禁用0.0.0.0和127.0.0.1;用户host需精确匹配内网段(如'pma'@'192.168.10.%');防火墙须用ufw或firewalld富规则限制源IP,云环境还需同步收紧安全组。
MySQL服务端bind-address必须设为内网IP,不是0.0.0.0
填0.0.0.0等于把mysql暴露给所有网络接口,哪怕防火墙开了白名单,外网扫描到3306端口仍能触发tcp握手,泄露服务指纹。正确做法是查清服务器内网ip(如192.168.10.5),在/etc/mysql/mysql.conf.d/mysqld.cnf的[mysqld]段写:bind-address = 192.168.10.5。改完必须sudo systemctl restart mysql,再用ss -tlnp | grep :3306确认监听地址已更新——输出里应该是192.168.10.5:3306,不是*:3306或0.0.0.0:3306。
MySQL用户host字段必须精确匹配内网段,不能用%通配符
即使bind-address锁死了网卡,如果用户权限是'pma'@'%',攻击者只要拿到密码就能连进来。应按实际内网范围建用户:CREATE USER 'pma'@'192.168.10.%' IDENTIFIED BY 'strong-pass';。注意:192.168.10.%只匹配该C类段,不匹配192.168.11.1;MySQL不支持CIDR写法(如192.168.10.0/24)。执行完GRANT后务必FLUSH PRIVILEGES;,否则权限不生效。
系统防火墙规则要精确放行内网IP段的3306端口
ufw、firewalld或iptables都只放行3306端口不够,必须限制来源IP。例如用ufw:sudo ufw allow from 192.168.10.0/24 to any port 3306;用firewalld:sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="192.168.10.0/24" port port="3306" protocol="tcp" accept'。别忘了sudo ufw reload或sudo firewall-cmd --reload。云服务器还要检查安全组,只允许内网段访问3306——很多故障是安全组没关导致的。
phpMyAdmin配置里host别写localhost,必须写127.0.0.1
如果远程数据库在另一台机器上,$cfg['Servers'][$i]['host']填localhost会让phpMyAdmin走Unix socket连接本机MySQL,根本连不到目标库。必须填目标数据库的真实内网IP(如192.168.10.10)或127.0.0.1(仅当SSH隧道已建立且映射到本地端口时)。同时确认$cfg['Servers'][$i]['port']与目标MySQL实际端口一致(默认3306,但有些环境用3307或3308)。
bind-address、用户表里的host值、防火墙的源IP白名单——三者任意一个写宽了,内网隔离就形同虚设。



















