帮助中心
如何在CentOS 8上配置和管理防火墙



防火墙是一种监测和过滤传入和传出网络流量的方法。它通过定义一套安全规则来确定是否允许或阻止特定的流量。一个正确配置的防火墙是整个系统安全的最重要方面之一。

CentOS 8提供了一个名为firewalld的防火墙守护程序。它是一个完整的解决方案,有一个D-Bus接口,允许你动态地管理系统的防火墙。

在本教程中,我们将讨论如何配置和管理CentOS 8的防火墙。我们还将解释FirewallD的基本概念。

前提条件


要配置防火墙服务,你必须以root或具有sudo权限的用户登录。

Firewalld的基本概念


firewalld使用区域和服务的概念。根据你要配置的区域和服务,你可以控制允许或阻止哪些流量进入或流出系统。

Firewalld可以通过firewall-cmd命令行工具进行配置和管理。

在CentOS 8中,iptables被nftables取代,成为Firewalld守护进程的默认防火墙后端。

Firewalld区域

区域是预定义的规则集,指定你的计算机所连接的网络的信任程度。你可以将网络接口和来源分配给一个区域。

下面是FirewallD提供的区,根据区的信任级别从不信任到信任排列。

  • DROP:所有传入的连接都被丢弃,没有任何通知。只允许出站连接。
  • BLOCK:所有进入的连接都会被拒绝,对于IPv4来说是icmp-host-prohibited消息,对于IPv6n来说是icmp6-adm-prohibited。只允许出站连接。
  • PUBLIC:用于不受信任的公共区域。你不信任网络上的其他计算机,但你可以允许选定的传入连接。
  • EXTERNAL:用于外部网络,当你的系统作为一个网关或路由器时,启用NAT伪装。只允许选定的传入连接。
  • INTERNAL:用于内部网络,当你的系统作为一个网关或路由器时。网络上的其他系统通常是被信任的。只允许选定的传入连接。
  • DMZ: 用于位于非军事区的计算机,这些计算机对网络其他部分的访问受到限制。只允许选定的传入连接。
  • WORK:用于工作机。网络上的其他计算机通常是被信任的。只允许选定的传入连接。
  • HOMG:用于家用机。网络上的其他计算机通常是被信任的。只允许选定的传入连接。
  • TRUST:所有网络连接都被接受。信任网络中的所有计算机。


防火墙服务

防火墙服务是预定义的规则,适用于一个区域内,并定义必要的设置,以允许特定服务的传入流量。服务允许你在一个步骤中轻松执行几个任务。

例如,服务可以包含关于开放端口、转发流量等的定义。

Firewalld运行时和永久设置

Firewalld使用两个分离的配置集,运行时和永久配置。

运行时配置是实际运行的配置,在重启时不会持续存在。当Firewalld守护进程启动时,它会加载永久配置,成为运行时配置。

默认情况下,当使用firewall-cmd工具对Firewalld配置进行修改时,这些修改被应用到运行时配置中。要使更改永久化,请在命令中添加 --permanent 选项。

要在两个配置集中应用这些变化,你可以使用以下两种方法之一。

更改运行时配置并使其永久化。

$ sudo firewall-cmd <options>$ sudo firewall-cmd --runtime-to-permanent

改变永久配置并重新加载firewalld守护进程。

$sudo firewall-cmd --permanent <options>$ sudo firewall-cmd --reload


启用FirewallD


在CentOS 8上,Firewalld已经安装并默认启用。如果由于某些原因,它没有安装在你的系统上,你可以通过输入以下内容来安装和启动该守护程序。

$ sudo dnf install firewalld$ sudo systemctl enable firewalld --now

你可以用以下方法检查防火墙服务的状态。

$ sudo firewall-cmd --state

如果防火墙被启用,该命令应该打印正在运行。否则,你将看到未运行。

Firewalld分区


如果你没有改变它,默认区域被设置为公共区域,所有网络接口都被分配到这个区域。

默认区域是用于所有没有明确分配给其他区域的东西。

你可以通过输入以下内容查看默认区。

$ 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
  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和eth1接口使用,并允许DHCP客户端和SSH流量。

如果你想检查所有可用区域的配置,请输入。

$ sudo firewall-cmd --list-all-zones

该命令会打印出一个包含所有可用区域设置的巨大列表。

改变区域目标

目标定义了该区对未指定的传入流量的默认行为。它可以被设置为下列选项之一:default、ACCEPT、REJECT和DROP。

要设置区的目标,用 --zone 选项指定区,用 --set-target 选项指定目标。

例如,要把公共区域的目标改为DROP,你可以运行。

$ sudo firewall-cmd --zone=public --set-target=DROP


将一个接口分配到一个不同的区域

你可以为不同的区域创建特定的规则集,并将不同的接口分配给它们。当你的机器上有多个接口时,这一点特别有用。

要把一个接口分配到一个不同的区域,用--zone选项指定区域,用--change-interface选项指定接口。

例如,下面的命令将eth1接口分配到工作区。

$ 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服务


使用firewalld,你可以根据预定义的规则(称为服务)允许特定端口和/或来源的流量。

要获得所有默认可用服务的列表,请键入。

$ 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 --runtime-to-permanent

使用-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

上面的命令从公共区域的永久配置中删除了http服务。

创建一个新的FirewallD服务

正如我们已经提到的,默认服务存储在/usr/lib/firewalld/services目录下。创建新服务的最简单方法是将现有的服务文件复制到/etc/firewalld/services目录中,这是用户创建服务的位置,并修改文件设置。

例如,要为Plex媒体服务器创建一个服务定义,你可以使用SSH服务文件。

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

打开新创建的plexmediaserver.xml文件,在标签中修改服务的短名称和描述。你需要改变的最重要的标签是端口标签,它定义了你要打开的端口号和协议。

在下面的例子中,我们要开放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选项指定区域,用--add-source选项指定源IP。

例如,要允许来自公共区的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而不是--add-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 而不是 --add-port 选项。

$ sudo firewall-cmd --zone=public --remove-port=8080/tcp


转发端口


要把流量从一个端口转发到另一个端口,首先使用--add-masquerade选项为所需的区域启用伪装。例如,要为外部区域启用伪装,请键入。

$ 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端口转发到IP为10.10.10.2的服务器的80端口。

$ 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系统上配置和管理Firewalld服务。

请确保允许所有对你的系统正常运行有必要的传入连接,同时限制所有不必要的连接。

文章相关标签: 配置和管理防火墙
购物车