FirewallD 防火墙使用概述
FirewallD 是由红帽发起的提供了支持网络/防火墙区域定义网络链接以及接口安全等级的动态防火墙管理工具。
防火墙 FirewallD
FirewallD 是由红帽发起的提供了支持网络/防火墙区域定义网络链接以及接口安全等级的动态防火墙管理工具。
![](/data/attachment/album/202005/11/163544f7dqi8e87hmebkeq.jpg)


FirewallD 是由红帽发起的提供了支持网络/防火墙<ruby> 区域 <rp>  （ </rp> <rt>  zone </rt> <rp>  ） </rp></ruby>定义网络链接以及接口安全等级的动态防火墙管理工具。它支持 IPv4、IPv6 防火墙设置以及以太网桥接，并且拥有运行时配置和永久配置选项。它也支持允许服务或者应用程序直接添加防火墙规则的接口。


由于 FirewallD 项目本身的自由软件特性，像 Debian Linux 社区发行版已经默认在软件仓库中收录了该防火墙组件软件包。随着各个新 GNU/Linux 发行版中防火墙引擎逐步从 iptables 向 nftables 迁移，FirewallD 是目前唯一能够支持该两种防火墙后端引擎的前端服务组件，用户掌握以后可以方便的进行防火墙配置并很好的规避了从 iptables 向 nftables 迁移带来的学习恐慌。


笔者通过查阅 RedHat 8 发行版网络配置手册，并结合自己在 Debian Linux 10 社区版上进行 FirewallD 防火墙的实际配置使用，对该服务组件的功能和日常使用进行整理。希望通过该文能帮助其他 Linux 用户掌握该防火墙，并通过该防火墙提高主机测网络安全防御能力，打造可信的网络安全环境。


### 一、安装


在 Debian Linux 10 社区版中使用如下命令：



```
apt-get install firewall-applet firewall-config firewalld
```

就可以直接进行 FirewallD 防火墙软件组件包的安装，其中：


* `firewall-applet` 为 FirewallD 托盘小程序，
* `firewall-config` 为 FirewallD 图形化系统配置管理工具
* `firewalld` 为 FirewallD 防火墙软件组件的主组件包，其中包含 `firewall-cmd`、`firewall-offline-cmd` 等命令行系统配置管理工具。


在 RedHat 8 下该防火墙组件默认已经进行了安装，如果用户进行特殊定制安装之后需要单独安装该软件组件可以使用命令



```
yum install firewall-config
```

直接进行安装即可。


笔者在两个系统装进行过安装对比，发现该软件组件包在两个系统上除了安装命令稍有差异外，其它从配置文件到 systemd 服务配置并没有任何区别。随后的内容将不再强调操作系统。


### 二、防火墙默认区域


* Block（阻塞）  
任何对该区域的连接请求都会被以 IPv4 的 icmp-host-prohibited 信息或 IPv6 的 icmp6-adm-prohibited 信息所拒绝。只能从系统内部启动网络连接。
* Dmz（隔离）  
用于你的隔离区内的电脑，此区域内可公开访问，可以有限地进入你的内部网络，仅仅接收经过选择的连接。
* Drop（丢弃）  
对进入该区域的所有数据包丢弃，并且不进行任何回包，区域内主动发起连接的流入回程数据包允许通过，允许进行出方向的网络连接。
* External（外部）  
用于在启用伪装的外部网络上使用，尤其路由器、防火墙认为在这个网络上的其它主机不可信。仅仅接收经过选择的连接。
* Home（家庭）  
默认其他同区域内主机可信，仅仅接收经过选择的连接。同时默认放行 ssh、mdns、ipp-client、amba-client 与 dhcpv6-client 服务产生的连接。
* Internal（内部）  
从描述中可以等同于家庭区域。
* Public（公开）  
公共区域，也是防火墙配置的默认区域，防火墙认为该区域主机不可信。仅仅接收经过选择的连接。同时默认放行 ssh 与 dhcpv6-client 服务产生的连接。
* Trusted（可信）  
可信区域，防火墙放行一切流量。等同于关闭防火墙功能。
* Work（工作）  
工作区域，防火墙认为在这个网络上的其它主机不可信。仅仅接收经过选择的连接。同时默认放行 ssh、ipp-client 与 dhcpv6-client 服务产生的连接。


这些区域的命名不言自明，用户可以很快选择一个合适的安全区域，从而简化和避开很多安全问题。当然用户也可以根据自己的需要或者安全评估来根据自己的实际需求对相应安全域进行更个性化的配置，以适应自己的安全管理规范。尽管有些安全域的安全规则是相同的，但之所以还要在名字上有所区别，主要是为了从习惯上让用户更好区分不同域的独特使用场景，对用户来说更好理解和便于区分。


### 三、防火墙日常管理


#### 3.1、查看防火墙当前状态


