Fedora 上的 firewalld:区域、运行时与永久配置
Fedora 的防火墙是 firewalld,不是”往 iptables 里加规则”。它按区域(zone)组织规则,并且把配置分成运行时和永久两层——这两层的关系是本页的重点。
先确认装了没
Section titled “先确认装了没”rpm -q firewalldsudo firewall-cmd --statefirewalld-2.5.1-1.fc45.noarchrunning默认区域取决于安装方式
Section titled “默认区域取决于安装方式”sudo firewall-cmd --get-default-zonesudo firewall-cmd --get-zonespublic
FedoraServer FedoraWorkstation block dmz drop external home internal nm-shared public trusted work两台机器实测出的默认区域不一样,这不是 bug:
| 安装方式 | 默认区域 | 预置放行 |
|---|---|---|
F43 Server(kickstart firewall --enabled) | FedoraServer | cockpit dhcpv6-client ssh |
| F45 Cloud | public | dhcpv6-client mdns ssh |
原因是安装器会按变体写不同的区域文件。所以看到教程里说”默认是 FedoraServer”或”默认是 public”,都对,也都不全——要看你装的是哪个变体。
两个区域本身都在列表里(FedoraServer、FedoraWorkstation 是 Fedora 特有,其余是 firewalld 通用区域)。
看当前生效的规则:
sudo firewall-cmd --list-allpublic (default, active) target: default interfaces: ens19 eth0 services: dhcpv6-client mdns ssh ports: forward: yes masquerade: nointerfaces 列出的是套用这个区域的网卡。默认区域生效于没有显式归属的接口。

放行一个服务
Section titled “放行一个服务”firewalld 自带 264 个服务定义(F45 实测;F43 上是 259 个),先查再写:
sudo firewall-cmd --get-services | wc -wsudo firewall-cmd --info-service=http | head -6放行:
sudo firewall-cmd --add-service=http # 只加运行时sudo firewall-cmd --permanent --add-service=httpsudo firewall-cmd --reload运行时与永久:最容易错的一层
Section titled “运行时与永久:最容易错的一层”| 操作 | 运行时生效 | 重启后保留 |
|---|---|---|
--add-service=… | 是 | 否 |
--permanent --add-service=… | 否 | 是 |
--permanent … + --reload | 是 | 是 |
--runtime-to-permanent | 是 | 是 |
实测一遍就清楚了:
sudo firewall-cmd --permanent --add-port=8080/tcpecho "runtime=[$(sudo firewall-cmd --list-ports)] perm=[$(sudo firewall-cmd --permanent --list-ports)]"successruntime=[] perm=[8080/tcp]加了永久规则但没 reload,运行时还是空的——这时候连不上,而 --permanent --list-ports 又显示已经加了,非常容易误判。
sudo firewall-cmd --reloadecho "runtime=[$(sudo firewall-cmd --list-ports)] perm=[$(sudo firewall-cmd --permanent --list-ports)]"successruntime=[8080/tcp] perm=[8080/tcp]ls /etc/firewalld/zones/FedoraServer.xml FedoraWorkstation.xml public.xml trusted.xml …每个区域一个 XML。--permanent 改的就是这些文件,--reload 让 firewalld 重新读。
sudo cat /etc/firewalld/zones/FedoraServer.xml | head -10<?xml version="1.0" encoding="utf-8"?><zone> <short>Public</short> <service name="ssh"/> <service name="dhcpv6-client"/> <service name="cockpit"/></zone>几个常见动作
Section titled “几个常见动作”# 把网卡划到某个区域sudo firewall-cmd --permanent --zone=internal --add-interface=ens19sudo firewall-cmd --reload
# 只允许某个网段访问sudo firewall-cmd --permanent --zone=internal --add-source=192.168.2.0/24sudo firewall-cmd --reload
# 临时放开(重启即失效)sudo firewall-cmd --add-service=httpssudo firewall-cmd --remove-service=https
# 看某个端口被谁允许sudo firewall-cmd --list-portssudo firewall-cmd --state # 1) 服务在跑吗sudo firewall-cmd --list-all # 2) 默认区域放了什么sudo firewall-cmd --get-active-zones # 3) 网卡属于哪个区域sudo firewall-cmd --permanent --list-all # 4) 永久配置(reload 后才生效)ss -tlnp # 5) 服务真的在听吗第 5 步常被漏掉:端口没放行和服务没监听,报错是一样的(连不上)。先确认 ss -tlnp 里有那个端口,再谈防火墙。
- Fedora 网络配置 — 地址、路由与 DNS
- SELinux — 端口类型(服务监听非标准端口时的另一道关)
- 把 Fedora 用成服务器 — 服务器基线
- 报错速查 —
command not found一类问题 - 命令速查 — 防火墙相关命令
- 官方:firewalld