正确配置的防火墙是整个系统安全的最重要方面之一。FirewallD是一个完整的防火墙解决方案,可以管理系统的iptables规则并提供D-Bus接口以对其进行操作。从CentOS 8开始,FirewallD取代iptables作为默认的防火墙管理工具。

在本教程中,我们向您展示如何在CentOS 8系统上使用FirewallD设置/配置防火墙,并向您说明基本的FirewallD概念。包括区域zone和服务,FirewallD防火墙运行时配置和永久配置,修改接口的区域,打开指定端口,创建自定义的FirewallD服务配置文件,端口转发,允许指定服务的连接,允许SSH/HTTPS/HTTP连接。停用/禁止防火墙。

先决条件

在开始本教程之前,请确保您以具有sudo权限的用户登录。最佳实践是以sudo用户而不是root用户运行管理命令。如果您的CentOS系统上没有sudo用户,请阅读我们教程如何在CentOS创建sudo用户

防火墙概念

FirewallD使用zone区域和服务的概念,而不是iptables链和规则。根据您将要配置的区域和服务,您可以控制系统允许或禁止的流量。FirewallD可以使用firewall-cmd命令进行配置和管理。

防火墙区域

区域是预定义的规则集,基于计算机信任级别来指定允许的网络连接。您可以将接口/网卡和源分配给区域。以下是FirewallD划分的区域,根据区域的信任级别从不信任到受信任而排序:

drop-删除所有传入连接,而无任何通知。仅允许传出连接。

block-对于IPv6 IPv4icmp6-adm-prohibited/IPv6n,所有传入连接均被拒绝,并带有icmp-host-prohibited消息。仅允许传出连接。

public-用于不受信任的公共区域。即您的计算机在一个不可信的计算机网络上,但你可以指定那些连接允许传入。

external-对于用在内部网络。当你的系统充当网关或者路由时,在网络上的计算机通常是可信的,仅已允许连接可以传入。

internal-对于在内部网络上。当计算机充当网关或路由器时。网络上的其它计算机通常是受信任的。仅已允许连接可以传入。

dmz-对于计算机位于可缓冲区,区域内计算机访问网络时将会被限制。仅已允许连接可以传入。

work-用于工作机。网络上的其他计算机通常是受信任的。仅已允许连接可以传入。

home-用于家庭计算机。网络上的其他计算机通常是受信任的。仅已允许连接可以传入。

trusted-接受所有网络连接。信任在网络中的所有计算机。

防火墙服务

防火墙服务是预定义的规则,适用于区域内,并定义必要的设置以允许指定服务的传入流量。

防火墙运行时和永久设置

防火墙使用两个单独的配置集,运行时和永久配置。运行时配置是实际的运行配置,并且在重新启动后消失。当防火墙服务启动时,它将加载永久配置,该永久配置将成为运行时配置。

默认情况下,当使用firewall-cmd命令对Firewalld配置进行更改时,所做的更改将应用​​于运行时配置,要使更改永久生效,您需要使用--permanent选项运行firewall-cmd命令。

安装FirewallD

Firewalld默认安装在CentOS 8上,但是如果您的系统上未安装Firewalld,则可以通过输入以下yum命令来安装Firewalld:

sudo yum install firewalld

默认情况下,禁用防火墙服务。您可以使用以下firewall-cmd命令检查防火墙状态:

sudo firewall-cmd --state

如果您刚刚安装或从未激活过,该命令将显示not running,否则将显示running。要启动FirewallD服务并在计算机启动时自动启动FirewallD服务,请运行以下两个systemctl命令:

sudo systemctl start firewalld
sudo systemctl enable firewalld

禁用/停用

sudo systemctl stop firewalld

如你需要永久禁用:

sudo systemctl stop firewalld
sudo systemctl disable firewalld

防火墙区域zone

首次启用FirewallD服务后,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
public
  interfaces: eth0 eth1

上面的输出告诉我们接口eth0eth1都使用公共区域。您可以使用以下方法打印区域配置:

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:

从上面的输出中,我们可以看到eth0eth1接口都使用了公共区域,并将其设置为默认区域。还允许与DHCP客户端服务和SSH的连接。如果要检查所有可用区域的配置,请输入:

sudo firewall-cmd --list-all-zones

该命令将打印出一个庞大的列表,其中将列出所有可用区域的设置。

修改接口的区域

通过结合使用--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

允许指定服务的连接

使用FirewallD,您可以根据称为服务的预定义规则允许指定端口的流量。要获取所有默认可用服务的列表,请输入:

sudo firewall-cmd --get-services

可在/usr/lib/firewalld/services目录中打开与服务关联的.xml文件,可以找到每个服务的更多信息。例如,HTTP服务的定义如下:

<?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>
/usr/lib/firewalld/services/http.xml

要仅在当前会话,即运行时配置。允许public区域传入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而不是--add-service选项:

