FreeBSD 9を実行しているホストから、24時間で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は、Googleが解決するIPごとに1つずつ、5つの異なるルールを作成します。ただし、100%確信が持てず、テストする機会がありませんでした-各IPに1750/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」を制限するのではなく、個々のアドレスをその制限に制限します。
ここで2つの解決策を示します。 1つは単純で近似的で、もう1つはより硬くて鋭いです。
ソリューション1
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に一致します。必要な数より2つ多くなります。複雑さの10%で目標の99%を取得します。ほとんどの場合、私はこのように行きます。この特定のケースは、Googleが多様なネットブロックを所有し、しばしばそれらのアドレスを再任命する世界で2〜3の組織の1つであるために特別です。グーグル、ヤフーなどを扱うために、私はこの解決策には行きません。
ソリューション2
PFの非常に独自の美しさであるtag
を使用します。タグを使用すると、パケットにメモを貼り付けて、後でそれに基づいてルールを適用できます。これがあなたのケースの例です:
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
_:ステートフル接続のデフォルトです