在CentOS7上启用和使用firewalld

2022-06-02 18:51:58 浏览数 (1)

正确配置的防火墙是整个系统安全的最重要方面之一。

FirewallD 是一个完整的防火墙解决方案,可以管理系统的iptables规则并提供D-Bus接口以对其进行操作。从CentOS 7开始,FirewallD取代iptables作为默认的防火墙管理工具。

在本教程中,我们向你展示如何在CentOS 7系统上使用FirewallD设置防火墙,并向你说明基本的FirewallD概念。

先决条件

在开始本教程之前,请确保你使用具有sudo特权的用户帐户或root用户登录到服务器。最佳实践是以sudo用户而不是root用户身份运行管理命令。如果你的CentOS系统上没有sudo用户,则可以按照这些说明创建一个用户。

基本防火墙概念

FirewallD使用区域和服务的概念,而不是iptables链和规则。根据你将要配置的区域和服务,你可以控制系统允许或禁止的流量。

FirewallD可以使用firewall-cmd命令行实用程序进行配置和管理。

防火墙区域

区域是预定义的规则集,用于基于计算机所连接的网络上的信任级别来指定应允许的流量。你可以将网络接口和源分配给区域。

以下是FirewallD提供的区域,根据区域的信任级别从不信任到受信任而排序:

  • 删除:删除所有传入连接,而无任何通知。仅允许传出连接。
  • :对于IPv6 IPv4icmp6-adm-prohibited,对于IPv6n,所有传入连接均被拒绝,并带有icmp-host-prohibited消息。仅允许传出连接。
  • public :用于不受信任的公共区域。你不信任网络上的其他计算机,但可以允许选择的传入连接。
  • 外部:用于在系统充当网关或路由器时启用NAT伪装的外部网络。仅允许选择的传入连接。
  • 内部:当系统充当网关或路由器时,可在内部网络上使用。网络上的其他系统通常是受信任的。仅允许选择的传入连接。
  • dmz :用于位于非军事区的计算机,这些计算机对网络其余部分的访问将受到限制。仅允许选择的传入连接。
  • 工作:用于工作机。网络上的其他计算机通常是受信任的。仅允许选择的传入连接。
  • 家庭:用于家庭计算机。网络上的其他计算机通常是受信任的。仅允许选择的传入连接。
  • 受信任:接受所有网络连接。信任网络中的所有计算机。

防火墙服务

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

防火墙运行时和永久设置

防火墙使用两个单独的配置集,运行时和永久配置。

运行时配置是实际的运行配置,并且在重新启动后并不持久。当防火墙服务启动时,它将加载永久配置,该永久配置将成为运行时配置。

默认情况下,当使用firewall-cmd实用程序对Firewalld配置进行更改时,所做的更改将应用于运行时配置,要使更改永久生效,你需要使用--permanent标志。

安装和启用FirewallD

Firewalld默认安装在CentOS 7上,但是如果你的系统上未安装Firewalld,则可以通过输入以下内容来安装软件包:

代码语言:javascript复制
sudo yum install firewalld

检查防火墙状态。

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

代码语言:javascript复制
sudo firewall-cmd --state

如果你刚刚安装或从未激活过,该命令将显示not running,否则将显示running

要启动FirewallD服务并在启动时启用它:

代码语言:javascript复制
sudo systemctl start firewalld
sudo systemctl enable firewalld

使用防火墙区域

首次启用FirewallD服务后,public区域被设置为默认区域。你可以通过键入以下内容来查看默认区域:

代码语言:javascript复制
sudo firewall-cmd --get-default-zone

public

要获取所有可用区域的列表,请输入:

代码语言:javascript复制
sudo firewall-cmd --get-zones
代码语言:javascript复制
block dmz drop external home internal public trusted work

默认情况下,所有网络接口都分配有默认区域。要检查你的网络接口使用了哪些区域,请输入:

代码语言:javascript复制
sudo firewall-cmd --get-active-zones
代码语言:javascript复制
public
  interfaces: eth0 eth1

上面的输出告诉我们接口eth0eth1都分配给了公共区域。

你可以使用以下方法打印区域配置设置:

代码语言:javascript复制
sudo firewall-cmd --zone=public --list-all
代码语言:javascript复制
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相关的连接。

如果要检查所有可用区域的配置,请输入:

代码语言:javascript复制
sudo firewall-cmd --list-all-zones

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

更改接口的区域

通过结合使用--zone标志和--change-interface标志,可以轻松更改接口区域。以下命令将eth1界面分配给工作区:

代码语言:javascript复制
sudo firewall-cmd --zone=work --change-interface=eth1

通过键入以下内容验证更改:

代码语言:javascript复制
sudo firewall-cmd --get-active-zones
代码语言:javascript复制
work
  interfaces: eth1
public
  interfaces: eth0

更改默认区域

