如何在 CentOS 8 上配置和管理防火墙
防火墙是一种用于监视和过滤传入和传出网络流量的工具。它通过定义一组安全规则来工作,这些安全规则确定是允许还是阻止特定流量。正确配置的防火墙是整个系统安全的最重要方面之一。
CentOS 8 附带了一个名为 firewalld 的防火墙守护程序。它是符合 D-Bus 接口的完整解决方案,可让您动态管理系统的防火墙。
在本教程中,我们将讨论如何在 CentOS 8 上配置和管理防火墙。我们还将说明基本的 FirewallD 概念。
先决条件
要配置防火墙服务,您必须以 root 用户或具有 sudo 特权的用户身份登录。
基本防火墙概念
Firewalld 使用区域和服务的概念。根据您将要配置的区域和服务,您可以控制允许或阻止与系统之间的流量。
可以使用 firewall-cmd
命令行实用程序配置和管理 Firewalld 。
在 CentOS 8 中, nftables 替代了 iptables,作为 firewalld 守护程序的默认防火墙后端。
防火墙区域
区域是预定义的规则集,用于指定计算机连接到的网络的信任级别。您可以将网络接口和源分配给区域。
以下是 FirewallD 提供的区域,根据区域的信任级别从不信任到信任:
- drop:删除所有传入连接,而无任何通知。仅允许传出连接。
- block:拒绝所有传入连接,并带有一条
icmp-host-prohibited
消息IPv4
和一条icmp6-adm-prohibited
关于 IPv6n 的消息。仅允许传出连接。 - public:用于不受信任的公共区域。您不信任网络上的其他计算机,但是可以允许选择的传入连接。
- external:用于在系统充当网关或路由器时启用 NAT 伪装的外部网络。仅允许选择的传入连接。
- internal:当系统充当网关或路由器时,用于内部网络。网络上的其他系统通常是受信任的。仅允许选择的传入连接。
- dmz:用于非军事区中访问网络其余部分的计算机。仅允许选择的传入连接。
- work:用于工作机。网络上的其他计算机通常是受信任的。仅允许选择的传入连接。
- home:用于家用机器。网络上的其他计算机通常是受信任的。仅允许选择的传入连接。
- Trusted:接受所有网络连接。信任网络中的所有计算机。
防火墙服务
防火墙服务是预定义的规则,适用于区域,并定义必要的设置以允许特定服务的传入流量。该服务使您可以轻松地在一个步骤中执行多个任务。
例如,服务可以包含有关打开端口,转发流量等的定义。
防火墙运行时和永久设置
Firewalld 使用两个单独的配置集,即运行时配置和永久配置。
运行时配置是实际的运行配置,并且不会在重新启动后持续存在。当 firewalld 守护程序启动时,它将加载永久配置,该配置将成为运行时配置。
默认情况下,使用 firewall-cmd
实用程序对 Firewalld 配置进行更改时,更改将应用于运行时配置。要使更改永久生效,请在命令后附加 --permanent
选项。
要在两个配置集中应用更改,可以使用以下两种方法之一:
-
更改运行时配置并将其永久化:
sudo firewall-cmd <options> sudo firewall-cmd --runtime-to-permanent
-
更改永久配置并重新加载 firewald 守护程序:
sudo firewall-cmd --permanent <options> sudo firewall-cmd --reload
启用防火墙
在 CentOS 8 上,默认情况下已安装并启用 firewalld 。如果由于某种原因未在系统上安装它,则可以通过键入以下内容来安装并启动守护程序:
sudo dnf install firewalld
sudo systemctl enable firewalld --now
您可以使用以下方法检查防火墙服务的状态:
sudo firewall-cmd --state
如果启用了防火墙,则命令应打印 running
。否则,您将看到 not running
。
防火墙区域
默认的区域设置为 public
,并且所有网络接口都分配给该区域,当然您可以根据自己的需要修改默认区域。
默认区域是用于所有未明确分配给另一个区域的区域。
您可以通过键入以下内容查看默认区域:
sudo firewall-cmd --get-default-zone
public
要获取所有可用区域的列表,请输入:
sudo firewall-cmd --get-zones
block dmz drop external home internal public trusted work
要查看活动区域和分配给它们的网络接口,请执行以下操作:
sudo firewall-cmd --get-active-zones
以下输出显示接口 eth0
和 eth1
已分配给 public
区域:
public
interfaces: eth0 eth1
您可以使用以下命令打印区域配置设置:
sudo firewall-cmd --zone=public --list-all
public (active)
target: default
icmp-block-inversion: no
interfaces: eth0 eth1
sources:
services: ssh dhcpv6-client
ports:
protocols:
masquerade: no
forward-ports:
source-ports:
icmp-blocks:
rich rules:
从上面的输出中,我们可以看到公共区域处于活动状态并使用默认的 target 🈯️(REJECT
)。输出还显示该区域由 eth0
和 eth1
接口使用,并允许 DHCP 客户端和 SSH 通信。
如果要检查所有可用区域的配置,请输入:
sudo firewall-cmd --list-all-zones
该命令将显示包含所有可用区域设置的巨大列表。
更改区域目标
target
为未指定的传入流量定义区域的默认行为。它可以设置为下列选项之一: default
, ACCEPT
, REJECT
,和 DROP
。
要设置区域的目标,请使用 --zone
选项指定区域,并使用选项指定目标 --set-target
。
例如,要将 public
区域的目标更改为 DROP
您将运行:
sudo firewall-cmd --zone=public --set-target=DROP
将接口分配给其他区域
您可以为不同区域创建特定的规则集,并为其分配不同的接口。当您在计算机上有多个接口时,这特别有用。
要将接口分配给其他区域,请使用 --zone
选项指定区域,并使用选项指定接口 --change-interface
。
例如,以下命令将 eth1
接口分配给 work
区域:
sudo firewall-cmd --zone=work --change-interface=eth1
通过键入以下内容来验证更改:
sudo firewall-cmd --get-active-zones
work
interfaces: eth1
public
interfaces: eth0
更改默认区域
要更改默认区域,请使用 --set-default-zone
选项,后跟要设为默认区域的名称。
例如,要将默认区域更改为 home
您将运行以下命令:
sudo firewall-cmd --set-default-zone=home
使用以下命令验证更改:
sudo firewall-cmd --get-default-zone
home
防火墙服务
使用防火墙,您可以基于称为服务的预定义规则允许特定端口和/或源的流量。
要获取所有默认可用服务的列表,请输入:
sudo firewall-cmd --get-services
通过打开 /usr/lib/firewalld/services
目录中的相关 .xml 文件,可以找到有关每个服务的更多信息。例如, HTTP 服务的定义如下:
/usr/lib/firewalld/services/http.xml
<?xml version="1.0" encoding="utf-8"?>
<service>
<short>WWW (HTTP)</short>
<description>HTTP is the protocol used to serve Web pages. If you plan to make your Web server publicly available, enable this option. This option is not required for viewing pages locally or developing Web pages.</description>
<port protocol="tcp" port="80"/>
</service>
要仅对当前会话(运行时配置)允许公共区域中的接口允许传入的 HTTP 通信(端口 80) ,请输入:
sudo firewall-cmd --zone=public --add-service=http
如果要修改默认区域,则可以省略该 --zone
标志。
要验证是否已成功添加服务,请使用 --list-services
标志:
sudo firewall-cmd --zone=public --list-services
ssh dhcpv6-client http
如果要在重新启动后将端口 80 保持打开状态,则需要再次键入相同的命令,但这一次带有 --permanent
标志:
sudo firewall-cmd --permanent --zone=public --add-service=http
使用 --list-services
和 --permanent
标记一起验证您的更改:
sudo firewall-cmd --permanent --zone=public --list-services
ssh dhcpv6-client http
删除服务的语法与添加服务时的语法相同。只需使用 --remove-service
标志:
sudo firewall-cmd --zone=public --remove-service=http --permanent
上面的命令从公共区域永久配置中删除 http
服务。
创建一个新的 FirewallD 服务
如前所述,默认服务存储在 /usr/lib/firewalld/services
目录中。创建新服务的最简单方法是将现有服务文件复制到 /etc/firewalld/services
目录(该目录是用户创建的服务的位置)并修改文件设置。
例如,要为 Plex Media Server 创建服务定义,可以使用 SSH 服务文件:
sudo cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/plexmediaserver.xml
打开新创建的 plexmediaserver.xml
文件,然后在 <short>
和 <description>
标记中更改服务的简称和描述。您需要更改的最重要标签是 port
标签,该标签定义了要打开的端口号和协议。
在下面的示例中,我们打开 UDP 端口 1900
和 TCP 端口 32400
。
编辑文件: /etc/firewalld/services/plexmediaserver.xml
<?xml version="1.0" encoding="utf-8"?>
<service version="1.0">
<short>plexmediaserver</short>
<description>Plex is a streaming media server that brings all your video, music and photo collections together and stream them to your devices at anytime and from anywhere.</description>
<port protocol="udp" port="1900"/>
<port protocol="tcp" port="32400"/>
</service>
保存文件并重新加载 FirewallD 服务:
sudo firewall-cmd --reload
现在,您可以 plexmediaserver
像其他任何服务一样在您的区域中使用该服务。
打开端口和来源 IP
Firewalld 还允许您快速启用来自受信任 IP 地址或特定端口上的所有流量,而无需创建服务定义。
来源 IP
要允许来自特定 IP 地址(或范围)的所有传入流量,请使用 --zone
选项指定区域,并使用 --add-source
选项指定源 IP。
例如,要允许来自 public
区域的 192.168.1.10 的所有传入流量,请运行:
sudo firewall-cmd --zone=public --add-source=192.168.1.10
使新规则持久化:
sudo firewall-cmd --runtime-to-permanent
使用以下命令验证更改:
sudo firewall-cmd --zone=public --list-sources
192.168.1.10
删除源 IP 的语法与添加源 IP 的语法相同,只需使用 --remove-source
选项:
sudo firewall-cmd --zone=public --remove-source=192.168.1.10
打开源端口
要允许给定端口上的所有传入流量,请使用 --zone
选项指定区域,并使用 --add-port
选项指定端口和协议。
例如,要为当前会话在公共区域中打开 8080
端口,请运行:
sudo firewall-cmd --zone=public --add-port=8080/tcp
该协议可以是 tcp
, udp
, sctp
,或 dccp
。
验证更改:
sudo firewall-cmd --zone=public --list-ports
8080
如果重启后还要端口保持打开状态,请通过使用 --permanent
标志运行相同的命令或执行以下命令,将规则添加到永久设置中:
sudo firewall-cmd --runtime-to-permanent
删除端口的语法与添加端口时的语法相同,只是使用 --remove-port
选项。
sudo firewall-cmd --zone=public --remove-port=8080/tcp
转发端口
要将流量从一个端口转发到另一个端口,请首先使用 --add-masquerade
选项启用对所需区域的伪装。例如,要启用 external
区域的伪装,请键入:
sudo firewall-cmd --zone=external --add-masquerade
将流量从一个端口转发到相同 IP 地址上的另一个端口
在以下示例中,我们将流量从端口转发 80
到 8080
同一服务器上的端口:
sudo firewall-cmd --zone=external --add-forward-port=port=80:proto=tcp:toport=8080
将流量转发到另一个 IP 地址
在下面的例子中,我们从一个端口转发流量 80
到端口 80
与服务器 IP 地址 10.10.10.2
:
sudo firewall-cmd --zone=external --add-forward-port=port=80:proto=tcp:toaddr=10.10.10.2
将流量转发到另一台服务器的其他端口上
在下面的例子中,我们从一个 80
端口转发流量到 IP 地址为 10.10.10.2
服务器 的端口 8080
:
sudo firewall-cmd --zone=external --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=10.10.10.2
要使转发规则持久化,请使用:
sudo firewall-cmd --runtime-to-permanent
结论
您已经了解了如何在 CentOS 8 系统上配置和管理防火墙服务。请确保允许系统正常运行所必需的所有传入连接,同时限制所有不必要的连接。