使用 pf 防火墙阻止 Google 请求达到 16k

使用 pf 防火墙阻止 Google 请求达到 16k

我想使用以下方式阻止访问 Google 搜索PF在 24 小时内收到来自运行 FreeBSD 9 的主机的 17500 个请求(建立连接)的阈值之后。

我读完后想到的是pf 常见问题这是规则:

pass out on $net proto tcp from any to 'www.google.com' port www flags S/SA keep state (max-src-conn 200, max-src-conn-rate 17500/86400)

笔记:86400 是 24 小时,以秒为单位。

该规则应该有效,但 PF 足够聪明,知道 www.google.com 解析为 5 个不同的 IP。所以我的pfctl -sr输出是这样的:

pass out on vte0 inet proto tcp from any to 173.194.44.81 port = http flags S/SA keep state (source-track rule, max-src-conn 200, max-src-conn-rate 17500/86400, src.track 86400)
pass out on vte0 inet proto tcp from any to 173.194.44.82 port = http flags S/SA keep state (source-track rule, max-src-conn 200, max-src-conn-rate 17500/86400, src.track 86400)
pass out on vte0 inet proto tcp from any to 173.194.44.83 port = http flags S/SA keep state (source-track rule, max-src-conn 200, max-src-conn-rate 17500/86400, src.track 86400)
pass out on vte0 inet proto tcp from any to 173.194.44.80 port = http flags S/SA keep state (source-track rule, max-src-conn 200, max-src-conn-rate 17500/86400, src.track 86400)
pass out on vte0 inet proto tcp from any to 173.194.44.84 port = http flags S/SA keep state (source-track rule, max-src-conn 200, max-src-conn-rate 17500/86400, src.track 86400)

PF 创建了 5 条不同的规则,每个 IP 对应一条,供 Google 解析。不过我感觉 -由于不确定,我没有机会测试它- 17500/86400 这个数字适用于每个 IP。如果是这样的话 -请确认- 那么这不是我想要的。

在 pf-faq 中有另一个选项叫做source-track-global

源轨

This option enables the tracking of number of states created per source IP
address. This option has two formats:

  + source-track rule - The maximum number of states created by this rule
    is limited by the rule's max-src-nodes and max-src-states options.
    Only state entries created by this particular rule count toward the
    rule's limits.

  + source-track global - The number of states created by all rules that
    use this option is limited. Each rule can specify different
    max-src-nodes and max-src-states options, however state entries
    created by any participating rule count towards each individual rule's
    limits.

The total number of source IP addresses tracked globally can be controlled
via the src-nodes runtime option.

我尝试申请源轨道全局在上述规则中没有成功。我该如何使用此选项来实现我的目标?

由于我是一名业余爱好者并且还不完全了解 PF,因此非常欢迎任何想法或评论。

谢谢

答案1

source-track选项确实适用于每个规则,因此您并没有限制“Google 到 X req/day”,而是将每个单独的地址限制在该限制内。

我在这里给你两个解决方案。一个简单而近似,另一个则更难也更尖锐。

解决方案 1

转换条件,以便在一条规则中匹配所有感兴趣的服务器。最简单的方法是使用 CIDR 规范,例如:

pass out on vte0 inet proto tcp from any to 173.194.44.80/29 port http keep state (source-track rule, max-src-conn 200, max-src-conn-rate 17500/86400, src.track 86400)

这将匹配主机 173.194.44.80 到 173.194.44.86:比您想要的多两个。您以 10% 的复杂性实现了 99% 的目标。在大多数情况下,我会采用这种方式。这个特定案例很特别,因为 Google 是世界上拥有多个网络块并经常重新指定其地址的 2-3 家公司之一。对于处理 google、yahoo 等,我不会采用这种解决方案。

解决方案 2

使用tag,这是 PF 的一大特色。标签允许您在包上贴上便条,然后根据便条应用规则。以下是您的案例示例:

pass out on vte0 proto tcp from any to 'www.google.com' port http tag TOGOOGLE pass out quick on vte0 proto tcp tagged TOGOOGLE keep state (source-track rule, max-src-conn 200, max-src-conn-rate 17500/86400, src.track 86400)

补充说明

  • 你不再需要flags S/SA:它是状态连接的默认设置
  • 指定按主机名匹配的防火墙规则是危险的

相关内容