CentOS封端口后仍被扫描?iptables规则顺序排查
CentOS封端口后仍被扫描?iptables规则顺序排查

日志里又冒出陌生IP在扫你刚封掉的3306?别急着骂防火墙罢工,九成情况是iptables规则顺序被后来者插队。把DROP写在ALLOW后面,就像先给人钥匙再告诉他“别进来”,扫描包当然照进不误。下面按真实踩坑路线走一遍,保证看完就能动手验证。
先确认“封”到底写进去没
很多人复制完命令就关终端,结果规则还在内存里漂着。敲iptables -L -n --line-numbers,如果没看到对应DROP,说明没保存。CentOS7/8用iptables-save > /etc/sysconfig/iptables,重启再读一遍,别让临时规则骗了你。
顺序决定生死:谁在前谁说了算
iptables按链表从上到下匹配,一旦命中就跳出。假设你:
1 ACCEPT tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:3306
2 DROP tcp -- 0.0.0.0/0 0.0.0.0/0 tcp dpt:3306
第二条永远吃灰。想封死,就把DROP插到最前:
iptables -I INPUT 1 -p tcp --dport 3306 -j DROP
再iptables-save一次,别让重启把顺序打回原形。
被“ESTABLISHED”放行的幽灵连接
很多教程先写一句:
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
这条如果放在最末,新连接会被DROP,但已建立的会话照样通信,于是你以为“封了”,其实人家早连上。解决方式:把状态放行写在最前,业务端口规则紧跟其后,DROP垫底,逻辑就顺了。
IPv6别当透明人
只封了iptables,却忘了ip6tables,扫描者换IPv6地址继续敲门。对称操作来一遍:
ip6tables -I INPUT 1 -p tcp --dport 3306 -j DROP
双栈都闭嘴,世界才清净。
云主机还要防“后台放行”
阿里云、腾讯云、AWS都有安全组,控制台里若开着3306,机器内部再DROP也挡不住,流量在云底层就放过来了。先去网页关端口,再回来调iptables,两边一致才有效。
用计数器验证规则是否命中
iptables -L -n -v看pkts列,DROP行数字不动说明没匹配到,要么顺序错,要么网卡走法不一样。把规则挪到最前再测,数字蹭蹭涨就说明拦实了。
一键脚本:检查+修复+持久化
#!/bin/bash
PORT=${1:-3306}
ipset create scan_ban hash:ip maxelem 100000 2>/dev/null
先插DROP
iptables -I INPUT 1 -p tcp --dport $PORT -m set --match-set scan_ban src -j DROP
iptables -I INPUT 2 -p tcp --dport $PORT -j DROP
再保存
iptables-save > /etc/sysconfig/iptables
ip6tables-save > /etc/sysconfig/ip6tables
systemctl enable iptables ip6tables
跑完脚本再telnet 公网IP 3306,直接超时才算成功。
常见搜索问法一次答完
“CentOS端口已关闭nmap还能扫到”——多半是顺序错或安全组没关。
“iptables DROP不生效”——先看是否插错位置,再看IPv6。
“firewalld与iptables混用”——CentOS7默认firewalld,如果你手动装iptables,记得禁用firewalld,两套规则叠一起,谁都看不懂。
把上面步骤按顺序踩一遍,日志里再出现扫描,包量计数器纹丝不动,你就可以安心喝茶了。


