Назад | Перейти на главную страницу

Блокировать запросы Google на 16k с помощью брандмауэра pf

Я хочу заблокировать доступ к поиску Google, используя PF после порога в 17500 запросов (соединение установлено) в течение 24 часов с хоста, на котором запущена FreeBSD 9.

Что я придумал, прочитав 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 разных правил, по 1 для каждого IP-адреса, разрешаемого Google. Однако у меня есть разум - не будучи на 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.

Я пытался применить исходный трек-глобальный в приведенном выше правиле безуспешно. Как я могу использовать эту опцию для достижения своей цели?

Любые мысли или комментарии приветствуются, так как я любитель и еще не совсем понимаю 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: на два больше, чем вы хотите. Вы получаете 99% цели при 10% сложности. В большинстве случаев я бы пошел этим путем. Этот конкретный случай особенный, потому что Google - одна из 2-3 организаций в мире, которые владеют множеством сетевых блоков и часто повторно назначают свои адреса. Для работы с google, yahoo и т. Д. Я бы не стал использовать это решение.

Решение 2

Использовать 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: по умолчанию для соединений с отслеживанием состояния
  • указывать правила брандмауэра, совпадающие по имени хоста, опасно