跳转到内容
搜索 Fedora 文档

    浏览当前文档目录

    Fedora 上的 firewalld:区域、运行时与永久配置

    Fedora 的防火墙是 firewalld,不是”往 iptables 里加规则”。它按区域(zone)组织规则,并且把配置分成运行时和永久两层——这两层的关系是本页的重点。

    Terminal window
    rpm -q firewalld
    sudo firewall-cmd --state
    firewalld-2.5.1-1.fc45.noarch
    running
    Terminal window
    sudo firewall-cmd --get-default-zone
    sudo firewall-cmd --get-zones
    public
    FedoraServer FedoraWorkstation block dmz drop external home internal nm-shared public trusted work

    两台机器实测出的默认区域不一样,这不是 bug:

    安装方式默认区域预置放行
    F43 Server(kickstart firewall --enabled)FedoraServercockpit dhcpv6-client ssh
    F45 Cloudpublicdhcpv6-client mdns ssh

    原因是安装器会按变体写不同的区域文件。所以看到教程里说”默认是 FedoraServer”或”默认是 public”,都对,也都不全——要看你装的是哪个变体。

    两个区域本身都在列表里(FedoraServer、FedoraWorkstation 是 Fedora 特有,其余是 firewalld 通用区域)。

    看当前生效的规则:

    Terminal window
    sudo firewall-cmd --list-all
    public (default, active)
    target: default
    interfaces: ens19 eth0
    services: dhcpv6-client mdns ssh
    ports:
    forward: yes
    masquerade: no

    interfaces 列出的是套用这个区域的网卡。默认区域生效于没有显式归属的接口。

    F45 实测:firewall-cmd --state 返回 running;默认区域是 public;get-zones 列出 FedoraServer 与 FedoraWorkstation;list-all 显示 public 预置放行了 dhcpv6-client mdns ssh

    firewalld 自带 264 个服务定义(F45 实测;F43 上是 259 个),先查再写:

    Terminal window
    sudo firewall-cmd --get-services | wc -w
    sudo firewall-cmd --info-service=http | head -6

    放行:

    Terminal window
    sudo firewall-cmd --add-service=http # 只加运行时
    sudo firewall-cmd --permanent --add-service=http
    sudo firewall-cmd --reload

    运行时与永久:最容易错的一层

    Section titled “运行时与永久:最容易错的一层”
    操作运行时生效重启后保留
    --add-service=…是否
    --permanent --add-service=…否是
    --permanent … + --reload是是
    --runtime-to-permanent是是

    实测一遍就清楚了:

    Terminal window
    sudo firewall-cmd --permanent --add-port=8080/tcp
    echo "runtime=[$(sudo firewall-cmd --list-ports)] perm=[$(sudo firewall-cmd --permanent --list-ports)]"
    success
    runtime=[] perm=[8080/tcp]

    加了永久规则但没 reload,运行时还是空的——这时候连不上,而 --permanent --list-ports 又显示已经加了,非常容易误判。

    Terminal window
    sudo firewall-cmd --reload
    echo "runtime=[$(sudo firewall-cmd --list-ports)] perm=[$(sudo firewall-cmd --permanent --list-ports)]"
    success
    runtime=[8080/tcp] perm=[8080/tcp]
    Terminal window
    ls /etc/firewalld/zones/
    FedoraServer.xml FedoraWorkstation.xml public.xml trusted.xml …

    每个区域一个 XML。--permanent 改的就是这些文件,--reload 让 firewalld 重新读。

    Terminal window
    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>
    Terminal window
    # 把网卡划到某个区域
    sudo firewall-cmd --permanent --zone=internal --add-interface=ens19
    sudo firewall-cmd --reload
    # 只允许某个网段访问
    sudo firewall-cmd --permanent --zone=internal --add-source=192.168.2.0/24
    sudo firewall-cmd --reload
    # 临时放开(重启即失效)
    sudo firewall-cmd --add-service=https
    sudo firewall-cmd --remove-service=https
    # 看某个端口被谁允许
    sudo firewall-cmd --list-ports
    Terminal window
    sudo 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 里有那个端口,再谈防火墙。