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 请求。


















