web-dev-qa-db-ja.com

pfファイアウォールを使用して16kへのGoogleリクエストをブロックする

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を完全に理解していないので、どんな考えやコメントでも大歓迎です。

ありがとう

5
atmosx

_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_:ステートフル接続のデフォルトです
  • ホスト名で一致するファイアウォールルールを指定することは危険です
4
michele