防火墙是一种用于监视和过滤传入和传出网络流量的方法。它通过定义一组安全规则来工作,这些安全规则确定是允许还是阻止特定流量。正确配置的防火墙是整个系统安全的最重要方面之一。
CentOS 8附带了一个名为 firewalld 的防火墙守护程序。它是具有D-Bus接口的完整解决方案,可让您动态管理系统的防火墙。
在本教程中,我们将讨论如何在CentOS 8上配置和管理防火墙。我们还将说明基本的FirewallD概念。
先决条件
要配置防火墙服务,您必须以root用户或具有sudo权限的用户身份登录。
基本防火墙概念
防火墙使用域和服务的概念。根据您要配置的域和服务,您可以控制允许或禁止与系统之间的流量。
可以使用firewall-cmd
命令行程序来配置和管理Firewalld。
在CentOS 8中,iptables被nftables替换为firewalld守护程序的默认防火墙后端。
防火墙域zone
域zone是预定义的规则集,用于指定计算机连接到的网络的信任级别。您可以将网络接口和源分配给域。
以下是FirewallD提供的域,根据域的信任级别从不信任到信任:
- drop(删除):丢弃所有传入连接,而无任何通知。仅允许传出连接。
- block(屏蔽):对于IPv6
IPv4
和icmp6-adm-prohibited
,对于IPv6n,所有传入连接均被拒绝,并带有icmp-host-prohibited
消息。仅允许传出连接。 - public(公共) :用于不受信任的公共域。您不信任网络上的其他计算机,但可以允许选择的传入连接。
- external(外部):用于在系统充当网关或路由器时启用NAT伪装的外部网络。仅允许选定的传入连接。
- internal(内部):当系统充当网关或路由器时,可在内部网络上使用。网络上的其他系统通常是受信任的。仅允许选择的传入连接。
- dmz :用于非军事区中访问网络其余部分的计算机。仅允许选择的传入连接。
- work:用于工作机。网络上的其他计算机通常是受信任的。仅允许选择的传入连接。
- home:用于家庭计算机。网络上的其他计算机通常是受信任的。仅允许选择的传入连接。
- trusted(受信任的):接受所有网络连接。信任网络中的所有计算机。
防火墙服务service
防火墙服务是预定义的规则,适用于域内,并定义必要的设置以允许特定服务的传入流量。这些服务使您可以轻松地在一个步骤中执行多个任务。
例如,服务可以包含有关打开端口,转发流量等的定义。
防火墙运行时配置和持久化设置
防火墙使用两个独立的配置集,运行时和永久配置。
运行时配置是实时的运行配置,并且在重新启动后不会持续存在。当firewalld守护程序启动时,它将加载永久配置,该永久配置将成为运行时配置。
默认情况下,当使用firewall-cmd
程序对Firewalld配置进行更改时,更改将应用于运行时配置。要使更改永久生效,请在命令后附加--permanent
选项。
要在两个配置集中应用更改,可以使用以下两种方法之一:
更改运行时配置并使其持久化:
sudo firewall-cmd <options>
更改永久配置并重新加载防火墙守护进程:
sudo firewall-cmd --permanent <options>
启用firewalld
在CentOS 8上,默认情况下已安装并启用firewalld。如果由于某种原因未在系统上安装它,则可以通过键入以下内容来安装并启动守护程序:
sudo dnf install firewalld
sudo systemctl enable firewalld --now
您可以使用以下方法检查防火墙服务的状态:
sudo firewall-cmd --state
如果启用了防火墙,则命令应显示running
。否则,您会看到not running
。
防火墙的域zone
如果尚未更改,则默认域设置为public
,并且所有网络接口都分配给该域。
默认域是用于所有未明确分配给另一个域的域。
您可以通过输入以下内容来查看默认区域:
sudo firewall-cmd --get-default-zone
public
要获取所有可用域的列表,请输入:
sudo firewall-cmd --get-zonesblock 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:
从上面的输出中,我们可以看到public zone处于活动状态,并且使用默认目标REJECT
。输出还显示该域由eth0
和eth1
接口使用,并允许DHCP客户端和SSH通信。
如果要检查所有可用域的配置,请输入:
sudo firewall-cmd --list-all-zones
该命令将打印出包含所有可用域设置的列表。
更改域zone的target目标
target为未指定的传入流量定义域的默认行为。可以将其设置为以下选项之一:default
,ACCEPT
,REJECT
和DROP
。
要设置zone的target,请使用--zone
选项指定zone,并使用--set-target
选项指定target。
例如,要将public
zone的target更改为DROP
,可以运行:
sudo firewall-cmd --zone=public --set-target=DROP
将接口分配给其他的zone
您可以为不同的zone创建特定的规则集,并为其分配不同的接口。当您在计算机上有多个接口时,这尤其有用。
要将接口分配给其他zone,请使用--zone
选项指定区域,并使用--change-interface
选项指定接口。
例如,以下命令将eth1
接口分配给work
zone:
sudo firewall-cmd --zone=work --change-interface=eth1
通过键入以下内容验证更改:
sudo firewall-cmd --get-active-zones
work interfaces: eth1
public interfaces: eth0
更改默认的zone
要更改默认zone,请使用--set-default-zone
选项,后跟您要设为默认zone的名称。
例如,要将默认zone更改为home
,可以运行以下命令:
sudo firewall-cmd --set-default-zone=home
通过以下方法验证更改:
sudo firewall-cmd --get-default-zone
home
创建新的zone域
防火墙还允许您创建自己的zone。当您要创建每个应用程序规则时,这非常方便。
在下面的示例中,我们将创建一个名为memcached
的新zone,打开端口11211
并仅允许从192.168.100.30
IP地址进行访问:
创建zone:
sudo firewall-cmd --new-zone=memcached --permanent
将规则添加到zone:
sudo firewall-cmd --zone=memcached --add-port=11211/udp --permanent
重新加载firewalld守护程序以激活更改:
sudo firewall-cmd --reload
防火墙服务firewalld service
使用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>
要仅允许(运行时配置)public zone中的接口的传入HTTP通信(端口80),请输入:
sudo firewall-cmd --zone=public --add-service=http
如果要修改默认zone,则可以忽略--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
上面的命令从永久配置的public zone中删除http
服务。
创建新的防火墙服务FirewallD Service
正如我们已经提到的,默认服务存储在/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
标签,它定义了您要打开的端口号和协议。
在以下示例中,我们打开端口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
您现在可以像其他任何服务一样在自己的zone中使用plexmediaserver
服务。
打开端口和源IP
防火墙还允许您快速启用来自受信任IP地址或特定端口上的所有流量,而无需创建服务定义。
打开源IP
要允许来自特定IP地址(或范围)的所有传入流量,请使用--zone
选项指定区域,并使用--add-source
选项指定源IP。
例如,要允许public
zone中所有来自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-sources192.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
选项为所需的区域启用伪装。例如,要启用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
转发到具有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系统上配置和管理防火墙服务。
确保限制系统正常运行所必需的所有传入连接,同时限制所有不必要的连接。
如有疑问,请在下面发表评论。