firewalld 默认策略由区域(zone)的 target 行为决定,非全局“允许/拒绝”开关;public zone 默认 target: default(即隐式拒绝未显式允许的入站),trusted zone 显式配置 target: accept 才放行所有;修改 target 必须手动编辑 /etc/firewalld/zones/ 下的 xml 文件并重载,且出站策略不可配置。

firewalld 的默认策略不是“允许所有”或“拒绝所有”这种粗粒度开关,而是由**区域(zone)的默认行为 + 入站/出站方向策略**共同决定。直接改 --set-default-policy 是无效命令 —— 这个参数根本不存在。
你真正要操作的是两个层面:**默认区域的入站默认行为**(即“没匹配到任何规则时怎么处理”),以及**是否启用该区域的默认策略继承机制**。下面分关键点说明:
firewall-cmd --set-default-zone=xxx 为什么不能直接控制“放行/拦截”?
这个命令只设置新网卡、新连接默认归属哪个 zone(如 public、trusted),不改变该 zone 内部的默认动作。比如 public zone 默认就是 target: default,实际含义是“未显式允许的入站连接全部拒绝”,但这是 zone 定义文件里写死的,不是靠命令动态设的。
-
publiczone 的 XML 文件(/usr/lib/firewalld/zones/public.xml)里没有<target></target>标签,意味着它走 firewalld 内置的 default target:deny -
trustedzone 的 XML 里有<target>ACCEPT</target>,所以它才允许一切入站 - 你用
firewall-cmd --set-default-zone=trusted后,新接口自动归入 trusted,自然就放行了 —— 但这不是“改策略”,是“换了个自带 ACCEPT 的 zone”
想让 public zone 变成“默认放行”,只能改配置文件
firewalld 不提供命令行修改 zone 的 <target></target> 值。必须手动编辑 zone 配置:
- 复制系统 zone 到用户配置目录:
sudo cp /usr/lib/firewalld/zones/public.xml /etc/firewalld/zones/ - 编辑
/etc/firewalld/zones/public.xml,在<zone></zone>标签下插入一行:<target>ACCEPT</target> - 重载:
firewall-cmd --reload - 验证:
firewall-cmd --zone=public --list-all会显示target: ACCEPT
⚠️ 注意:一旦这么改,public 就失去“仅允许 SSH/DHCPv6”的安全前提,所有未明确 --remove-service 或 --remove-port 的服务都会被放行 —— 包括可能暴露的 Redis、MySQL 端口。
CentOS Linux 7.9.2009是传统CentOS Linux 7的最后主要版本,也是很多企业历史服务器中仍可能遇到的系统版本。它以稳定、兼容RHEL 7生态、文档丰富和软件支持广泛著称,曾长期用于Web服务、数据库、虚拟化节点和企业内部业务系统。不过CentOS Linux 7已于2024年6月30日停止维护,现在继续使用会面临安全补丁缺失风险。该版本更适合旧业务迁移、历史环境恢复或离线兼容性测试。
出站流量默认策略根本不能改
firewalld 对 OUTPUT 链不做策略控制,所有出站连接默认放行。这不是 bug,是设计如此 —— 它只管“谁可以连进来”,不管“本机能连出去哪”。如果你真需要限制出站,得上 iptables 或 nftables,且必须配合 OUTPUT 链规则和状态跟踪(-m state --state ESTABLISHED,RELATED -j ACCEPT)才能不把自己锁死。
-
firewall-cmd --set-default-policy=accept会报错:Unknown option --set-default-policy -
firewall-cmd --get-default-zone只返回 zone 名,不返回 policy - 所谓“默认策略”在 firewalld 里只有
target一种表现形式,且仅作用于入站(INPUT)方向
临时禁用防火墙比硬改策略更常见
很多运维场景下,与其冒险改 public 的 <target></target>,不如明确关闭 firewalld 并切换到 iptables(如果已有成熟 iptables 规则集):
- 停用:
sudo systemctl stop firewalld && sudo systemctl disable firewalld - 装 iptables:
sudo yum install iptables-services - 启用:
sudo systemctl enable iptables && sudo systemctl start iptables - 此时
/etc/sysconfig/iptables里的POLICY才真正生效(如:INPUT DROP [0:0])
firewalld 的 zone target 机制是抽象层,改它等于绕过设计初衷;而 iptables 的 chain policy 是底层 netfilter 行为,改起来直截了当 —— 选哪种,取决于你团队对规则维护方式的熟悉程度,而不是“哪个更高级”。










