商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 系统应用 > 如何在Linux中配置具体的系统级防火墙动态黑名单同步及更新任务

如何在Linux中配置具体的系统级防火墙动态黑名单同步及更新任务

  发布于2026-07-13 阅读(0)

扫一扫,手机访问

firewalld的动态黑名单看似简单,但稍不留神就会掉坑里。比如临时规则不持久、批量封禁效率低下、规则写入后实际未生效——这些问题在线上环境里碰到哪个都够头疼的。先把几个核心判断摆出来:用rich rule做黑名单必须加--permanent并执行--reload,否则重载后规则直接蒸发;rejectdrop各有用途,调试用reject、静默丢弃用drop;至于大批量封IP,别用循环调firewall-cmd,用--direct直写iptables性能更稳。

如何在Linux中配置具体的系统级防火墙动态黑名单同步及更新任务

firewalld 用 rich rule 做动态 IP 黑名单,必须加 --permanent

很多人测试时用--add-rich-rule不跟--permanent,看着规则生效了,结果firewall-cmd --reload一跑,规则全没了,还以为是脚本配置错了。临时规则根本扛不住重载,用它来做黑名单等于白忙活。

正确写法必须加上--permanent,然后一定记得执行firewall-cmd --reload,规则才能真正落地:

sudo firewall-cmd --permanent --add-rich-rule='rule family="ipv4" source address="203.0.113.44" reject'
sudo firewall-cmd --reload
  • reject会让客户端收到明确的拒绝响应(比如Connection refused),调试时特别方便;生产环境想静默丢弃,换成drop就行
  • 同一个IP重复添加不会报错,但也不会叠加——firewalld不允许重复规则,第二次执行要么提示ERROR: timeout,要么静默忽略
  • 删除规则时必须把字符串一字不差地写出来,包括引号和空格,用--remove-rich-rulesource addressreject的顺序不能搞反

黑名单批量更新要避免逐条调用 firewall-cmd

直接在shell循环里反复调firewall-cmd,每条规则都要走一遍D-Bus通信和规则链重编译——100个IP下来,卡住或超时几乎是必然的。线上环境必须合并操作。

推荐的思路是:先收集所有待封IP,生成临时规则文件,然后用--direct批量注入内核链:

sudo firewall-cmd --direct --add-rule ipv4 filter INPUT 0 -s 203.0.113.44 -j REJECT
sudo firewall-cmd --direct --add-rule ipv4 filter INPUT 0 -s 192.168.5.101 -j REJECT
  • --direct绕过firewalld的抽象层,直写iptables,性能高、没有额外延迟,适合高频封禁场景
  • 规则插入位置的数字(比如0)控制优先级,数字越小越靠前,确保黑名单在白名单之前生效
  • 这种规则默认不持久,重启firewalld或系统后丢失,需要配合firewall-cmd --runtime-to-permanent或者手动保存到/etc/firewalld/direct.xml

同步任务必须校验规则是否真实生效

不少自动化脚本只盯着“命令返回0”就算成功,结果规则压根没进链表。常见翻车原因包括:zone绑错了网卡、rich rule被其他规则覆盖、firewalld服务没跑起来。

校验不能只看firewall-cmd --list-all,得去查底层链:

  • 先确认当前活跃zone:firewall-cmd --get-active-zones,确保目标IP落在你操作的zone(比如public)里面
  • 查看rich rule是否写入:firewall-cmd --zone=public --list-rich-rules
  • 查底层iptables是否命中:sudo iptables -L INPUT -n -v | grep 203.0.113.44
  • 模拟测试最简单:从被封IP的机器上跑curl -v http://your-server:80,应该能看到Connection refused或直接超时

CentOS 7 上持久化黑名单要特别注意 service 状态

CentOS 7.9已经在2024年6月停服了,但不少旧系统还在跑。它的firewalld默认开启,可有些镜像预装了iptables-services并设为开机启动,结果firewalld直接被屏蔽——你往firewalld里加的规则根本不起作用。

检查修复的步骤:

  • 确认当前谁是真正在跑的服务:systemctl is-active firewalldsystemctl is-active iptables只能有一个是active (running)
  • 如果iptables在跑,把它停掉:sudo systemctl stop iptables && sudo systemctl disable iptables
  • 启用firewalld:sudo systemctl enable --now firewalld
  • 验证:firewall-cmd --state必须输出running,而且iptables -L的输出里不应该出现你手动加的DROP规则

规则持久化本身没什么问题,但旧系统里服务冲突比想象中更常见。不先检查清楚就写脚本,等于往空配置里填数据——白费力气。

本文转载于:https://www.php.cn/faq/2812866.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注