RHCSA 系列:防火墙要点以及使用 FirewallD 和 Iptables 进行网络流量控制 - 第 11 部分
简而言之,防火墙是一种安全系统,它根据一组预定义规则(例如数据包目的地/来源或流量类型)控制网络中的传入和传出流量。
在本文中,我们将回顾 firewalld 的基础知识(Red Hat Enterprise Linux 7 中的默认动态防火墙守护进程)以及 iptables 服务(旧版)适用于 Linux 的防火墙服务,大多数系统和网络管理员都非常熟悉,并且在 RHEL 7 中也提供了该服务。
FirewallD 和 Iptables 之间的比较
在底层,firewalld 和 iptables 服务都通过相同的接口与内核中的 netfilter 框架进行通信,毫不奇怪,iptables 命令。然而,与 iptables 服务相反,firewalld 可以在正常系统操作期间更改设置,而不会丢失现有连接。
Firewalld 应默认安装在您的 RHEL 系统中,尽管它可能未运行。您可以使用以下命令进行验证(firewall-config是用户界面配置工具):
yum info firewalld firewall-config
和,
systemctl status -l firewalld.service
另一方面,默认情况下不包含 iptables 服务,但可以通过安装。
yum update && yum install iptables-services
可以使用常用的 systemd 命令启动并启用这两个守护进程:
systemctl start firewalld.service | iptables-service.service
systemctl enable firewalld.service | iptables-service.service
另请阅读:管理 Systemd 服务的有用命令
至于配置文件,iptables 服务使用 /etc/sysconfig/iptables
(如果系统中未安装该软件包,该文件将不存在)。在用作集群节点的 RHEL 7 机器上,此文件如下所示:
而firewalld将其配置存储在两个目录中:/usr/lib/firewalld
和/etc/firewalld
:
ls /usr/lib/firewalld /etc/firewalld
在我们到处添加一些规则之后,我们将在本文后面进一步检查这些配置文件。现在足以提醒您,您始终可以找到有关这两种工具的更多信息。
man firewalld.conf
man firewall-cmd
man iptables
除此之外,请记住查看查看基本命令和系统文档 - 当前系列的第 1 部分,其中我描述了几个来源,您可以在其中获取有关 RHEL 7 系统上安装的软件包的信息。
使用 iptables 控制网络流量
您可能需要参考配置 Iptables 防火墙 – Linux 基金会认证工程师 (LFCE) 系列的第 8 部分来刷新您对 iptables 内部结构的记忆在继续之前。因此,我们将能够直接进入示例。
示例 1:允许传入和传出 Web 流量
TCP 端口 80 和 443 是 Apache Web 服务器用于处理普通 (HTTP) 和安全 (HTTPS<) 网络流量。您可以允许通过 enp0s3 接口上的两个端口传入和传出 Web 流量,如下所示:
iptables -A INPUT -i enp0s3 -p tcp --dport 80 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o enp0s3 -p tcp --sport 80 -m state --state ESTABLISHED -j ACCEPT
iptables -A INPUT -i enp0s3 -p tcp --dport 443 -m state --state NEW,ESTABLISHED -j ACCEPT
iptables -A OUTPUT -o enp0s3 -p tcp --sport 443 -m state --state ESTABLISHED -j ACCEPT
示例 2:阻止来自特定网络的所有(或部分)传入连接
有时您可能需要阻止来自特定网络的所有(或某些)类型的流量,例如 192.168.1.0/24:
iptables -I INPUT -s 192.168.1.0/24 -j DROP
将丢弃来自 192.168.1.0/24 网络的所有包,而
iptables -A INPUT -s 192.168.1.0/24 --dport 22 -j ACCEPT
仅允许通过端口 22 传入流量。
示例 3:将传入流量重定向到另一个目的地
如果您不仅将 RHEL 7 盒子用作软件防火墙,而且还用作实际的基于硬件的防火墙,以便它位于两个不同的网络之间,则您的系统中必须已启用 IP 转发。如果没有,则需要编辑/etc/sysctl.conf
,将net.ipv4.ip_forward的值设置为1,如下:
net.ipv4.ip_forward = 1
然后保存更改,关闭文本编辑器,最后运行以下命令来应用更改:
sysctl -p /etc/sysctl.conf
例如,您可能在内部设备上安装了一台打印机,IP 192.168.0.10,CUPS 服务侦听端口631(两者在打印服务器和防火墙上)。为了转发来自防火墙另一端客户端的打印请求,您应该添加以下 iptables 规则:
iptables -t nat -A PREROUTING -i enp0s3 -p tcp --dport 631 -j DNAT --to 192.168.0.10:631
请记住,iptables 按顺序读取其规则,因此请确保默认策略或后续规则不会覆盖上面示例中列出的规则。
FirewallD 入门
firewalld 引入的更改之一是区域。这个概念允许将网络分成不同的区域,用户决定对该网络内的设备和流量进行信任级别。
列出活动区域:
firewall-cmd --get-active-zones
在下面的示例中,公共区域处于活动状态,并且enp0s3接口已自动分配给它。要查看有关特定区域的所有信息:
firewall-cmd --zone=public --list-all
由于您可以在 RHEL 7 安全指南中阅读有关区域的更多信息,因此我们在此仅列出一些具体示例。
示例 4:允许服务通过防火墙
要获取支持的服务的列表,请使用。
firewall-cmd --get-services
要允许 http 和 https 网络流量通过防火墙,立即生效并在后续启动时生效:
firewall-cmd --zone=MyZone --add-service=http
firewall-cmd --zone=MyZone --permanent --add-service=http
firewall-cmd --zone=MyZone --add-service=https
firewall-cmd --zone=MyZone --permanent --add-service=https
firewall-cmd --reload
如果省略–zone,则使用默认区域(您可以使用 firewall-cmd –get-default-zone 检查)。
要删除规则,请将上述命令中的“add”替换为“remove”。
示例 5:IP/端口转发
首先,您需要查明所需区域是否启用了伪装:
firewall-cmd --zone=MyZone --query-masquerade
在下图中,我们可以看到外部区域启用了伪装,但公共未启用:
您可以为公众启用伪装:
firewall-cmd --zone=public --add-masquerade
或者在外部中使用伪装。以下是我们使用 firewalld 复制示例 3 的操作:
firewall-cmd --zone=external --add-forward-port=port=631:proto=tcp:toport=631:toaddr=192.168.0.10
并且不要忘记重新加载防火墙。
您可以在 RHCSA 系列的第 9 部分中找到更多示例,其中我们解释了如何允许或禁用 Web 服务器和 ftp 服务器通常使用的端口,以及当这些服务的默认端口为默认端口时如何更改相应的规则被改变。此外,您可能需要参考firewalld wiki 以获取更多示例。
另请阅读:在 RHEL 7 中配置防火墙的有用 FirewallD 示例
结论
在本文中,我们解释了防火墙是什么,在 RHEL 7 中实现防火墙的可用服务有哪些,并提供了一些示例来帮助您开始使用防火墙任务。如果您有任何意见、建议或问题,请随时使用下面的表格告诉我们。先感谢您!