sudo firewall-cmd --zone=public --remove-service=http --permanent

上面的命令将从public区域永久配置中删除http服务。

打开端口

上面说明都是通过服务的配置文件打开端口,但是有时候不是所有服务都带有配置文件。在这种情况下,您有两种选择。您可以打开指定的端口,也可以定义新的FirewallD服务。

例如,Plex服务器监听TCP协议32400端口,可使用--add-port=选项在当前会话的public区域中打开32400端口:

sudo firewall-cmd --zone=public --add-port=32400/tcp

协议可以是tcpudp。要验证是否已成功添加32400端口,请使用--list-ports选项:

sudo firewall-cmd --zone=public --list-ports
32400/tcp

要在重新启动后使端口32400保持打开状态,请使用--permanent选项运行相同的命令,将规则添加到配置文件中。删除端口的语法与添加端口时的语法相同。只需使用--remove-port选项即可。

sudo firewall-cmd --zone=public --remove-port=32400/tcp

创建FirewallD服务

应用程序默认的服务配置文件存储在目录/usr/lib/firewalld/services。创建新服务的最简单方法是将现有服务文件复制到/etc/firewalld/services目录并修改文件设置。

例如,要为Plex Media Server创建服务配置文件,我们可以使用SSH服务的配置文件作为模板。运行以下cp命令复制/usr/lib/firewalld/services/ssh.xml/etc/firewalld/services/plexmediaserver.xml

sudo cp /usr/lib/firewalld/services/ssh.xml /etc/firewalld/services/plexmediaserver.xml

使用你喜欢的文件编辑器,打开新创建的/etc/firewalld/services/plexmediaserver.xml文件。在本教程我们将使用vim命令打开文件

sudo vim /etc/firewalld/services/plexmediaserver.xml

并在<short><description>标签内更改服务的简称和描述。您需要更改的最重要的标签是port标签,该标签定义了您要打开的端口号和协议。在以下示例中,我们打开UDP协议1900端口和TCP协议32400端口。

<?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>
/etc/firewalld/services/plexmediaserver.xml

保存文件并退出vim编辑器,然后运行以下命令重新加载FirewallD服务:

sudo firewall-cmd --reload

您现在可以在所有区域中使用plexmediaserver服务配置文件,就像使用HTTP服务一样。.

端口转发

要将流量从一个端口转发到另一个端口或地址,请首先使用--add-masquerade选项在指定的区域启用伪装。例如,在external区域启用伪装:

sudo firewall-cmd --zone=external --add-masquerade

同一计算机端口转发

假设我们要将流量从同一计算机上的一个端口转发到另一个端口。在以下示例中,我们将流量从80端口转发到同一服务器上的端口8080

sudo firewall-cmd --zone=external --add-forward-port=port=80:proto=tcp:toport=8080

不同计算机相同端口转发

假设我们要将流量在计算机一个端口转发到另一台服务器相同端口。在以下示例中,我们将流量从端口80转发到IP地址是10.10.10.2计算机80端口:

sudo firewall-cmd --zone=external --add-forward-port=port=80:proto=tcp:toaddr=10.10.10.2

不同计算机端口转发

在以下示例中,我们将流量从端口80转发到具有IP10.10.10.2服务器8080端口:

sudo firewall-cmd --zone=external --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=10.10.10.2

如果要使规则永久生效,请添加--permanent选项。

允许SSH/HTTPS/HTTP连接

在以下示例中,如果您正在运行Web服务器,我们将展示向你如何配置FirewallD防火墙。假设您的服务器只有一个接口eth0,并且您只想允许SSH,HTTP和HTTPS端口传入的流量。

我们将使用dmz区域,因为默认情况下它仅允许SSH通信。要将默认区域更改为dmz并将其分配给eth0接口,请运行以下命令:

sudo firewall-cmd --set-default-zone=dmz
sudo firewall-cmd --zone=dmz --add-interface=eth0

要打开HTTP和HTTPS端口,使用--permanent将规则添加到dmz区域:

sudo firewall-cmd --permanent --zone=dmz --add-service=http
sudo firewall-cmd --permanent --zone=dmz --add-service=https

进行更改通过重新加载防火墙立即生效:

sudo firewall-cmd --reload

验证更改。检查dmz区域配置设置类型:

sudo firewall-cmd --zone=dmz --list-all
dmz (active)
  target: default
  icmp-block-inversion: no
  interfaces: eth0
  sources:
  services: ssh http https
  ports:
  protocols:
  masquerade: no
  forward-ports:
  source-ports:
  icmp-blocks:
  rich rules:

上面的输出告诉我们dmz是默认区域,并将其应用于eth0接口,并打开ssh服务的22端口,http服务80端口和https的443端口。

结论

您已了解如何在CentOS系统上配置和管理FirewallD服务。在限制所有不必要的连接的同时,请确保允许系统正常运行所必需的传入连接。如果您有任何疑问,请在下面发表评论。