Firewalld批量导入策略需通过文件集中管理并重载生效:一、将自定义服务XML文件放入/etc/firewalld/services/后--reload;二、富规则可用循环添加或写入zone XML;三、区域策略支持批量服务/接口/端口配置;四、direct.xml支持底层iptables规则批量注入。

在 Firewalld 中批量导入自定义防火墙策略,核心是通过文件方式集中管理服务定义、富规则和区域配置,再统一重载生效。不推荐逐条执行 firewall-cmd 命令,那样既难维护又易出错。
一、批量导入自定义服务(.xml 文件)
Firewalld 的服务策略以 XML 文件形式存在,批量导入即把多个服务定义文件放入指定目录并重载:
- 将自定义服务文件(如
redis.xml、myapp.xml)统一存放到/etc/firewalld/services/目录下(优先级高于系统默认目录/usr/lib/firewalld/services/) - 每个文件需符合标准 XML 格式,例如
redis.xml:<service> <short>Redis</short> <description>Redis database server</description> <port protocol="tcp" port="6379"/> </service>
- 全部放好后执行:
firewall-cmd --reload,所有新服务立即可用 - 验证是否加载成功:
firewall-cmd --get-services | grep -E "(redis|myapp)"
二、批量添加富规则(rich rules)
富规则不适合单条命令反复执行,推荐用 --add-rich-rule 配合 shell 循环,或直接写入永久配置文件:
- 方法1:用 for 循环批量添加(临时+永久):
for rule in \ 'rule family="ipv4" source address="192.168.10.0/24" service name="ssh" accept' \ 'rule family="ipv4" source address="10.0.5.0/24" port port="3306" protocol="tcp" accept' \ 'rule family="ipv4" source address="203.0.113.100" reject'; do firewall-cmd --permanent --add-rich-rule="$rule" done firewall-cmd --reload - 方法2:将所有富规则写入
/etc/firewalld/zones/public.xml(或其他目标 zone 文件)的<rich_rules></rich_rules>区块内,再--reload—— 这种方式更利于版本控制和审计
三、批量配置区域策略(含接口绑定与服务开放)
可借助脚本一次性完成 zone 设置、接口归属、服务启用等组合操作:
- 示例:为 internal 区域批量启用常用服务并绑定多张网卡:
firewall-cmd --permanent --zone=internal --add-service={ssh,http,https,dns,samba} firewall-cmd --permanent --zone=internal --add-interface={ens33,ens34,br0} firewall-cmd --permanent --zone=internal --add-port=9000-9010/tcp firewall-cmd --reload - 注意:
{ssh,http,https}是 bash 的 brace expansion 语法,实际执行时会自动展开为多条命令 - 若需跨多个 zone 批量操作,可配合
for z in internal dmz; do ...; done循环
四、使用 firewalld 的直接规则(Direct Rules)批量注入
当需要底层 iptables 级别控制(如自定义链、mangle 操作),可通过 direct rules 批量导入:
- 编辑
/etc/firewalld/direct.xml,在<direct></direct>标签下添加多条<rule></rule>或<passthrough></passthrough>条目 - 例如插入两条 raw 表规则:
<rule priority="1" table="raw" chain="PREROUTING">-i eth0 -j CT --notrack</rule> <rule priority="2" table="raw" chain="OUTPUT">-o eth0 -j CT --notrack</rule>
- 保存后运行
firewall-cmd --reload即可批量生效


















