如何在 RHEL/CentOS/Rocky 8|7 上配置 Firewalld
我是一个对安全很着迷的人。看到网络上的多层安全被绕过,这与我始终以安全为中心的原因背道而驰。一些系统管理员无法花几分钟的时间来关闭前门,这总是会对网络系统产生负面影响。
在本指南中,我们将深入探讨防御——涵盖端口安全和使用防火墙来保护 Linux 服务器。由于我们无法涵盖本教程中的所有内容,因此我们将专注于各种配置的防火墙基础知识和演示。
什么是防火墙?
Firewalld 是一种动态防火墙服务,它使用低级 iptables、ip6tables 和 ebtables 管理 Linux 内核 netfilter 子系统命令。 Firewalld 是 Red Hat Enterprise Linux 7 (RHEL) 系列 Linux 发行版中使用的默认防火墙服务。它支持 IPv4 和 IPv6 防火墙设置。
firewalld 提供的防火墙服务是动态的而不是静态的,因为对配置所做的更改会立即实施,无需应用或保存更改。这是一个优势,因为现有网络连接不会发生意外中断。
Firewalld 将所有传入流量分成多个区域,每个区域都有自己的一组规则。
用于传入连接的 Firewalld 逻辑
Firewalld 必须确定用于传入连接的区域。为此,请遵循以下顺序,第一个匹配的规则获胜:
- 如果传入数据包的源地址与区域的源规则设置匹配,则该数据包将通过该区域进行路由。
- 如果数据包的传入接口与区域的过滤器设置匹配,则将使用该区域。
- 否则使用默认区域。
注意:任何新网络接口的默认区域都将设置为公共区域。
配置文件在哪里?
firewalld 的配置文件存储在 /usr/lib/firewalld/ 和 /etc/firewalld/ 目录中的各种 XML 文件中。这些文件可以编辑、写入、备份并用作其他安装的模板。
如果两个位置都存储了具有相同名称的配置文件,则将使用 /etc/firewalld/ 中的版本,这意味着管理员可以覆盖默认区域和设置。
如何管理firewalld?
作为更改防火墙服务的一种方法,可以使用三种方法:
- 使用命令行客户端firewall-cmd。它用于进行永久更改和运行时更改。 root用户或wheel组的任何成员都可以运行firewall-cmd命令,使用polkit机制进行授权命令。
- 使用图形工具firewall-config
- 使用 /etc/firewalld/ 中的配置文件
注意:
firewalld.service 和 iptables.service、ip6tables.service 和 ebtables.service 服务相互冲突。在运行firewalld服务之前屏蔽其他服务是一个很好的做法。这可以通过以下命令来完成:
for SERVICE in iptables ip6tables ebtables; do
systemctl mask ${SERVICE}.service
done
}
Firewalld 与 iptables 有何不同?
- Firewalld 将其配置文件存储在 /usr/lib/firewalld/ 和 /etc/firewalld/ 中的各种 XML 文件中,而 iptables 服务 将它们存储在/etc/sysconfig/iptables。文件 /etc/sysconfig/iptables 在 RHEL 7 上不存在,因为它默认附带 firewalld。
- 使用iptables服务,每次进行更改时都必须刷新旧规则,必须从/etc/sysconfig/iptables重新读取规则。使用firewalld,仅应用差异,并且可以在运行时更改设置,而不会丢失现有连接。
Firewalld 与 IPtables 工作图
使用firewall-cmd配置防火墙设置
firewall-cmd 作为主 firewalld 软件包的一部分安装。除非指定了 --permanent
选项,否则几乎所有命令都可以在运行时配置上运行。使用选项 --zone=
指定应用规则的区域。如果省略 --zone
,则使用默认区域。
如果更改应用于--permanent
永久配置,则可以使用firewall-cmd --reload
激活更改。
下表显示了一些常用的 firewall-cmd 命令以及说明:
了解网络区域
防火墙可以根据用户决定的信任级别将网络分为不同的区域。 firewalld 附带了许多预定义区域,每个区域都有其预期用途。下表解释了更多:
使用firewall-cmd示例
请考虑以下示例,以帮助您加强有关如何使用firewall-cmd 的知识。首先验证 firewalld 是否已启用并在您的系统上运行。
systemctl status firewalld.service
如果未运行,您可以使用以下命令启动并启用它:
systemctl start firewalld
systemctl enable firewalld
1.
将默认区域设置为dmz。
firewall-cmd --set-default-zone=dmz
firewall-cmd --get-default-zone
2.
将来自 192.168.100.0/24 网络的所有流量分配到受信任区域并进行验证。
firewall-cmd --permanent --zone=trusted --add-source=192.168.100.0/24
firewall-cmd --reload
firewall-cmd --list-all --zone=trusted
firewall-cmd --get-active-zones
3.
为内部区域开放http和https流量。
firewall-cmd --permanent --add-service={http,https} --zone=internal
firewall-cmd --reload
firewall-cmd --list-services --zone=internal
要从区域中删除永久服务:
firewall-cmd --permanent [--zone=<zone>] --remove-service=<service>
4.
将 eth0 接口转换到当前会话的“内部”区域:
firewall-cmd --zone=internal --change-interface=eth0
5.
将 eth1 接口添加到 home 区域:
firewall-cmd --zone=home --add-interface=eth1
界面管理的其他选项:
查询接口是否在Zone中:
firewall-cmd [--zone=<zone>] --query-interface=<interface>
从区域中删除接口:
firewall-cmd [--zone=<zone>] --remove-interface=<interface>
6.
在home区域中启用伪装
firewall-cmd --zone=home --add-masquerade
禁用区域中的伪装
firewall-cmd [--zone=<zone>] --remove-masquerade
区域中的查询伪装
firewall-cmd [--zone=<zone>] --query-masquerade
永久禁用区域中的伪装
firewall-cmd --permanent [--zone=<zone>] --remove-masquerade
7.
在 home 区域永久启用 mysql 的 3306/tcp 端口
firewall-cmd --permanent --zone=home --add-port=3306/tcp
在区域中永久禁用端口和协议组合
firewall-cmd --permanent [--zone=<zone>] --remove-port=<port>[-<port>]/<protocol>
8.
在公共区域阻止回显回复消息
firewall-cmd --zone=public --add-icmp-block=echo-reply
9.
将 ssh 转发到内部区域中的主机 192.168.10.5
firewall-cmd --zone=home --add-forward-port=port=22:proto=tcp:toaddr=192.168.10.5
参考
- 手册页:
man firewall-cmd
man firewalld
man firewalld.zones
man firewall.zone
man firewall-config
更多文章:
- 最佳 CompTIA Security+ (SY0-601) 认证书籍
- 安装和使用 WPScan – WordPress 安全扫描器
- 最佳网络安全书籍