MySQL连接失败主因是防火墙未放行或规则冲突,需同步检查bind-address、iptables/nftables、云安全组、conntrack超时及SELinux/AppArmor五层配置。
MySQL 默认端口被扫描或连接拒绝怎么办
直接开
端口对外等于把锁孔焊死前先递钥匙。绝大多数生产环境的 MySQL 连接失败,不是配置错,是防火墙根本没放行或规则写反了。
Linux 上用
或
控制流量,Windows 用系统防火墙,云服务器还得过安全组这一关——三者不一致,就必然出问题。
检查当前监听状态:
,确认 MySQL 确实在跑且绑定的是
还是
只允许特定 IP 访问时,
规则必须写在
链开头(靠前优先),否则可能被后面的
拦住
云平台(如阿里云、腾讯云)的安全组默认拒绝所有入向流量,
必须显式添加,且源 IP 建议用最小范围(比如
),别写
MySQL 绑定地址和防火墙规则怎么配才不冲突
常见错误是 MySQL
设成
,但防火墙却放开
给外网——结果就是“端口通了,连不上”。两者必须对齐。
中的
决定 MySQL 听谁,防火墙决定谁有资格敲门。听
就只能本地连;听
才可能被远程连,但此时防火墙必须同步放行对应来源。
本地开发:设
,防火墙可完全关闭
入向规则
内网服务(如 PHP 应用在同一局域网):设
或
,防火墙加
绝对禁止
+ 安全组开放
,这是线上最常被爆破的组合
连接超时或被重置?可能是防火墙的连接跟踪机制在作怪
MySQL 空闲连接常被防火墙的 conntrack 表踢掉,现象是客户端突然报
或
,但 MySQL 日志里查不到异常。
MySQL(Linux)
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
下载
Linux 默认的连接跟踪超时很短(如 TCP established 状态仅 5 天,但某些发行版或云主机内核会调得更激进),而 MySQL 的
和
又比它长,就会出现“MySQL 还以为连着,防火墙早删了连接记录”的错位。
查当前 conntrack 超时值:
临时调大(比如设为 86400 秒):
永久生效需写入
,且注意重启后是否被云厂商的 init 脚本覆盖
更稳妥的做法是客户端加连接池并启用
或
(JDBC)等保活机制,别全指望防火墙
SELinux 或 AppArmor 开启时,MySQL 连不上防火墙也放行了?
CentOS/RHEL 的 SELinux 或 Ubuntu 的 AppArmor 是独立于 iptables 的访问控制层,哪怕端口通、bind 地址对、用户密码都正确,也可能被拦截,错误日志通常出现在
或
输出里,关键词是
。
这类问题不会报 MySQL 错误,也不会显示在
里,排查路径容易断掉。
临时关闭 SELinux 测试:
(别改
文件,避免重启失效)
查看是否是 SELinux 拦截:
放行网络连接:
AppArmor 用户检查
是否包含
这一行
MySQL 的端口防护从来不是单点配置的事,bind-address、防火墙规则、云安全组、内核连接跟踪、强制访问控制——任意一层拧巴了,都会表现为“连不上”。最容易被跳过的其实是 SELinux/AppArmor 和 conntrack 超时,而不是 iptables 本身。
3306iptablesnftablesnetstat -tlnp | grep :3306127.0.0.10.0.0.0iptablesINPUTDROP3306192.168.1.100/320.0.0.0/0bind-address127.0.0.13306my.cnfbind-address127.0.0.10.0.0.0bind-address = 127.0.0.13306bind-address = 192.168.1.0/240.0.0.0-s 192.168.1.0/24 -p tcp --dport 3306 -j ACCEPTbind-address = 0.0.0.00.0.0.0/0Lost connection to MySQL server during queryConnection reset by peerwait_timeoutinteractive_timeoutsysctl net.netfilter.nf_conntrack_tcp_timeout_establishedsysctl -w net.netfilter.nf_conntrack_tcp_timeout_established=86400/etc/sysctl.confpingautoReconnect=true/var/log/audit/audit.logdmesgavc: deniediptables -Lsetenforce 0configausearch -m avc -ts recent | grep mysqldsetsebool -P mysqld_can_network_connect 1/etc/apparmor.d/usr.sbin.mysqldnetwork inet stream,