网站搜索

如何在 CentOS 和 Ubuntu 中安装、配置和使用 Firewalld


Firewalld(防火墙守护进程)是 iptables 服务的替代方案,用于动态管理系统的防火墙,支持网络(或防火墙)区域,并提供用于管理配置的 D-Bus 接口。它易于使用和配置,现在是 RHEL/CentOSFedora 和其他几个 Linux 发行版上的默认防火墙管理工具。

在本文中,我们将讨论如何使用 firewalld 配置系统防火墙并在 CentOS/RHEL 7Ubuntu 中实现基本的数据包过滤。

Firewalld 的基础知识

Firewalld 由三层组成,分别是:

  • 核心层:负责处理配置和后端(如下所列)。
  • D-Bus 接口:更改和创建防火墙配置的主要手段。
  • 后端:用于与 netfilter(用于防火墙的本机内核模块)交互。它们包括 iptables、ip6tables、ebtables、ipset、nft、linnftables;网络管理员;和模块。

它通过实施定义网络连接或接口的信任级别的网络/防火墙区域来管理防火墙规则。其他支持的防火墙功能包括服务、直接配置(用于直接传递原始 iptables 语法)、IPSet 以及 ICMP 类型。

firewalld支持两种配置环境:

  • 运行时配置仅在机器重新启动或firewalld服务重新启动后才有效
  • 永久配置被保存并持续工作。

firewall-cmd 命令行工具用于管理运行时和永久配置。或者,您可以使用firewall-config 图形用户界面(GUI) 配置工具与守护程序交互。

此外,firewalld 为其他本地服务或应用程序提供了一个定义良好的接口,以便直接请求对防火墙规则进行更改(如果它们以 root 权限运行)。

firewalld的全局配置文件位于/etc/firewalld/firewalld.conf,防火墙功能以XML格式配置。

了解 Firewalld 的重要功能

Firewalld 的核心功能是网络/防火墙区域。所有其他功能都绑定到一个区域。防火墙区域描述连接、接口或源地址绑定的信任级别。

默认配置带有许多预定义区域,这些区域根据区域的默认信任级别从不受信任到受信任进行排序:丢弃、阻止、公共、外部、DMZ、工作、家庭、内部和受信任。它们在 /usr/lib/firewalld/zones 目录下存储的文件中定义。

您可以使用 CLI 客户端配置或添加自定义区域,或者只需从现有文件在 /etc/firewalld/zones 中创建或复制区域文件并进行编辑。

Firewalld 下的另一个重要概念是服务。服务是使用端口和协议定义的;这些定义代表给定的网络服务,例如 Web 服务器或远程访问服务。服务在存储在 /usr/lib/firewalld/services//etc/firewalld/services/ 目录下的文件中定义。

如果您了解基本的 iptables/ip6tables/ebtables 概念,您还可以使用直接接口(或配置)来直接访问防火墙。但是,对于那些没有任何 iptables 知识的人,您可以使用丰富的语言为 IPv4 和 IPv6 创建更复杂的防火墙规则。

如何在 Linux 中安装 Firewalld 软件包

CentOS 7 上,firewalld 软件包已预先安装,您可以使用以下命令进行验证。

rpm -qa firewalld

Ubuntu 16.0418.04 上,您可以使用默认包管理器安装它,如图所示。

sudo apt install firewalld

如何在 Linux 中管理 Firewalld 服务

Firewalld 是一个常规的 systemd 服务,可以通过 systemctl 命令进行管理。

 
sudo systemctl start firewalld	#start the service for the mean time
sudo systemctl enable firewalld	#enable the service to auto-start at boot time
sudo systemctl status firewalld	#view service status

启动 firewalld 服务后,您还可以使用 firewall-cmd 工具检查守护进程是否正在运行(如果未激活,此命令将输出“not跑步 ”)。

sudo firewall-cmd --state

如果您碰巧永久保存任何更改,则可以重新加载firewalld。这将重新加载防火墙规则并保留状态信息。当前的永久配置将成为新的运行时配置。

sudo firewall-cmd --reload

如何在 Firewalld 中使用防火墙区域

要获取所有可用防火墙区域和服务的列表,请运行以下命令。

sudo firewall-cmd --get-zones
sudo firewall-cmd --get-services

默认区域是用于未明确绑定到另一个区域的每个防火墙功能的区域。您可以通过运行获取网络连接和接口的默认区域集。

sudo firewall-cmd --get-default-zone

要设置默认区域(例如外部区域),请使用以下命令。请注意,添加选项 --permanent 会永久设置配置(或启用从永久配置环境查询信息)。

