防火墙是一种监视和过滤传入和传出网络流量的方法。它的工作原理是定义一组安全规则来确定是允许还是阻止特定流量。正确配置的防火墙是整个系统安全最重要的方面之一。
CentOS 8 附带一个名为防火墙。它是一个带有 D-Bus 接口的完整解决方案,允许您动态管理系统的防火墙。
在本教程中,我们将讨论如何在 CentOS 8 上配置和管理防火墙。我们还将解释基本的 FirewallD 概念。
先决条件#
要配置防火墙服务,您必须以 root 身份登录或具有 sudo 权限的用户
.
基本 Firewalld 概念#
firewalld 使用区域和服务的概念。根据您要配置的区域和服务,您可以控制允许或阻止进出系统的流量。
可以使用以下命令配置和管理 Firewalldfirewall-cmd
命令行实用程序。
在 CentOS 8 中,iptables 被 nftables 取代,作为firewalld 守护进程的默认防火墙后端。
防火墙区域#
区域是预定义的规则集,用于指定计算机所连接的网络的信任级别。您可以将网络接口和源分配给区域。
以下是 FirewallD 提供的区域,根据区域的信任级别从不信任到信任排序:
-
drop:所有传入连接都会被丢弃,且不会发出任何通知。仅允许传出连接。
-
block:所有传入连接都被拒绝
icmp-host-prohibited
留言给IPv4
and icmp6-adm-prohibited
对于 IPv6n。仅允许传出连接。
-
public:用于不受信任的公共区域。您不信任网络上的其他计算机,但您可以允许选定的传入连接。
-
external:当您的系统充当网关或路由器时,可在启用 NAT 伪装的外部网络上使用。仅允许选定的传入连接。
-
internal:当您的系统充当网关或路由器时,可在内部网络上使用。网络上的其他系统通常是可信的。仅允许选定的传入连接。
-
dmz:用于位于非军事区且对网络其余部分的访问受到限制的计算机。仅允许选定的传入连接。
-
work:用于工作机械。网络上的其他计算机通常是可信的。仅允许选定的传入连接。
-
home:用于家用机器。网络上的其他计算机通常是可信的。仅允许选定的传入连接。
-
trusted:接受所有网络连接。信任网络中的所有计算机。
防火墙服务#
Firewalld 服务是在区域内应用的预定义规则,并定义必要的设置以允许特定服务的传入流量。这些服务使您可以一步轻松地执行多项任务。
例如,服务可以包含有关打开端口、转发流量等的定义。
Firewalld 运行时和永久设置#
Firewalld 使用两个独立的配置集:运行时配置和永久配置。
运行时配置是实际运行配置,不会在重新启动后保留。当firewalld守护进程启动时,它会加载永久配置,该配置将成为运行时配置。
默认情况下,当使用以下命令更改 Firewalld 配置时firewall-cmd
实用程序,更改将应用于运行时配置。要使更改永久生效,请附加--permanent
命令的选项。
要应用两个配置集中的更改,您可以使用以下两种方法之一:
-
更改运行时配置并使其永久化:
sudo firewall-cmd <options>
sudo firewall-cmd --runtime-to-permanent
-
更改永久配置并重新加载firewalld守护进程:
sudo firewall-cmd --permanent <options>
sudo firewall-cmd --reload
启用防火墙D#
在 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
and eth1
被分配给public
zone:
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:
从上面的输出中,我们可以看到公共区域处于活动状态并使用默认目标,即REJECT
。输出还显示该区域已被eth0
and eth1
接口并允许 DHCP 客户端和 SSH 流量。
如果您想检查所有可用区域的配置,请输入:
sudo firewall-cmd --list-all-zones
该命令打印一个包含所有可用区域设置的巨大列表。
更改区域目标#
目标定义区域对于未指定的传入流量的默认行为。它可以设置为以下选项之一:default
, ACCEPT
, REJECT
, and DROP
.
要设置区域的目标,请使用以下命令指定区域--zone
选项和目标--set-target
option.
例如,要更改public
区的目标DROP
你会运行:
sudo firewall-cmd --zone=public --set-target=DROP
将接口分配给不同的区域#
您可以为不同区域创建特定的规则集并为其分配不同的接口。当您的计算机上有多个接口时,这尤其有用。
要将接口分配到不同的区域,请使用以下命令指定区域--zone
选项和接口--change-interface
option.
例如,以下命令分配eth1
接口到work
zone:
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
创建新区域#
Firewalld 还允许您创建自己的区域。当您想要创建每个应用程序的规则时,这非常方便。
在以下示例中,我们将创建一个名为的新区域memcached
,打开端口11211
并只允许从192.168.100.30
IP地址:
-
创建区域:
sudo firewall-cmd --new-zone=memcached --permanent
-
将规则添加到区域:
sudo firewall-cmd --zone=memcached --add-port=11211/udp --permanent
sudo firewall-cmd --zone=memcached --add-port=11211/tcp --permanent
sudo firewall-cmd --zone=memcached --add-source=192.168.100.30/32 --permanent
-
重新加载firewalld守护进程以激活更改:
sudo firewall-cmd --reload
防火墙服务#
使用firewalld,您可以根据称为服务的预定义规则允许特定端口和/或源的流量。
要获取所有默认可用服务类型的列表:
sudo firewall-cmd --get-services
您可以通过打开关联的 .xml 文件来找到有关每个服务的更多信息/usr/lib/firewalld/services
目录。例如,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
option.
要验证服务是否已成功添加,请使用--list-services
option:
sudo firewall-cmd --zone=public --list-services
ssh dhcpv6-client http
要在重新启动后保持端口 80 打开,请再次运行相同的命令--permanent
选项,或执行:
sudo firewall-cmd --runtime-to-permanent
Use the --list-services
随着--permanent
验证您的更改的选项:
sudo firewall-cmd --permanent --zone=public --list-services
ssh dhcpv6-client http
删除服务的语法与添加服务时的语法相同。只需使用--remove-service
而不是--add-service
flag:
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>
and <description>
标签。您需要更改的最重要的标签是port
tag,定义了你要打开的端口号和协议。
在下面的示例中,我们打开端口1900
UDP 和32400
TCP.
/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
选项和源 IP--add-source
option.
例如,允许来自 192.168.1.10 的所有传入流量public
区域,运行:
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
而不是--add-source
option:
sudo firewall-cmd --zone=public --remove-source=192.168.1.10
打开源端口#
要允许给定端口上的所有传入流量,请使用以下命令指定区域--zone
选项以及端口和协议--add-port
option.
例如,打开端口8080
在当前会话的公共区域中,您将运行:
sudo firewall-cmd --zone=public --add-port=8080/tcp
该协议可以是tcp
, udp
, sctp
, or dccp
.
验证更改:
sudo firewall-cmd --zone=public --list-ports
8080
要在重新启动后保持端口打开,请使用以下命令运行相同的命令,将规则添加到永久设置:--permanent
标志或通过执行:
sudo firewall-cmd --runtime-to-permanent
删除端口的语法与添加端口时的语法相同。只需使用--remove-port
而不是--add-port
option.
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
到港口8080
在有IP的服务器上10.10.10.2
:
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 系统上配置和管理 firewalld 服务。
确保允许系统正常运行所需的所有传入连接,同时限制所有不必要的连接。
如果您有疑问,请随时在下面发表评论。