# Firewalld (简体中文)

From ArchWiki
Jump to navigation Jump to search
The printable version is no longer supported and may have rendering errors. Please update your browser bookmarks and please use the default browser print function instead.
翻译状态：本文是 Firewalld 的翻译。上次翻译日期：2021-06-03。如果英文版本有所更改，则您可以帮助同步翻译。

相关文章

- nftables

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` 应为 `tcp` 或 `udp` 之一。

关闭端口使用带有相同的端口号和协议的 `--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/` 存储了用户创建的服务文件。

## 参阅

- firewall-cmd(1)
- Official documentation
- Fedora:Firewalld

Category:

- Firewalls (简体中文)