Firewalld
firewalld 是由 Red Hat 开发的防火墙守护程序。默认情况下它使用 nftables。来自项目主页
- Firewalld 提供动态管理的防火墙,支持网络/防火墙区域,这些区域定义了网络连接或接口的信任级别。它支持 IPv4、IPv6 防火墙设置、以太网桥和 IP 集。运行时配置和永久配置选项是分离的。它还为服务或应用程序提供了直接添加防火墙规则的接口。
安装
用法
您可以使用 firewall-cmd
控制台实用程序来控制防火墙规则。
firewall-offline-cmd
实用程序可以在 firewalld 未运行时用于配置。它的语法与 firewall-cmd
类似。
GUI 可用,为 firewall-config
,它随 firewalld 软件包一起提供。
使用 nftables 后端,firewalld 不会假设完全控制主机的防火墙。由于 nftables 允许通过表使用多个“命名空间”,firewalld 会将其所有规则、集合和链的范围限定为 firewalld
表。Firewalld 不会完全刷新防火墙规则,它只会刷新 firewalld
表中的规则。
nftables 允许多个链挂钩到 netfilter 的同一点。被链接受的数据包仍然受到挂钩到该挂钩类型的其他链的规则的约束,并且在丢弃的情况下,处理总是立即停止,并且没有其他挂钩会处理该数据包。为了确保链的执行顺序的可预测性,firewalld 给其规则的优先级略低于默认的 nftables 挂钩优先级值。因此,在 firewalld 之外创建的防火墙规则(例如,通过 libvirt、Docker、Podman、systemd-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
其中 protocol
是 tcp
或 udp
。
要关闭端口,请使用带有相同端口号和协议的 --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
端口转发
如果您在路由器上配置了 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
将运行时配置转换为永久配置
您可以使运行时(当前临时)配置永久化(意味着它在重启后仍然存在)
# 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 中,从安装中排除该文件。