防火墙对于控制进出 Linux 服务器的网络流量至关重要。
它使用户能够通过定义一组防火墙规则来控制主机上的传入网络流量。
它必须在面向 Internet 的生产服务器上启用,以保护这些服务器免受未经授权的访问。
这是在网络级别确保您的系统安全的安全功能之一。
在本教程中,介绍如何添加、删除、启用和禁用防火墙规则和区域。
什么是 FirewallD?
“ firewalld ”是防火墙守护进程。它提供了一个动态管理的防火墙,它带有一个非常强大的过滤系统,称为 Netfilter,由 Linux 内核提供。
它提供了包过滤、网络地址转换和端口转换的各种功能,这些功能提供了控制网络数据包的功能,如传入、传出或转发。
FirewallD 使用区域和服务的概念,而 iptables 使用链和规则。与 iptables 相比,“FirewallD”提供了一种非常灵活的方式来处理防火墙管理。
每个区域都可以按照指定的标准进行配置,以根据您的要求接受或拒绝某些服务或端口,并且它可以与一个或多个网络接口相关联。
默认区域将设置为公共区域,并附加相关的网络接口。
firewalld 有两层设计:
-
核心层:核心层负责处理配置和后端,如 iptables、ip6tables、ebtables 和 ipset。
-
D-Bus 层: firewalld D-Bus 接口是更改和创建防火墙配置的主要方式。
防火墙区域
通常 firewalld 带有一组预先配置的区域。以下是 FirewallD 提供的区域。运行以下命令以列出区域:
# firewall-cmd –get-zones
-
block:任何传入连接都被拒绝,IPv4 的 icmp-host-prohibited 消息和 IPv6 的 icmp6-adm-prohibited 消息。仅允许在此系统内发起的网络连接。
-
dmz:用于位于您的非军事区的计算机,这些计算机可公开访问,但对您的内部网络的访问受到限制。仅接受选定的传入连接。
-
drop:在没有任何通知的情况下丢弃任何传入连接。只允许传出连接。
-
external:当您的系统充当路由器时,用于启用 NAT 伪装的外部网络。只允许选定的传入连接。
-
home:用于家庭网络和同一网络上的其他计算机最受信任。仅接受选定的传入连接。
-
internal:用于内部网络,网络上的其他系统一般都是可信的。仅接受选定的传入连接。
-
public:用于公共区域,但您不应该信任网络上的其他计算机。仅接受选定的传入连接。
-
trusted:接受所有网络连接。
-
trusted:用于工作区域,同一网络上的其他计算机大多受信任。仅接受选定的传入连接。
防火墙服务
Firewalld 服务配置是预定义的服务,如果安装/启用服务,则会自动加载。它包含 firewalld 服务条目的信息,例如端口、模块和目标地址。
要列出可用的服务模块,请运行以下命令:
# firewall-cmd –get-services
Firewalld 运行时和永久设置
Firewalld 使用两个独立的配置,即运行时和永久配置:
-
运行时配置:运行时配置不会在系统重新启动时保持不变,并且 firewalld 服务停止。这意味着运行时配置不会自动保存到永久配置中。
-
永久配置:永久配置存储在配置文件中,将在每次重新启动或服务重新加载/重新启动时加载并成为新的运行时配置。请注意,要使更改永久化,您需要在 firewall-cmd 中使用 –permanent 选项。
安装和启用 FirewallD
在 CentOS 7/8、RHEL 7/8、Fedora、SUSE/openSUSE 15 上默认安装 Firewalld,但如果您的系统上没有安装,您可以按如下方式安装:
# yum install firewalld [CentOS 7/RHEL 7] # dnf install firewalld [CentOS 8/RHEL 8/Fedora] # zypper install firewalld [openSUSE Leap]
安装完成后,您需要使用以下命令启动并启用 firewalld:
# systemctl start firewalld # systemctl enable firewalld
要检查 firewalld 的状态,请运行以下命令:
# firewall-cmd --state
区域管理
Firewalld 为每个区域提供不同级别的安全性,公共区域设置为默认区域。
要查看默认区域,请运行以下命令:
#firewall-cmd –get-default-zone
要打印特定区域配置,请运行以下命令:(此输出显示允许的规则、端口和服务列表)
# firewall-cmd –zone=home –list-all
要获取所有可用区域的列表,请运行以下命令:
要找出与 eth0 接口关联的区域,请运行以下命令:
# firewall-cmd –get-zone-of-interface=eth0
要创建新区域,请使用以下命令。例如,要创建一个名为“keysou”的新区域,请运行:
#firewall-cmd --permanent --new-zone=keysou
要将运行时设置迁移到永久,请运行:
#firewall-cmd --runtime-to-permanent
打开和关闭端口
端口是使操作系统能够接收和发送网络流量并将其转发到与其关联的特定系统服务的逻辑设备。
打开特定端口允许用户从外部访问系统,这代表了安全风险。因此,仅在必要时为某些服务打开所需的端口。
要获取当前区域中允许的端口列表,请运行以下命令:
#firewall-cmd --list-ports
将端口添加到允许的端口以将其打开以接收传入流量:
#firewall-cmd --add-port=port_number/port_type
例如,以下命令将为当前区域打开端口 80:
#firewall-cmd --permanent --add-port=80/tcp
同样,要从允许的端口中删除特定端口,请运行以下命令:
#firewall-cmd --remove-port=80/tcp
您可以使用以下命令每次确认端口是否已添加或删除:
#firewall-cmd --list-ports
如果要为特定区域打开端口,请运行以下命令。例如,以下命令将为 home 区域打开端口 80:
#firewall-cmd --permanent --zone=home --add-port=80/tcp
同样,要从允许的端口中删除特定区域的特定端口,请运行:
#firewall-cmd --zone=home --remove-port=80/tcp
您可以使用以下命令确认每次是否已为特定区域添加或删除端口:
#firewall-cmd --zone=home --list-ports
在 Firewalld 中添加和删除服务
Firewalld 服务配置是预定义的服务,如果启用了服务,这些服务会自动加载。使用预定义服务使用户可以更轻松地启用和禁用对服务的访问。它包含 firewalld 服务条目的信息,例如端口、模块和目标地址。
预定义的服务位于“ /usr/lib/firewalld/services”目录中。
服务配置遵循与端口管理相同的模型,但您不需要记住任何端口,并且可以一次性允许所有端口。
例如,执行以下命令允许 samba 服务进入 ‘home’ 区域。samba 服务需要启用以下一组端口:“139 和 445 TCP”以及“137 和 138 UDP”。
添加’samba’服务后,所有端口都会同时激活,因为所有端口信息都在samba服务配置中,而当samba服务允许通过该端口时,所有samba端口都会被手动激活管理选项。
#firwall -cmd --permanent --zone=home --add-service=samba
要删除 samba 服务,请运行以下命令:
# firewall-cmd --permanent --zone=home --remove-service=ftp
您可以使用以下命令每次确认服务是否已添加或删除:
#firewall-cmd --zone=home --list-services
要获取有关 samba 服务的更多信息,请运行以下命令:
#firewall-cmd --zone=home --info-service=samba
要一次添加多个服务,请执行以下命令。例如,要添加 http 和 https 服务,请运行以下命令:
#firwall -cmd --permanent --zone=home --add-service={http,https}
使用 Firewalld 进行端口转发
端口转发是一种将任何传入网络流量从一个端口转发到另一个内部端口或另一台机器上的外部端口的方法。
在将流量从一个端口重定向到另一个端口或另一个地址之前,您应该了解以下三件事:
-
数据包到达的端口
-
使用什么协议
-
你想把它们重定向到哪里
注意:端口转发需要伪装。使用下面显示的命令为所需区域启用伪装。伪装充当路由器(NAT – 网络地址转换),可用于将小型 LAN 与 Internet 连接。
要启用 IP 伪装,请输入以下命令:
#firewall-cmd --permanent --zone=external --add-masquerade
要检查是否为外部区域启用了 IP 伪装,请运行以下命令:
# firewall-cmd --zone=external --query-masquerade
要将端口重定向到同一系统上的另一个端口,请运行以下命令:
(示例场景:将80端口的所有数据包重定向到8080端口)
# firewall-cmd --permanent --zone=external --add-forward-port=port=80:proto=tcp:toport=8080
要将流量转发到另一台服务器,请运行以下命令:
(示例场景:将所有 80 端口的数据包重定向到 IP 为 10.0.0.75 的服务器上的 8080 端口)
#firewall-cmd --permanent --zone=external --add-forward-port=port=80:proto=tcp:toport=8080: toaddr=10.0.0.75
例如,要允许来自特定源(子网)的流量,仅允许从特定子网连接到您的服务器,请运行以下命令:
# firewall-cmd --permanent --zone=home --add-source=192.168.1.0/24
Firewalld 的丰富规则
丰富的语言允许您以易于理解的方式创建更复杂的防火墙规则,但丰富的规则很难记住,导航到“ man firewalld.richlanguage”并找到示例。
Rich Rule 的一般规则结构
rule [source] [destination] service|port|protocol|icmp-block|icmp-type|masquerade|forward-port|source-port [log] [audit] [accept|reject|drop|mark]
要允许来自地址 192.168.0.0/24 的 IPv4 连接,请运行以下命令:
#firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="192.168.0.0/24" accept'
要允许来自地址 192.168.0.0/24 的 IPv4 连接用于 ssh 服务,请运行以下命令:
#firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="192.168.0.0/24" \ service name="ssh" log prefix="ssh" level="info" accept'\
要拒绝来自主机 192.0.2.0 的 IPv4 流量用于 ssh 服务,请运行:
#firewall-cmd --zone=public --add-rich-rule 'rule family="ipv4" source address="192.168.0.0/24" \ port port=22 protocol=tcp reject' \
注意:要删除任何丰富的规则,请使用“–remove-rich-rule”选项而不是“–add-rich-rule”。
要在公共区域中列出 Rich Rules,请运行:
#firewall-cmd --zone=public --list-rich-rules
Firewalld 的直接规则
直接规则类似于 iptables 命令,对于熟悉 iptables 命令的用户很有用。或者,您可以编辑“/etc/firewalld/direct.xml”文件中的规则并重新加载防火墙以激活这些规则。直接规则主要由服务或应用程序用来添加特定的防火墙规则。
以下直接规则将在服务器上打开端口 8080。
#firewall-cmd --permanent --direct --add-rule ipv4 filter INPUT 0 -p tcp --dport 8080 -j ACCEPT #firewall-cmd --reload
要列出当前区域中的直接规则,请运行:
#firewall-cmd --direct --get-all-rules
总结:
在本教程中,主要介绍 firewalld 的完整用法,例如区域、允许/拒绝服务和端口、端口转发等等。