RHEL7和CentOS 7上的Firewalld入门

时间:2020-02-23 14:38:12  来源:igfitidea点击:

在本指南中,我们将深入研究端口安全和使用防火墙保护Linux服务器安全方面的防御措施。由于我们不能涵盖本教程中的所有内容,因此我们将重点介绍各种配置的防火墙基础知识和演示。

什么是防火墙?

Firewalld是一种动态防火墙服务,它使用低级iptables,ip6tables和ebtables命令管理Linux内核netfilter子系统。 Firewalld是Red Hat Enterprise Linux 7(RHEL)系列Linux发行版中使用的默认防火墙服务。它支持IPv4和IPv6防火墙设置。

firewalld提供的防火墙服务是动态的,而不是静态的,因为对配置所做的更改将立即实施,而无需应用或者保存更改。这是一个优点,因为不会发生现有网络连接的意外中断。

Firewalld将所有传入的流量划分为区域,每个区域都有自己的一组规则。

用于传入连接的防火墙逻辑

Firewalld必须确定用于传入连接的区域。为此,请遵循以下顺序,第一个匹配的规则将获胜:如果传入数据包的源地址与区域的源规则设置匹配,则该数据包将通过该区域进行路由。区域的过滤器设置,将使用该区域。否则使用默认区域。

注意:任何新网络接口的默认区域都将设置为公共区域。

配置文件其中?

Firewalld的配置文件存储在/usr/lib/firewalld /和/etc/firewalld /目录中的各种XML文件中。这些文件可以被编辑,写入,备份并用作其他安装的模板。

如果两个位置都存储了具有相同名称的配置文件,则将使用/etc/firewalld /中的版本,这意味着管理员可以覆盖默认区域和设置。

如何管理firewalld?

作为更改防火墙服务的一种方法,可以使用以下三种方法:使用命令行客户端Firewall-cmd。它用于进行永久性更改和运行时更改。 root用户或者wheel组的任何成员都可以运行firewall-cmd命令,使用polkit机制对命令进行授权。使用图形工具firewall-config使用/etc/firewalld /中的配置文件

注意:

Firewalld.service和iptables.service,ip6tables.service和ebtables.service服务相互冲突。在运行防火墙服务之前,最好屏蔽其他服务。这可以通过以下命令完成:

for SERVICE in iptables ip6tables ebtables; do
systemctl mask ${SERVICE}.service
done
}

Firewalld与iptables有何不同?

Firewalld将其配置文件存储在/usr/lib/firewalld /和/etc/firewalld /中的各种XML文件中,而iptables服务将其存储在/etc/sysconfig/iptables中。/etc/sysconfig/iptables文件在RHEL 7上不存在,因为默认情况下它是防火墙保护的。使用iptables服务,每进行一次更改都必须刷新旧规则,必须从/重新读取规则etc/sysconfig/iptables。使用firewalld时,仅会应用差异,并且可以在运行时更改设置,而不会丢失现有连接。

Firewalld与IPtables工作图

使用firewall-cmd配置防火墙设置

防火墙-cmd是作为主要防火墙软件包的一部分安装的。除非指定了--permanent选项,否则几乎所有命令都可以在运行时配置上使用。使用选项--zone = <ZONE>指定应用规则的区域。如果省略了--zone,则使用默认区域。

如果将更改应用到--permanent永久配置,则使用firewall-cmd --reload激活更改。

下表显示了一些常用的firewall-cmd命令及其说明:

