Firewalld (简体中文)

From ArchWiki
翻译状态:本文是 Firewalld翻译。上次翻译日期:2021-06-03。如果英文版本有所更改,则您可以帮助同步翻译。

firewalld 是由红帽开发的防火墙守护进程。 默认使用 nftables 。据项目主页:

Firewalld 提供了一个动态管理的防火墙,支持使用区域来标识网络连接/接口的可信等级。支持 IPv4、IPv6 防火墙设置、以太网桥接和 IP sets。使用分离的运行时配置和永久设置。也提供了一个接口用来直接为服务或应用添加防火墙规则。

安装

安装 firewalld

使用

启用启动 firewalld.service.

你可以使用控制台工具 firewall-cmd 来控制防火墙规则。

firewall-offline-cmd 可在 firewalld 未运行时进行配置,与 firewall-cmd 类似。

firewalld 带的 firewall-config 命令提供了一个图形界面。

配置

使用 firewall-cmd 可用于运行时更改配置

注意: 大部分命令只会改变运行时配置而其将会在重启后丢失,要想进行永久配置有两种方式:
  • 使用 --permanent 参数。这 不会 更改运行时配置直至防火墙服务重启,或使用 --reload 重载规则。
  • 持久化规则可见:#将运行时配置设为永久

区域

区域是一系列可用于指定接口的规则。

要查看当前区域及其应用的接口,使用:

# firewall-cmd --get-active-zones

一些命令(例如 add/remove port/service) 需要指定区域/

区域可以通过 --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 能够为不同的连接分配不同的区域。例如:将一个家庭 WiFi 分配到 "home" 区域, 将工作室 WiFi 分配到 "work" 区域,并将剩余 WiFi 分配到 "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 的 服务 {{ic|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 应为 tcpudp 之一。

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

NAT 地址伪装

此命令与 iptables -t nat -A POSTROUTING -j MASQUERADE 具有相同的效果:

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

端口转发

如果你在路由器上配置了 firewalld,而且还如上开启了 NAT 地址伪装,则通过 firewalld 设置端口转发很简单:

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

这会将外部端口上的 12345/tcp 端口转发到内部网络 10.20.30.40 的 22 (标准 SSH) 端口。移除此端口转发:

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

不幸的是你必须键入完整的转发声明以移除它,只指定端口和协议是不行的。

提示和技巧

端口或服务有效时间

使用 --timeout=value 可以设置服务或端口的有效时间。时间默认为秒,m 后缀代表分钟, h 后缀代表小时。 例如:为 SSH 开放三小时的使用时间:

# firewall-cmd --add-service ssh --timeout=3h
注意: 超时选项与 --permanent 互斥。也就是说,超时只能是运行时配置,不可能持久化。

将运行时配置设为永久

你可以将运行时配置持久化(这意味着重启后也会保留配置)

# firewall-cmd --runtime-to-permanent

检查服务配置

/usr/lib/firewalld/services/ 存储了默认支持的服务的配置文件,/etc/firewalld/services/ 存储了用户创建的服务文件。

参阅