iptables规则必须先放行再拒绝,否则白名单无效;需清空旧规则、按顺序添加可信IP允许规则、最后加兜底DROP;规则须显式保存(如iptables-save > /etc/sysconfig/iptables),并配合云平台安全组及宿主机网络模式配置。

iptables规则必须放在DROP之前,否则白名单形同虚设
很多人在配置时先写了 iptables -A INPUT -p tcp --dport 3306 -j DROP,再加允许规则,结果所有连接都被拦截。iptables按顺序匹配,一旦命中DROP就终止流程,后面的ACCEPT永远不生效。
正确顺序只能是:先放行可信IP,再统一拒绝其他所有对3306的访问。实操中建议用以下三步走:
- 清空现有3306相关规则(避免冲突):
iptables -D INPUT -p tcp --dport 3306 -j ACCEPT和iptables -D INPUT -p tcp --dport 3306 -j DROP - 逐条添加白名单:
iptables -A INPUT -p tcp --dport 3306 -s 192.168.1.100 -j ACCEPT、iptables -A INPUT -p tcp --dport 3306 -s 10.0.5.0/24 -j ACCEPT - 最后加兜底拒绝:
iptables -A INPUT -p tcp --dport 3306 -j DROP
iptables规则重启后失效,必须显式保存
iptables默认规则不持久,服务器重启后白名单自动消失,数据库立刻暴露——这是生产环境最常踩的坑之一。
不同系统保存方式不同,别凭记忆写错:
- Ubuntu/Debian:
iptables-save > /etc/iptables/rules.v4(确保目录存在且有写权限) - CentOS 6:
service iptables save - CentOS 7+(若用iptables而非firewalld):
iptables-save > /etc/sysconfig/iptables
验证是否生效:重启前执行 iptables -L INPUT -n | grep :3306,重启后再执行一次,输出应完全一致。
云服务器上iptables需配合安全组使用
在阿里云、腾讯云等平台,iptables不是唯一防线。云厂商的安全组(Security Group)在网络更外层生效,如果安全组没放开3306,iptables规则根本收不到包。
所以必须双检查:
- 安全组入方向规则里,已明确添加:源IP为
192.168.1.100、协议TCP、端口3306的允许条目 - iptables本身也配置了对应ACCEPT规则(不能只依赖安全组,防内部横向移动)
- 若使用弹性公网IP,注意安全组限制的是“公网入口IP”,不是你本地电脑的真实出口IP(可能被NAT过)
Docker部署MySQL时,iptables作用对象是宿主机,不是容器
很多人在Docker里跑MySQL,却在容器内装iptables、改规则,完全无效。容器网络流量经过宿主机转发,iptables必须在宿主机上配置。
关键点在于:容器暴露的3306端口,本质是宿主机的端口映射(如 -p 3306:3306),所以iptables规则中的 --dport 3306 指的就是宿主机监听的这个端口。
额外提醒:
- 避免用
-p 0.0.0.0:3306:3306,改用-p 127.0.0.1:3306:3306或绑定内网IP,减少iptables管理范围 - 若容器使用
host网络模式,iptables规则照常生效,但需注意容器进程直接使用宿主网络栈,权限模型变化


