--get zones列出所有可用区域
--get-default-zone获取当前默认区域
--get active zones列出所有绑定了接口或源并且当前正在使用的区域。
--set default zone=<zone>设置默认区域。这将同时更改运行时和永久配置。
--list-all-zones检索所有区域的所有信息–接口、端口、服务、源等
--list all[--zone=<zone>]列出<zone>的所有配置服务、端口、源和接口。如果未使用--zone=选项,则使用默认区域。
--add interface=<interface>[--zone=<zone>]将所有通过<interface>的流量路由到指定的区域。如果未提供--zone=选项,则使用默认区域。
--change interface=<interface>[--zone=<zone>]将接口与<zone>而不是其当前区域相关联。如果未提供--zone=选项,则使用默认区域。
--add source=<CIDR>[--zone=<zone>]将来自IP地址/网络<CIDR>的所有流量路由到指定的区域。如果未提供区域,则使用默认区域。
--remove source=<CIDR>[--zone=<zone>从指定区域中删除路由来自指定IP地址或网络的所有通信量的规则<CIDR>。如果没有指定区域选项,则使用默认区域。
--get services列出所有预定义的服务
--add service=<service>允许到<service>的流量。如果未提供--zone=选项,则使用默认区域。
--remove service=<service>从区域的允许列表中删除<service>。如果未提供--zone=选项,则使用默认区域。
--add port=<port/PROTOCOL>允许到<port/PROTOCOL>端口的通信。如果未提供--zone=选项,则使用默认区域。
--remove port=<port/PROTOCOL>从区域的允许列表中删除<port/PROTOCOL>端口。如果未提供--zone=选项,则使用默认区域。
--reload删除运行时配置并应用持久配置。

了解网络区域

防火墙可以根据用户决定放置的信任级别将网络划分为不同的区域。 Firewalld随附了许多预定义的区域,每个区域都有其预定用途。下表说明了更多信息:

trusted默认情况下,它允许所有传入流量
home默认情况下,拒绝传入流量,除非它与ssh、ipp客户端、mdns、samba客户端、dhcpv6客户端预定义服务或与传出通信相关
public默认情况下,拒绝传入流量,除非它与ssh、dhcpv6客户端预定义服务或与传出通信量相关。这是新添加的网络接口的默认区域。
internal默认情况下,拒绝传入流量,除非它与ssh、ipp客户端、mdns、samba客户端、dhcpv6客户端预定义服务或与传出通信相关–与主区域相同。
work默认情况下,拒绝传入流量,除非它与ssh、ipp客户端、dhcpv6客户端预定义服务或与传出通信量相关
dmz默认情况下,拒绝传入流量,除非它与ssh预定义服务匹配或与传出通信量相关。大多数用于非军事区,用于可公开访问内部网络的计算机
external默认情况下,拒绝传入流量,除非它与ssh预定义服务匹配或与传出通信量相关。通过该区域转发的IPv4的传出流量伪装成类似于来自传出网络接口的IPv4地址的流量。
block默认情况下,拒绝所有传入流量,除非与传出流量相关
drop默认情况下,删除所有传入流量,除非它与传出流量相关–不要以ICMP错误响应。

使用firewall-cmd示例

请考虑以下示例,以增强有关如何使用firewall-cmd的知识。首先,验证firewalld已启用并在系统上运行。

systemctl status firewalld.service

如果未运行,则可以使用以下命令启动并启用它:

systemctl start firewalld
systemctl enable firewalld

`1.'将默认区域设置为dmz。

firewall-cmd --set-default-zone=dmz
firewall-cmd --get-default-zone

2.将所有来自192.168.100.0/24网络的流量分配给可信区域并进行验证。

firewall-cmd --permanent --zone=trusted --add-source=192.168.100.0/24
firewall-cmd --reload
firewall-cmd --list-all --zone=trusted
firewall-cmd --get-active-zones

3.打开内部区域的HTTP和https流量。

firewall-cmd --permanent --add-service={http,https} --zone=internal
firewall-cmd --reload
firewall-cmd --list-services --zone=internal

要从区域中删除永久服务:

firewall-cmd --permanent [--zone=<zone>] --remove-service=<service>

4.过渡eth0接口到当前会话的内部区域:

firewall-cmd --zone=internal --change-interface=eth0

5.将eth1接口添加到本地区域:

firewall-cmd --zone=home --add-interface=eth1

接口管理的其他选项:

查询接口是否在区域中:

firewall-cmd [--zone=<zone>] --query-interface=<interface>

从区域中删除接口:

firewall-cmd [--zone=<zone>] --remove-interface=<interface>

6.启用在本地区域伪装

firewall-cmd --zone=home --add-masquerade

禁止在区域伪装

firewall-cmd [--zone=<zone>] --remove-masquerade

查询区域中的伪装

firewall-cmd [--zone=<zone>] --query-masquerade

禁止在区域中永久伪装

firewall-cmd --permanent [--zone=<zone>] --remove-masquerade

7.在本地区域中永久启用mysql的端口3306/tcp

firewall-cmd --permanent --zone=home --add-port=3306/tcp

在区域中永久禁用端口和协议组合

firewall-cmd --permanent [--zone=<zone>] --remove-port=<port>[-<port>]/<protocol>

8.在公共区域中阻止回显消息

firewall-cmd --zone=public --add-icmp-block=echo-reply

9.将ssh转发到内部区域中的主机192.168.10.5

firewall-cmd --zone=home --add-forward-port=port=22:proto=tcp:toaddr=192.168.10.5

参考文献

手册页:

man firewall-cmd 
man firewalld
man firewalld.zones
man firewall.zone
man firewall-config