RHCSA 系列:防火墙基础知识以及使用 FirewallD 和 Iptables 进行网络流量控制 - 第 11 部分
简而言之,防火墙是一种安全系统,它根据一组预定义的规则(例如数据包目的地/源或流量类型)控制网络中的传入和传出流量。
在本文中,我们将回顾Firewalld的基础知识( Red Hat Enterprise Linux 7中的默认动态防火墙守护程序)和iptables服务(Linux 的传统防火墙服务),大多数系统和网络管理员都很熟悉该服务, RHEL 7中也可以使用该服务。
FirewallD 与 Iptables 的比较
在底层,firewalld和iptables服务都通过同一个接口与内核中的netfilter框架进行通信,这个接口就是 iptables 命令,这并不奇怪。但是,与 iptables 服务不同,firewalld 可以在正常系统运行期间更改设置,而不会丢失现有连接。
您的 RHEL 系统中应该默认安装Firewalld ,尽管它可能未运行。您可以使用以下命令进行验证( 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 ) Web 流量的默认端口。您可以按如下方式在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 转发。如果没有,您需要编辑并将net.ipv4.ip_forward/etc/sysctl.conf
的值设置为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 入门
防火墙引入的其中一个变化是区域。此概念允许将网络划分为不同的区域,用户可以根据信任级别对该网络内的设备和流量进行设置。
列出活动区域:
# 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
如果省略 code>–zone,则使用默认区域(您可以使用firewall-cmd –get-default-zone进行检查)。
要删除规则,请将上述命令中的 add 一词替换为 remove 一词。
示例 5:IP/端口转发
首先,您需要查明所需区域是否启用了伪装:
# firewall-cmd --zone=MyZone --query-masquerade
在下图中,我们可以看到,外部区域启用了伪装,但公共区域未启用:
您可以启用公开伪装:
# firewall-cmd --zone=public --add-masquerade
或者在external中使用伪装。下面是我们使用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中可以使用哪些服务来实现防火墙,并提供了一些可以帮助您开始执行此任务的示例。如果您有任何意见、建议或问题,请随时使用下面的表格告诉我们。提前谢谢您!