atm*_*osx 5 security freebsd firewall pf filtering
我想在 24 小时内从运行 FreeBSD 9 的主机发出 17500 个请求(已建立连接)的阈值后,阻止使用PF访问 Google 搜索。
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)
Run Code Online (Sandbox Code Playgroud)
注意: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)
Run Code Online (Sandbox Code Playgroud)
PF 创建了 5 个不同的规则,Google 解析的每个 IP 对应一个规则。但是我有一种感觉 -没有 100% 确定,我没有机会测试它- 数字 17500/86400 适用于每个 IP。如果是这种情况 -请确认- 那么这不是我想要的。
在 pf-faq 中还有一个选项叫做source-track-global:
源头跟踪
Run Code Online (Sandbox Code Playgroud)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 限制为 X 请求/天”,而是将每个单独的地址限制为该限制。
我在这里给你两个解决方案。一种是简单和近似的,另一种是更难和更尖锐的。
解决方案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% 的目标。对于大多数情况我会走这条路。这个具体案例很特殊,因为谷歌是世界上拥有多种网络区块并经常重新指定其地址的 2-3 个组织之一。为了处理谷歌、雅虎等,我不会采用这个解决方案。
解决方案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:它是有状态连接的默认设置