Firewalld

来自 ArchWiki

firewalld 是由 Red Hat 开发的防火墙守护程序。默认情况下它使用 nftables。来自项目主页

Firewalld 提供动态管理的防火墙,支持网络/防火墙区域,这些区域定义了网络连接或接口的信任级别。它支持 IPv4、IPv6 防火墙设置、以太网桥和 IP 集。运行时配置和永久配置选项是分离的。它还为服务或应用程序提供了直接添加防火墙规则的接口。

安装

安装 firewalld 软件包。

用法

启用启动 firewalld.service

您可以使用 firewall-cmd 控制台实用程序来控制防火墙规则。

firewall-offline-cmd 实用程序可以在 firewalld 未运行时用于配置。它的语法与 firewall-cmd 类似。

GUI 可用,为 firewall-config,它随 firewalld 软件包一起提供。

使用 nftables 后端,firewalld 不会假设完全控制主机的防火墙。由于 nftables 允许通过表使用多个“命名空间”,firewalld 会将其所有规则、集合和链的范围限定为 firewalld 表。Firewalld 不会完全刷新防火墙规则,它只会刷新 firewalld 表中的规则。

nftables 允许多个链挂钩到 netfilter 的同一点。被链接受的数据包仍然受到挂钩到该挂钩类型的其他链的规则的约束,并且在丢弃的情况下,处理总是立即停止,并且没有其他挂钩会处理该数据包。为了确保链的执行顺序的可预测性,firewalld 给其规则的优先级略低于默认的 nftables 挂钩优先级值。因此,在 firewalld 之外创建的防火墙规则(例如,通过 libvirtDockerPodmansystemd-nspawn 等)将在 firewalld 规则之前处理,并且被它们接受的数据包仍然会受到 firewalld 规则的约束。

配置

可以使用 firewall-cmd 更改运行时的配置。

注意: 大多数命令只会更改运行时配置,并且不会在重启后持久保留。要使更改永久生效,有两种选择
  • 使用 --permanent 选项。这不会更改运行时配置,直到防火墙服务重启或使用 --reload 命令重新加载规则。
  • 更改运行时配置并使其永久生效,如 #将运行时配置转换为永久配置 中所述

区域

区域是可应用于特定接口的规则集合。

要概述当前区域及其应用的接口

# firewall-cmd --get-active-zones

某些命令(例如添加/删除端口/服务)需要指定区域。

可以通过传递 --zone=zone_name 参数按名称指定区域。

如果未指定区域,则假定为默认区域。

区域信息

您可以列出所有区域及其完整配置

# firewall-cmd --list-all-zones

或仅列出特定区域

# firewall-cmd --info-zone=zone_name

更改接口的区域

# firewall-cmd --zone=zone --change-interface=interface_name

其中 zone 是您要将接口分配到的新区域。

使用 NetworkManager 管理区域

NetworkManager 可以为不同的连接配置文件分配不同的区域。例如,这允许将家庭 Wi-Fi 连接添加到“home”区域,将工作 Wi-Fi 连接添加到“work”区域,并将所有其他 Wi-Fi 连接添加到默认的“public”区域。

列出连接配置文件

$ nmcli connection show

将“myssid”配置文件分配给“home”区域

$ nmcli connection modify myssid connection.zone home

默认区域

当连接新接口时,将应用默认区域。您可以使用以下命令查询默认区域的名称

# firewall-cmd --get-default-zone

可以使用以下命令更改默认区域。

# firewall-cmd --set-default-zone=zone
注意: 此更改始终是永久性的。

服务

服务是与特定守护程序对应的预制规则。例如,ssh 服务对应于 SSH,并在分配给区域时打开端口 22。

要获取可用服务列表,请输入以下命令

# firewall-cmd --get-services

您可以查询有关特定服务的信息

# firewall-cmd --info-service service_name

在区域中添加或删除服务

要将服务添加到区域