要更改默认区域,请使用--set-default-zone标志,后跟要设为默认区域的名称。例如,要将默认区域更改为home,应运行以下命令:

代码语言:javascript复制
sudo firewall-cmd --set-default-zone=home

通过以下方法验证更改:

代码语言:javascript复制
sudo firewall-cmd --get-default-zone

home

打开端口或服务

使用FirewallD,你可以根据称为服务的预定义规则允许特定端口的流量。

要获取所有默认可用服务的列表,请输入:

代码语言:javascript复制
sudo firewall-cmd --get-services

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

/usr/lib/firewalld/services/http.xml

代码语言:javascript复制
<?xml version="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),请输入:

代码语言:javascript复制
sudo firewall-cmd --zone=public --add-service=http

如果要修改默认区域,则可以省略--zone标志。

要验证是否已成功添加服务,请使用--list-services标志:

代码语言:javascript复制
sudo firewall-cmd --zone=public --list-services
代码语言:javascript复制
ssh dhcpv6-client http

如果要在重启后保持端口80的打开状态,则需要再次输入相同的命令,但是这次使用--permanent标志:

代码语言:javascript复制
sudo firewall-cmd --permanent --zone=public --add-service=http

使用--list-services--permanent标志来验证你的更改:

代码语言:javascript复制
sudo firewall-cmd --permanent --zone=public --list-services
代码语言:javascript复制
ssh dhcpv6-client http

删除服务的语法与添加服务时的语法相同。只需使用--remove-service而不是--add-service标志:

代码语言:javascript复制
sudo firewall-cmd --zone=public --remove-service=http --permanent

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

如果你正在运行没有适当服务的应用程序,例如 Plex Media Server ,该怎么办?

在这种情况下,你有两种选择。你可以打开适当的端口,也可以定义新的FirewallD服务。

例如,Plex服务器侦听端口32400并使用TCP,使用--add-port=标志为当前会话在公共区域中打开该端口:

代码语言:javascript复制
sudo firewall-cmd --zone=public --add-port=32400/tcp

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

代码语言:javascript复制
sudo firewall-cmd --zone=public --list-ports

32400/tcp

要在重新启动后使端口32400保持打开状态,请使用--permanent标志运行相同的命令,将规则添加到永久设置中。

删除端口的语法与添加端口时的语法相同。只需使用--remove-port而不是--add-port标志即可。

代码语言:javascript复制
sudo firewall-cmd --zone=public --remove-port=32400/tcp

创建新的FirewallD服务

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

例如,要为Plex Media Server创建服务定义,我们可以使用SSH服务文件:

代码语言:javascript复制
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

代码语言:javascript复制
<?xml version="0" encoding="utf-8"?>
<service version="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服务:

代码语言:javascript复制
sudo firewall-cmd --reload

你现在可以在区域中使用plexmediaserver服务,就像使用其他任何服务一样。.

带有防火墙的转发端口

要将流量从一个端口转发到另一个端口或地址,请首先使用--add-masquerade开关启用对所需区域的伪装。例如,启用external区域类型的伪装:

代码语言:javascript复制
sudo firewall-cmd --zone=external --add-masquerade
  • 将流量从同一服务器上的一个端口转发到另一个端口

在以下示例中,我们将流量从端口80转发到同一服务器上的端口8080

代码语言:javascript复制
sudo firewall-cmd --zone=external --add-forward-port=port=80:proto=tcp:toport=8080
  • 将流量转发到另一台服务器

在以下示例中,我们将流量从端口80转发到具有IP 10.10.10.2的服务器上的端口80

代码语言:javascript复制
sudo firewall-cmd --zone=external --add-forward-port=port=80:proto=tcp:toaddr=2
  • 将流量转发到其他端口上的另一台服务器

在以下示例中,我们将流量从端口80转发到具有IP 10.10.10.2的服务器上的端口8080

代码语言:javascript复制
sudo firewall-cmd --zone=external --add-forward-port=port=80:proto=tcp:toport=8080:toaddr=2

如果要使前向永久性,只需附加--permanent标志。

使用FirewallD创建规则集

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

将默认区域更改为dmz

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

代码语言:javascript复制
sudo firewall-cmd --set-default-zone=dmz
sudo firewall-cmd --zone=dmz --add-interface=eth0

打开HTTP和HTTPS端口:

要打开HTTP和HTTPS端口,请将永久服务规则添加到dmz区域:

代码语言:javascript复制
sudo firewall-cmd --permanent --zone=dmz --add-service=http
sudo firewall-cmd --permanent --zone=dmz --add-service=https

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

代码语言:javascript复制
sudo firewall-cmd --reload

检查dmz区域配置设置类型:

代码语言:javascript复制
sudo firewall-cmd --zone=dmz --list-all
代码语言:javascript复制
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)端口。

0 人点赞