查询状态：



```
firewall-cmd --state
```

更多的防火墙系统服务状态信息可以使用



```
systemctl status firewalld
```

在你配置新的防火墙规则之前，你需要了解如何通过命令查看当前防火墙配置。查看防火墙当前配置可以通过图形界面或者在终端模式下使用命令进行。


在图形界面下可以直接通过点击应用程序“firewall-config”图标或者在终端窗口中输入 `firewall-config` 命令进行防火墙配置。如果当前用户为非 root 用户，系统将弹出管理员认证窗口，用户正确输入管理员密码后，防火墙配置窗口就会打开，用户即可以按照窗口界面提供的功能进行操作。


用户也可以在命令行下使用 `firewall-cmd`工具进行防火墙配置。命令行工具虽然学习起来需要一定的时间，不过该工具可以完全在系统处于终端模式下进行各种复杂的防火墙全功能配置，用户有必要进行认真的学习和掌握。


#### 3.2、防火墙基础命令


FirewallD 使用了区域进行数据流的管理，当用户使用 `firewall-cmd --list-all` 命令时，如果没有使用 `--zone` 指定区域，那么系统将返回默认区域的当前配置状态。


默认区域由配置文件 `/etc/firewalld/firewalld.conf` 中的字段 `DefaultZone` 定义，初始状态下，默认区域被定义为 `public`（公共区域）。


用户可以使用命令： 



```
firewall-cmd --get-zones
```

查看当前系统防火墙设置的的区域名列表，也可以使用命令：



```
firewall-cmd --get-default-zone
```

查看防火墙当前的默认区域；同时，可使用命令：



```
firewall-cmd --set-default-zone=[zonename]
```

或者通过直接编辑配置文件中 `DefaultZone` 字段的值进行默认区域的修改。


启动防火墙：



```
systemctl unmask firewalld
systemctl start firewalld
```

让防火墙随系统启动一起启动：



```
systemctl enable firewalld
```

停止防火墙：



```
systemctl stop firewalld
```

停止随系统启动：



```
systemctl disable firewalld
```

停止通过访问 firewalld D-Bus 接口和其他服务需要 firewalld 依赖导致的 firewalld 自动启动，更加干净的关闭 firewalld 服务：



```
systemctl mask firewalld
```

按照 RedHat 的官方文档定义，防火墙运行之后被称为运行时状态，保存了启动默认参数之后的配置被称为永久状态。在当前运行状态对防火墙进行的所有配置修改，系统即时生效，但重启后防火墙会恢复到它之前的永久状态，其实这一过程就是从保存之后的配置文件中加载相应配置参数的过程。


用户可以使用命令：



```
fiewall-cmd --runtime-to-permanent
```

对当前修改过的规则即时保存为永久配置，也可以使用命令 `firewall-cmd --permanent` 并在其后添加其它参数永久进行修改。


重新启动 firewalld 将关闭所有打开的端口并停止网络通信，需要使用命令：



```
firewall-cmd --reload
```

重新加载永久配置使之生效。


FirewallD 提供了一种系统受到攻击的紧急操作功能。假设攻击者对系统进行攻击，用户可以直接使用命令：



```
firewall-cmd --panic-on
```

关闭网络通信并且切断攻击者，而不用像之前那样通过物理拔除网线来进行断网操作，防止了系统在多网口环境中一次性插拔所有网线可能带来的混乱以及由此引发的系统恢复后延续问题。


需要恢复网络通信时用户只要使用命令：



```
firewall-cmd --panic-off
```

关闭恐慌模式即可，用户也可以使用命令：



```
firewall-cmd --query-panic
```

查询防火墙当前恐慌模式的状态。


#### 3.2、防火墙服务管理命令


用户可以通过命令行工具添加预定义的服务类型，防火墙会自动根据所需的端口并将其他设置修改为服务定义文件。


使用命令：



```
firewall-cmd --list-services
```

可以查看当前区域内被允许的服务。使用命令：



```
firewall-cmd --get-services
```

可以列出所有防火墙已经给定的预定义服务名称。使用命令：



```
firewall-cmd --add-service=<service-name>
```

可以添加具体服务，服务名称用户可以根据自己的实际需求从预定义服务名称中选取合适的服务名进行添加。完成之后用户可以使用命令：



```
firewall-cmd --runtime-to-permanent
```

将对运行时的修改保存为永久。用户可以通过命令 `firewall-config`、`firewall-cmd` 和 `firewall-offline-cmd`，或者通过直接将 `/usr/lib/firewalld/services` 目录的默认模板 XML 文件复制到 `/etc/firewalld/services` 目录中进行编辑来添加一个自定义服务类型。具体过程如下：


方法一：执行 `firewall-cmd –new-service=service-name`，系统将直接在 `/etc/firewalld/services` 目录下创建一个以 `.xml` 结尾的同名文件，自定义服务类型添加完成。


