RHEL7和CentOS 7上的Firewalld入门
在本指南中,我们将深入研究端口安全和使用防火墙保护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