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

我想在运行FreeBSD 9的主机在24小时内发出17500个请求(build立连接)的阈值之后,阻止使用PF进行Googlesearch。

读完pf-faq后,我想到了这个规则:

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可以parsing5个不同的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创build了5个不同的规则,其中1个用于Googleparsing的每个IP。 但是我有这个意思 – 没有百分之一百确定,我没有机会去testing它 – 每个IP都适用17500/86400。 如果是这样 – 请确认 – 那不是我想要的。

在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. 

我试图在上述规则中应用source-track-global而没有成功。 我如何使用这个选项来实现我的目标?

任何想法或意见都非常值得欢迎,因为我是一个业余爱好者,并没有完全理解PF。

谢谢

source-track选项适用于每个规则,所以您不限制“Google to X req / day”,您将每个地址限制到该限制。

我在这里给你两个解决scheme。 一个是简单的,近似的,另一个更难更清晰。

解决scheme1

转换条件,以匹配所有感兴趣的服务器在一个规则。 最简单的方法是使用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:两个比你想要的。 你有99%的目标和10%的复杂性。 对于大多数情况下,我会这样做。 这个具体情况是特别的,因为Google是全球2-3个组织之一,拥有多个networking块并经常重新指定他们的地址。 对于处理谷歌,雅虎等我不会去这个解决scheme。

解决scheme2

使用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 :它是缺省状态连接
  • 指定与主机名匹配的防火墙规则是危险的