方法二：在相应目录使用编辑软件直接编辑好 XML 文件并执行 `firewall-cmd --new-service-from-file=service-name.xml`，系统将自动完成同名自定服务类型的添加。


端口作为特定系统服务的接收和区分网络流量并将其转发到系统服务的逻辑设备，系统守护进程通常侦听特定的服务端口。防火墙在默认的服务类型配置中已经定义了相应服务需要放行的对应的端口。当用户还需要在某个服务中放行特定的自定义端口或者端口段的时候可以通过 `firewall-cmd` 完成，格式如下：



```
firewall-cmd [--zone=zone_name] [--service=service_name] --add-port=port-number/port-type
```

这里需要说明的是 `--zone`、`--service` 为可选参数，如果用户不添加这两个参数执行命令时相当与在默认区域中直接添加了端口，当只选取了 `--zone` 参数时，命令执行的结果是在指定区域直接添加端口，此时与服务状态无关。只有在使用 `--service` 参数时才是在相应的服务中添加端口。


当用户需要删除一个端口时可以使用如下命令：



```
# firewall-cmd [--zone=zone_name] [--service=service_name] --remove-port=port-number/port-type
```

当用户需要向不同区域添加服务时，用户可以通过如下步逐进行：



```
# firewall-cmd --add-service=ssh --zone=drop
```

该命令将向区域 `drop` 中添加 `ssh` 服务，其实质就是放行 `ssh` 服务定义中的默认 `22` 端口入站方向的流量及连接。


在多网络接口主机中，可以使用如下方法将指定的网络接口添加到需要的区域中，从而实现每个接口的安全连接区域要求，实现真正的区域化网络安全管理。


使用命令：



```
firewall-cmd --get-active-zones
```

查看当前激活的安全区域和相应的网络接口配置。使用命令



```
firewall-cmd --zone=work --change-interface=ens3p0
```

则将网卡 `ens3p0` 加入到了 `work` 区域，之后所有通过该网卡的流量将受到区域安全规则的约束和限制，该配置是即时生效的并且会自动保存为永久配置。


用户需要将某个网卡加入到特定安全区域也可以直接使用：



```
vi /etc/sysconfig/network-scripts/ifcfg-connection-name
```

并在该文件下加入 `ZONE=zone-name` 行，该网卡即属于特定的安全区域。


用户可以对安全区域进行默认规则设置，默热规则包括三个选项 `ACCEPT`、`REJECT`、`DROP`，其中 `ACCEPT` 选项将放行所有流量，`REJECT`、`DROP` 选项将阻止所有进入该安全区域的流量，与 `REJECT` 不同的是 `DROP` 选项直接丢弃进入安全区域的数据包，并不会向该数据包的发起者回复任何信息。用户可以使用命令：



```
firewall-cmd --zone=zone-name --set-target=<default|ACCEPT|REJECT|DROP>
```

进行相应安全区域的默认规则设置。


#### 3.3、使用区域根据来源来管理传入流量


你可以使用区域根据来源管理流入流量，这使你可以对传入流量进行排序，并将其路由到不同区域，以允许或禁止该流量可以到达的服务。


如果将源添加到区域，则该区域将变为活动状态，并且来自该源的任何传入流量将通过它。你可以为每个区域指定不同的设置，该设置将应用于来自给定来源的流量。即使你只有一个网络接口，也可以使用更多区域。


通过以下实例，我们可以将特定网段对 HTTP 的请求流量进行更细致的管理，使用命令：



```
firewall-cmd --zone=trusted --add-source=192.168.1.0/24
```

将该网段作为资源加入到 `trusted` 区中，通过命令：



```
firewall-cmd --zone=trusted --add-service=http
```

将 Web 服务添加到相同区域中，随后该目标地址产生的访问 Web 服务流量将可以顺利通过。


#### 3.4、防火墙锁机制


为了防止本地程序比如 KVM 虚拟机组件对防火墙的修改，FirewallD 还提供了一种锁闭机制来防止本地程序或者服务组件对防火墙配置的修改，并且该命令只有 root 用户本身才可以执行。


用户可以使用命令：



```
firewall-cmd --query-lockdown
```

查询防火墙锁闭状态，当需要锁闭时可以直接执行命令：



```
firewall-cmd --lockdown-on
```

恢复到非锁闭状态时可以执行命令：



```
firewall-cmd --lockdown-off
```

### 四、后记


FirewallD 防火墙组件作为 RedHat 对自由软件社区的贡献之一，具有很好的普适性，希望通过本文的讲解使更多的用户开始熟悉该防火墙软件组件，并将其作为主机本地侧防护很好的技术手段，不断提高主机自身的 IPS 能力。在当今网络环境复杂的形势下让主机具有更好的安全性和可用性。