sudo firewall-cmd --set-default-zone=external
OR
sudo firewall-cmd --set-default-zone=external --permanent
sudo firewall-cmd --reload 

接下来,我们看看如何将接口添加到区域中。此示例演示如何将无线网络适配器 (wlp1s0) 添加到家庭区域,该区域用于家庭区域。

sudo firewall-cmd --zone=home --add-interface=wlp1s0

一个接口只能添加到一个区域。要将其移动到另一个区域,请使用 --change-interface 开关(如图所示),或使用 --remove-interface 开关将其从之前的区域中删除,然后添加它到新区。

假设您想连接到公共 WI-FI 网络,您应该将无线接口移回公共区域,如下所示:

sudo firewall-cmd --zone=public --add-interface=wlp1s0
sudo firewall-cmd --zone=public --change-interface=wlp1s0

您可以同时使用多个区域。要获取具有已启用功能(例如接口、服务、端口、协议)的所有活动区域的列表,请运行:

sudo firewall-cmd --get-active-zones

关于上一点,如果您想查找有关特定区域的更多信息,即其中添加或启用的所有内容,请使用以下命令之一:

sudo firewall-cmd --zone=home --list-all
OR
sudo firewall-cmd --info-zone public

另一个有用的选项是--get-target,它显示永久区域的目标。目标是以下之一:默认、接受、丢弃、拒绝。您可以检查各个区域的目标:

sudo firewall-cmd --permanent --zone=public --get-target  
sudo firewall-cmd --permanent --zone=block --get-target  
sudo firewall-cmd --permanent --zone=dmz --get-target  
sudo firewall-cmd --permanent --zone=external --get-target
sudo firewall-cmd --permanent --zone=drop --get-target

如何在 Firewalld 中打开和阻止端口

要在防火墙中打开端口(或端口/协议组合),只需使用 --add-port 选项将其添加到区域中即可。如果您没有明确指定区域,它将在默认区域中启用。

以下示例演示如何添加端口 80443 以允许通过 HTTPHTTPS 的入站网络流量> 协议分别:

sudo firewall-cmd --zone=public --permanent --add-port=80/tcp --add-port=443/tcp

接下来,重新加载firewalld并再次检查公共区域中启用的功能,您应该能够看到刚刚添加的端口。

sudo firewall-cmd --reload
sudo firewall-cmd --info-zone public

阻止或关闭防火墙中的端口同样容易,只需使用 --remove-port 选项将其从区域中删除即可。例如,关闭公共区域中的端口80443

sudo firewall-cmd --zone=public --permanent --remove-port=80/tcp --remove-port=443/tcp

您可以使用分配了端口的服务名称,而不是使用端口或端口/协议组合,如下一节所述。

如何在 Firewalld 中打开和阻止服务

要在防火墙中打开服务,请使用 --add-service 选项启用它。如果省略区域,则将使用默认区域。

以下命令将永久启用公共区域中的 http 服务。

sudo firewall-cmd --zone=public --permanent --add-service=http 
sudo firewall-cmd --reload 

--remove-service 选项可用于禁用服务。

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

如何使用 Firewalld 启用和禁用 IP 伪装

IP伪装(也称为IPMASQMASQ)是一种NAT网络地址转换)) Linux 网络中的机制,允许网络中具有专用 IP 地址的主机使用 Linux 服务器(IPMASQ 网关)分配的公共 IP 地址与 Internet 进行通信。

它是一对多的映射。来自不可见主机的流量将显示在互联网上的其他计算机上,就像来自您的 Linux 服务器一样。

您可以在所需区域(例如公共区域)中启用 IP 伪装。但在此之前,请首先检查伪装是否处于活动状态(“否” 表示已禁用,“是” 表示已禁用)。

sudo firewall-cmd --zone=public --query-masquerade
sudo firewall-cmd --zone=public --add-masquerade

伪装的典型用例是执行端口转发。假设您希望通过 SSH 从远程计算机连接到内部网络中 IP 10.20.1.3 的主机,sshd 守护进程正在侦听端口 5000

您可以通过发出以下命令将 Linux 服务器上端口 22 的所有连接转发到目标主机上的预期端口:

sudo firewall-cmd --zone=public --add-forward-port=port=22=proto=tcp:toport=5000:toaddr=10.20.1.3

要禁用区域中的伪装,请使用 --remove-masquerade 开关。

sudo firewall-cmd --zone=public --remove-masquerade

如何在 Firewalld 中启用和禁用 IMCP 消息

ICMP互联网控制消息协议)消息要么是信息请求,要么是对信息请求的答复,或者是在错误情况下。

