CentOS 7 里的“默认拦截规则”,其实并不是某一条孤立的规则在起作用,而是 firewalld 的 default_zone(比如 public)和它对应的 target(默认是 default)一起决定的:明确加入白名单的服务和端口会被放行,没被放行的,其余流量都会直接拒绝。要改这套行为,得通过 firewall-cmd 去调整 zone target,或者增删 service、port、rich rule;另外还有个关键点不能漏,必须配合 --permanent 和 --reload,修改后才会真正生效。

CentOS 7 里所谓的“默认拦截规则”,并不是一条拿来就能直接改的单独语句。它本质上是由 firewalld 的 zone 默认策略共同拼出来的,也就是 default_zone + target,再加上链级别的默认动作一起决定。说白了,动手修改之前,必须先分清楚到底是在改“入站默认拒绝”这类行为,还是在调整“某个 zone 的默认放行逻辑”;这一步要是没想明白,很容易一操作就把 SSH 连接直接弄断。
firewalld 的 default_zone 和 target 决定拦截起点
firewalld 不像 iptables 那样有显式的 INPUT DROP 规则。它的“默认拦截”来自两层:
default_zone(如public)的target值,默认是default,等价于“只放行白名单里的服务/端口,其余一律拒绝”- 底层 netfilter 链的默认策略仍是
ACCEPT,但 firewalld 通过 rich rule 或 zone 配置在 runtime 中插入了隐式拒绝逻辑
所以你不能靠改 /etc/firewalld/zones/public.xml 里某一行来“放开默认拦截”,而要改 zone 的 target 或换 zone。
例如把 public zone 的 target 改为 ACCEPT(极不推荐):
sudo firewall-cmd --permanent --zone=public --set-target=ACCEPT sudo firewall-cmd --reload
⚠️ 这会让所有未显式拒绝的入站连接被接受——相当于关掉防火墙逻辑,仅保留基础链控制。
真正可控的“默认拦截行为”在 zone 的 target 和 service/port 白名单里
你日常能安全调整的,其实是 zone 的「白名单范围」,而非“默认拦截开关”。常见做法:
- 用
firewall-cmd --add-service=xxx --permanent添加预定义服务(如http、mysql),它们自带端口+协议+辅助模块(如 conntrack) - 用
firewall-cmd --add-port=3306/tcp --permanent开放单端口,但不会自动处理 RELATED/ESTABLISHED 流量(firewalld 默认已内置处理) - 用
firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" accept' --permanent做源 IP 级放行,比改 target 更精准
注意:--permanent 必须配合 --reload 才生效;漏掉 --reload 是最常导致“改了没用”的原因。
想彻底绕过 firewalld 的默认拦截?别直接停服务,先切 zone
如果你需要临时允许大量端口或动态端口段(比如 Docker 或 K8s 场景),不要停 firewalld 或切回 iptables,而是:
- 新建一个宽松 zone:
sudo firewall-cmd --permanent --new-zone=trusted-internal - 设其 target 为
ACCEPT:sudo firewall-cmd --permanent --zone=trusted-internal --set-target=ACCEPT - 把内网网卡绑定过去:
sudo firewall-cmd --permanent --zone=trusted-internal --change-interface=eth1 sudo firewall-cmd --reload
这样外网仍走 public(默认拦截),内网走新 zone(默认放行),风险隔离清晰。直接 systemctl stop firewalld 会丢失所有 zone 状态,且重启后可能因网络脚本触发自动拉起,造成策略漂移。
改配置文件前务必确认你改的是 permanent 配置,不是 runtime
firewalld 区分 runtime(当前生效)和 permanent(重启后生效)。直接编辑 /etc/firewalld/zones/public.xml 只影响 permanent,但不会自动同步到 runtime —— 你得手动 --reload,否则 firewall-cmd --list-all 显示的还是旧规则。
更危险的是:如果 XML 文件格式出错(比如少闭合标签、属性值没加引号),--reload 会失败并回退到上一次有效配置,但错误信息只写在 journal 日志里:journalctl -u firewalld | tail -20。没人查日志就以为“改了没反应”,其实服务早 silently 拒绝了 reload 请求。