富规则必须用于需精细化控制的场景,如限定源ip、多条件组合、限速日志、出入方向区分或drop/reject动作;其结构为带引号xml字符串,须显式声明family、source/destination配对、limit须与log或action共存,且所有内容在同一引号内;生效需三步:加--permanent、执行--reload、用对应命令验证列表。

firewalld 富规则(rich rule)不是日常配置的“默认选项”,而是当基础服务或端口规则力不从心时才启用的精细控制手段。比如要按源IP+时间+限速+日志组合拦截、只放行某网段的HTTPS但拒绝其他所有流量、或阻止本机访问某个恶意IP——这些都绕不开富规则。
什么情况下必须用富规则
基础命令如 firewall-cmd --add-service=ssh 或 --add-port=80/tcp 只能做“全开”或“全关”式控制。一旦需求带上以下任一条件,就得写富规则:
- 限定特定源IP或网段(如
source address="192.168.10.5") - 同时匹配多个条件(如“SSH + 某IP + 每分钟最多3次”)
- 需要限速(
limit value="3/m")且带日志 - 区分出入方向:限制本机访问某IP(出口规则),或限制外部访问本机服务(入口规则)
- 要求静默丢弃(
drop)或主动拒绝(reject)并返回ICMP提示
一条可用的富规则怎么写
富规则本质是一条带引号的字符串,结构固定、参数顺序不敏感,但必须完整表达条件与动作。关键点:
-
family 必须显式声明:哪怕只用 IPv4,也要写
family="ipv4";混用 IPv6 地址却不声明 family 会导致规则静默失效 -
source/destination 要配对明确:入口规则重点写
source,出口规则重点写destination -
limit 必须和 log 或 action 同时出现:单独写
limit value="10/s"不生效;正确写法是limit value="10/s" log prefix="xxx" accept -
所有内容写在同一引号内:不能拆成多条
--add-rich-rule命令,否则后一条会覆盖前一条
示例(阻止本机访问 198.51.100.22):
PyCharm 2026.2.0.1 Linux版提供 JetBrains 官方 2026.2.0.1 版本安装包,适合需要指定 PyCharm 版本进行 Python 项目开发、运行和调试的用户。
sudo firewall-cmd --permanent --zone=public --add-rich-rule='rule family="ipv4" destination address="198.51.100.22" drop'
让规则真正生效的三步操作
富规则容易“看似添加成功,实则没起作用”,关键在三个环节:
- 加 --permanent 才存盘:不加该参数,重启后规则消失
-
必须 reload 才加载:执行
firewall-cmd --reload,否则规则只躺在配置文件里,不在内存中运行 -
查规则要用对命令:
--list-all不显示富规则细节;应分别运行:firewall-cmd --permanent --list-rich-rules(看是否已保存)firewall-cmd --list-rich-rules(看是否已加载)
两者输出一致,才算真正就位
调试与排错常用方法
规则不生效?先确认日志和状态:
- 查 firewalld 服务日志:
sudo journalctl -u firewalld -n 50 --no-pager,留意是否有Invalid argument或语法错误提示 - 检查 prefix 是否含空格或特殊字符:日志前缀如
prefix="web-block-"合法,prefix="web block"会报错 - 验证 zone 是否匹配:规则加在
public区域,但网卡实际属于internal,那规则就不生效;用firewall-cmd --get-active-zones确认接口归属 - 测试时可先省略
--permanent,用--timeout=300设置5分钟临时规则,验证无误再固化










