使用 pf 防火牆阻止對 16k 的 Google 請求
我想在 24 小時內從執行 FreeBSD 9 的主機發出 17500 個請求(已建立連接)的門檻值後阻止使用PF訪問 Google 搜尋。
在閱讀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 解析為 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 條不同的規則,Google 解析的每個 IP 1 條。但是我有一種感覺——沒有 100% 的把握,我沒有機會測試它——數字 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.
我試圖在上述規則中應用**source-track-global ,但沒有成功。**我如何使用此選項來實現我的目標?
任何想法或評論都非常受歡迎,因為我是一個業餘愛好者並且還不完全了解 PF。
謝謝
該
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
:這是有狀態連接的預設設置- 指定與主機名匹配的防火牆規則是危險的