我们上一篇通过一个网络拓扑展示了rich规则配置的技术细节,并且我们用rich规则也配置了如何简单地阻止不可信的网络对防火墙的骚扰。我们本篇会深入讨论firewalld对icmp的配置
ICMP协议简介
互联网控制消息协议(ICMP)是各种网络设备用来发送错误消息和操作信息的支持协议,所述错误消息和操作信息指示连接问题,例如,所请求的服务不可用。ICMP不同于TCP和UDP等传输协议,因为它不用于在系统之间交换数据。
遗憾的是,互联网总有人可能会使用ICMP消息,特别是回应请求和回应回复,泄露有关您的网络的信息,并将这些信息滥用于各种欺诈活动。因此,firewalld可以阻止ICMP请求以保护您的网络信息。
如何阻止和启用ICMP?
首先,使用以下命令检查我们正在使用的ICMP类型。
firewall-cmd --get-icmptypes
要在指定区域上添加icmp阻塞,可以使用以下命令。 例如,这里我要在external区域添加icmp阻塞,在阻止之前,只需执行icmp ping即可确认icmp阻塞的状态。
当您的服务器阻止ICMP请求时,它不会提供通常会提供的信息。然而,这并不意味着没有提供任何信息。客户端接收特定ICMP请求被阻止(拒绝)的信息。应该仔细考虑阻止ICMP请求,因为它可能会导致通信问题,尤其是IPv6流量。
要查看ICMP请求当前是否被阻止,请执行以下操作:
firewall-cmd --zone=external --query-icmp-block=echo-request
如果返回no的话,要阻止ICMP请求,请执行以下操作:
firewall-cmd --zone=external --add-icmp-block=echo-request
firewall-cmd --zone=external --add-icmp-block=echo-reply
firewall-cmd --runtime-to-permanent
检查一下配置,貌似没什么问题?
firewalld在icmp处理上有些bug,即便你已经使用持久配置了,也不会立即生效的,此时建议还是reload一下。
但从上图的icmp阻塞来说不如理想,我仍然能从192.168.50.17的主机得到防火墙的Packet filtered的错误反馈,这不是告知嗅探者你防火墙的存在吗!只是防火墙把他正在阻止了,我们需要的是不返回任何信息。
在完全不提供任何信息的情况下阻止ICMP请求
要完全隐藏此信息,您必须丢弃所有ICMP请求,这是以前iptables防火墙一贯使用的DROP大法。
- 首先,将external的target设定为DROP
firewall-cmd --zone=external --set-target=DROP --permanent
firewall-cmd --reload
验证external区域的target是否为DROP?
注意:不要迷信firewalld会对ICMP数据包的过滤会动态生效的,在没有reload之前,你原先在客户端测试icmp请求依然显式答应。
我们在192.168.50.0/24找其他主机测试一下ping是否没返回任何错误信息,如下图在一台Linux主机中显示"0 received 100% packet loss"
在Windows主机中,同样没有接收到任何数据包
现在,除非您显式允许的流量除外,所有流量(包括ICMP请求)都将被丢弃。
要阻止和丢弃某些ICMP请求并允许其他请求,请执行以下操作:
Redhat推荐使用icmp-block-inversion的命令选项,我是不建议使用,这种黑白颠倒的操作一旦时间久远,你看回防火墙配置会感觉很别扭。
最简单的方式是使用上一篇提到的rich规则,假设网络拓扑中192.168.50.10是我们可信的主机,且是固定的ip地址,和防火墙不定时地测试彼此是否在线,此时我们只需定义一条rich规则允许192.168.50.10向防火墙发起ICMP请求。规则如下
网友评论