使用 pf 阻止来自特定 IP 的 ICMP 洪水攻击

使用 pf 阻止来自特定 IP 的 ICMP 洪水攻击

我的 system.log 中收到很多 ICMP 限制消息:

Apr 11 20:45:28 kernel[0]: Limiting icmp unreach response from 1054 to 250 packets per second
Apr 11 20:45:29 kernel[0]: Limiting icmp unreach response from 529 to 250 packets per second

我发现流量来自一个主机,通过运行sudo tcpdump -ni en0 "icmp[0]=3 and icmp[1]=3"

20:48:32.614241 IP 64.........125 > 185.......98: ICMP 64.......125 udp port 27960 unreachable, length 36
20:48:32.616923 IP 64.......125 > 185.......98: ICMP 64.......125 udp port 27960 unreachable, length 36

64.......125我的服务器 IP 在哪里?我假设185.......98请求者是谁(这是在数千行日志中看到的唯一 IP)

我尝试pf将此 IP 列入黑名单,阻止 ICMP 访问此端口(或者一般来说,因为 ICMP 似乎不是基于端口的?),并尝试使用自定义规则来阻止:

block drop on en0 inet proto icmp from 64.......125 to 185.......98
block drop on en0 inet proto icmp from 185.......98 to 64.......125

无论我如何尝试 pf,我仍然可以看到 system.log 和 tcpdump 活动。

我是否正确解释了这些tcpdump行?(克拉方向使它看起来好像只是出站数据包?)

我的理解是 pf 阻止数据包到达内核,因此如果配置正确,这些消息就会消失。对吗?

如果不正确,我是否需要根据请求采取行动,还是应该按照说明使日志行无效?

pf如果相关的话,我正在使用 IceFloor 在 OS X 10.8.5 上进行配置。

答案1

问题在于,您的服务器收到了大量发送到端口 27960 的 UDP 数据包,并通过发送 ICMP 目标端口无法访问错误消息进行响应。ICMP 限制是指内核尽职尽责地限制您的服务器的出站 ICMP 错误响应以应对大量传入的 UDP 数据包。

我怀疑这个端口以前被使用过,允许规则可能仍在 pf.conf 中。如果防火墙阻止了所有入站 UDP 连接,那么您的服务器将不会对 UDP 数据包生成任何 ICMP 错误响应。

您的 pf 过滤规则配置为阻止 icmp,而该规则应该配置为阻止 UDP 洪水,例如:

block drop in quick on re0 inet proto udp from 185.......98 to 64.......125 port 27960

如果 UDP 端口实际上对一个或多个服务开放,则仅阻止出站 ICMP“目标端口不可达”消息,从而有助于缓解此类 DoS 攻击:

IPv4(ICMP 类型 3,代码 3)

block out on $ext_if inet proto icmp icmp-type unreach code port-unr

IPv6(ICMP6 类型 1,代码 4)

block out on $ext_if inet6 proto icmp6 icmp6-type unreach code port-unr

答案2

也许所有“udp 端口​​ 27960 无法访问”消息都是由于先前打开的连接未正确关闭而导致的?

我注意到从给定的IP到该端口有连接打开。

重新启动并再次使用 tcpdump 观察后,流量似乎更加正常(一小时内有少量不同的 IP 查看各个端口)。

很高兴听到关于为什么 pf 最初没有阻止此活动的可能解释,但现在看来没问题。

相关内容