您可以在防火墙中启用或禁用 ICMP 消息,但在此之前首先列出所有支持的 icmp 类型。

sudo firewall-cmd --get-icmptypes

添加或删除所需的块类型。

sudo firewall-cmd --zone=home --add-icmp-block=echo-reply
OR
sudo firewall-cmd --zone=home --remove-icmp-block=echo-reply

您可以使用 --list-icmp-blocks 开关查看区域中添加的所有 icmp 类型。

sudo firewall-cmd --zone=home --list-icmp-blocks

如何使用直接接口传递原始 iptables 命令

firewall-cmd 还提供直接选项 (--direct),以便您更直接地访问防火墙。这对于具有 iptables 基础知识的人很有用。

重要:当无法使用上面解释的常规firewall-cmd选项时,您应该只使用直接选项作为最后的手段。

以下是如何使用 --add-rules 开关传递原始 iptables 规则的示例。您可以通过将 --add-rule 替换为 --remove-rule 轻松删除这些规则:

sudo firewall-cmd --direct --add-rule ipv4 filter IN_public_allow 0 -m tcp -p tcp --dport 80 -j ACCEPT

有关 iptables 的更多信息,请参阅本指南:如何设置 Iptables 防火墙以启用对 Linux 中服务的远程访问。

如果您不熟悉 iptables 语法,您可以选择 Firewalld 的“丰富语言”,以易于理解的方式创建更复杂的防火墙规则,如下所述。

如何在 Firewalld 中使用丰富的语言

丰富语言(也称为丰富规则)用于为IPv4IPv6添加更复杂的防火墙规则无需了解 iptables 语法。

它扩展了我们已经介绍过的区域功能(服务、端口、icmp 块、伪装和转发端口)。它支持源地址和目标地址、日志记录、操作以及日志和操作的限制。

--add-rich-rule 用于添加丰富规则。此示例展示如何允许服务 http 的新 IPv4IPv6 连接并使用审核每分钟记录 1 次:

sudo firewall-cmd --add-rich-rule='rule service name="http" audit limit value="1/m" accept'

要删除添加的规则,请将 --add-rich-rule 选项替换为 --remove-rich-rule

sudo firewall-cmd --remove-rich-rule='rule service name="http" audit limit value="1/m" accept'

此功能还允许阻止或允许来自特定 IP 地址的流量。以下示例显示如何拒绝来自 IP 10.20.1.20 的连接。

sudo firewall-cmd --zone=public --add-rich-rule='rule family="ipv4" source address="192.168.0.254" reject'

如何在 Firewalld 中启用和禁用紧急模式

恐慌模式是firewalld下的一种特殊模式,所有入站和出站数据包都会被丢弃,活动连接一旦激活就会过期。
您可以在网络环境存在威胁的紧急情况下启用此模式。

要查询紧急模式,请使用 --query-panic 选项。

sudo firewall-cmd --query-panic

要启用紧急模式,请使用 --panic-on 选项。您可以使用 ping 命令测试它是否正常工作,如图所示。由于数据包被丢弃,因此无法解析名称 www.google.com,因此显示错误。

sudo firewall-cmd --panic-on
ping -c 2 www.google.com

要禁用紧急模式,请使用 --panic-off 选项。

sudo firewall-cmd --panic-off

如何锁定 Firewalld

请记住,我们在有关firewalld的基础知识中提到,如果本地应用程序或服务以root权限运行,则它们能够更改防火墙配置。您可以通过在锁定白名单中指定来控制哪些应用程序能够请求防火墙更改。

该功能默认关闭,您可以通过 --lockdown-on--lockdown 开关来启用或禁用它。

sudo firewall-cmd --lockdown-on
OR
sudo firewall-cmd --lockdown-off

请注意,建议通过编辑主配置文件来启用或禁用此功能,因为启用锁定时,firewall-cmd 可能不存在于锁定白名单中。

sudo vim /etc/firewalld/firewalld.conf

找到参数 Lockdown 并将其值从 no(表示关闭)更改为 yes(表示打开)。

Lockdown=yes

要使此设置永久,请重新加载firewalld。

sudo firewall-cmd --reload
概括

Firewalld 是 iptables 服务的易于使用的替代品,它使用 iptables 作为后端。在本文中,我们展示了如何安装firewalld软件包,解释了firewalld的重要功能,并讨论了如何在运行时和永久配置环境中配置它们。

如果您有任何问题或意见,请随时通过下面的评论表与我们联系。您可以参考firewalld手册页(man firewalld)或项目网站中的firewalld文档,以获取更多信息。