Linux 防火墙策略优化实践

2次阅读

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

Linux 防火墙策略优化实践

iptables 规则顺序为什么总不生效

规则顺序决定匹配优先级,iptables 从上到下逐条匹配,一旦命中就执行动作并停止遍历。很多人加了 ACCEPT 规则却仍被拒绝,其实是它被插在了已有 DROPREJECT 规则后面。

  • iptables -L --line-numbers 查看当前规则序号,确认新规则位置
  • 插入规则必须用 -I(不是 -A),例如 iptables -I input 1 -p tcp --dport 22 -j ACCEPT 插到最前面
  • 删除某条规则用行号: iptables -D INPUT 3 删除 INPUT 链第 3 条
  • 修改后记得保存:ubuntu/debianiptables-save > /etc/iptables/rules.v4centos 7+ 用 service iptables save(需启用 iptables-services

ufw 和 iptables 能不能混着用

能,但非常危险。ufw 是 iptables 的封装,启动时会清空原有规则并写入自己的链结构。如果你手动改了 iptables,再执行 ufw reload 或重启 ufw 服务,所有手写规则都会消失。

  • 要么纯用 ufw(适合常规端口开关、IP 限速等场景),配置写在 /etc/ufw/
  • 要么停掉 ufwufw disable),完全自己管 iptables,并禁用 ufw 开机自启
  • 混合使用的唯一安全方式:把自定义规则写进 /etc/ufw/before.rulesafter.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 看原始链路,才能定位到真实拦截点。

text=ZqhQzanResources