# firewall-cmd --zone=zone_name --add-service service_name

删除服务

# firewall-cmd --zone=zone_name --remove-service service_name

端口

可以直接在特定区域上打开端口。

# firewall-cmd --zone=zone_name --add-port port_num/protocol

其中 protocoltcpudp

要关闭端口,请使用带有相同端口号和协议的 --remove-port 选项。

NAT 地址伪装

地址伪装是源 NAT 的一种形式,其中源地址在内核中创建防火墙规则时是未知的,而是将数据包的源地址动态修改为传出接口的主要 IP 地址 [1]

# firewall-cmd --permanent --zone=public --add-masquerade

自 1.0.0 版本起,要使不同防火墙区域之间的 NAT 地址伪装工作,您必须创建一个新的策略对象,该对象用于过滤它们之间的流量

# firewall-cmd --new-policy internal-to-public --permanent
# firewall-cmd --permanent --policy internal-to-public --add-ingress-zone internal
# firewall-cmd --permanent --policy internal-to-public --add-egress-zone public
# firewall-cmd --permanent --policy internal-to-public --set-target ACCEPT

端口转发

此条目或章节需要扩充。

原因: 添加关于 StrictForwardPorts 的注释。(在 Talk:Firewalld 中讨论)

如果您在路由器上配置了 firewalld,并且您已启用如上所述的 NAT 地址伪装,则可以轻松设置通过 firewalld 的端口转发

# firewall-cmd --zone=public --add-forward-port=port=12345:proto=tcp:toport=22:toaddr=10.20.30.40

这会将防火墙公共接口上的端口 12345/tcp 转发到内部系统上 IP 地址为 10.20.30.40 的端口 22(标准 SSH)。要删除此转发端口

# firewall-cmd --zone=public --remove-forward-port=port=12345:proto=tcp:toport=22:toaddr=10.20.30.40

不幸的是,您必须键入整个转发声明才能删除它,仅指定端口和协议是不够的。

富规则

使用富规则/富语言语法,可以以易于理解的方式创建更复杂的防火墙规则。

要添加富规则

# firewall-cmd [--zone=zone_name] [--permanent] --add-rich-rule='rich_rule'

其中 rich_rule 是富语言规则。

例如,要允许来自网络 192.168.1.0/24 的所有连接到 NFS 服务

# firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.1.0/24" service name="nfs" accept'

要允许来自 192.168.2.3 到端口 1234/tcp 的连接

# firewall-cmd --add-rich-rule='rule family="ipv4" source address="192.168.2.3" port port="1234" protocol="tcp" accept'

有关更多富语言语法,请参阅 firewalld.richlanguage(5)

要删除富规则

# firewall-cmd  [--zone=zone_name] [--permanent] --remove-rich-rule='rich_rule'

技巧和提示

端口或服务超时

可以使用在添加命令期间传递的 --timeout=value 选项为服务或端口添加有限的时间。值可以是秒数,如果以 m 为后缀则为分钟,如果以 h 为后缀则为小时。例如,添加 SSH 服务 3 小时

# firewall-cmd --add-service ssh --timeout=3h
注意: 超时与对防火墙配置的 --permanent 更改互斥。即,超时只能应用于运行时配置,并且永远不是永久性的。

将运行时配置转换为永久配置

您可以使运行时(当前临时)配置永久化(意味着它在重启后仍然存在)

# firewall-cmd --runtime-to-permanent

检查服务详情

默认支持服务的配置文件位于 /usr/lib/firewalld/services/,用户创建的服务文件将位于 /etc/firewalld/services/

移除小程序/托盘图标

小程序未与 firewalld 分开打包。位于 /etc/xdg/autostart/firewall-applet.desktop 的自动启动脚本可以隐藏,但是:请参阅 XDG Autostart#目录。或者,通过将其添加到 /etc/pacman.conf 中的 NoExtract 中,从安装中排除该文件。

参见