iptables规则按顺序匹配,先命中先执行;插入accept规则需用-i指定位置,避免被drop规则拦截;ufw与iptables混用危险,应选其一或通过before/after.rules集成;封ip推荐ipset提升性能。

iptables 规则顺序为什么总不生效
规则顺序决定匹配优先级,iptables 从上到下逐条匹配,一旦命中就执行动作并停止遍历。很多人加了 ACCEPT 规则却仍被拒绝,其实是它被插在了已有 DROP 或 REJECT 规则后面。
- 用
iptables -L --line-numbers查看当前规则序号,确认新规则位置 - 插入规则必须用
-I(不是-A),例如iptables -I INPUT 1 -p tcp --dport 22 -j ACCEPT插到最前面 - 删除某条规则用行号:
iptables -D INPUT 3删除 INPUT 链第 3 条 - 修改后记得保存:Ubuntu/Debian 用
iptables-save > /etc/iptables/rules.v4,CentOS 7+ 用service iptables save(需启用iptables-services)
ufw 和 iptables 能不能混着用
能,但非常危险。ufw 是 iptables 的封装,启动时会清空原有规则并写入自己的链结构。如果你手动改了 iptables,再执行 ufw reload 或重启 ufw 服务,所有手写规则都会消失。
- 要么纯用
ufw(适合常规端口开关、IP 限速等场景),配置写在/etc/ufw/下 - 要么停掉
ufw(ufw disable),完全自己管iptables,并禁用 ufw 开机自启 - 混合使用的唯一安全方式:把自定义规则写进
/etc/ufw/before.rules或after.rules,让 ufw 加载时一并载入 - 验证是否冲突:运行
ufw status verbose后再对比iptables -S输出,看是否有重复或覆盖
如何快速封掉扫描 IP 而不拖慢连接
直接用 iptables -A INPUT -s 192.168.1.100 -j DROP 可以封,但面对成百上千个扫描源时,规则膨胀会导致匹配变慢,尤其在高并发连接下影响明显。
- 优先用
ipset:先创建集合ipset create blacklist hash:ip,再用ipset add blacklist 192.168.1.100批量管理 - iptables 引用集合:
iptables -A INPUT -m set --match-set blacklist src -j DROP,无论集合里有多少 IP,匹配性能几乎不变 - 自动封禁建议配合
fail2ban,但注意它的默认 action 是调用iptables命令,要改成调用ipset才高效;修改/etc/fail2ban/action.d/iptables.conf中的actionban行 - 封禁后别忘了持久化:用
ipset save > /etc/ipset.conf并在开机脚本里ipset restore
firewalld 的 zone 切换为什么没效果
firewalld 默认使用 public zone,但如果你执行了 firewall-cmd --set-default-zone=trusted 却发现某些接口还是走 public,大概率是网卡没绑定到新 zone,或者服务没重载。
- 查接口绑定:
firewall-cmd --get-active-zones,确认对应网卡出现在目标 zone 下 - 绑定接口:
firewall-cmd --zone=trusted --change-interface=eth0 --permanent,注意加--permanent才能持久 - zone 内规则变更后必须
firewall-cmd --reload,而不是--restart(后者会断连接) - 如果用了 NetworkManager,它可能覆盖 firewalld 的 zone 设置;检查
nmcli dev show eth0 | grep ZONE,必要时在/etc/sysconfig/network-scripts/ifcfg-eth0里加ZONE=trusted
真正麻烦的不是写对一条规则,而是当多个工具(ufw、firewalld、systemd-networkd、云平台安全组)同时参与流量控制时,谁在最后起效、谁会覆盖谁——这种叠加态下的调试,往往得靠 tcpdump 抓包 + iptables -t raw -L -v 看原始链路,才能定位到真实拦截点。










