Bloquear solicitações do Google para 16k usando o firewall pf

5

Gostaria de bloquear o acesso à pesquisa do Google usando o PF após o limite de 175.000 solicitações (conexão estabelecida) em 24h, de um host executando o FreeBSD 9.

O que eu criei depois de ler pf-faq é esta regra:

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)

NOTA: 86400 são 24 horas em segundos.

A regra deve funcionar, mas a PF é inteligente o suficiente para saber que www.google.com resolve em 5 IPs diferentes. Então, minha pfctl -sr output me dá isso:

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)

O PF cria 5 regras diferentes, 1 para cada IP que o Google resolve. No entanto, tenho o bom senso - sem ter 100% de certeza, não tive a chance de testá-lo - que o número 17500/86400 se aplica a cada IP. Se for esse o caso - por favor confirme - então não é o que eu quero.

No pf-faq, há outra opção chamada source-track-global :

source-track

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.

Eu tentei aplicar source-track-global na regra acima sem sucesso. Como posso usar essa opção para atingir meu objetivo?

Quaisquer pensamentos ou comentários são mais do que bem-vindos, já que sou um amador e ainda não entendo completamente o PF.

Obrigado

    
por atmosx 31.10.2012 / 15:51

1 resposta

4

A opção source-track se aplica por regra, portanto, se você não estiver restringindo "Google a X req / day", estará restringindo cada endereço individual a esse limite.

Dou-lhe duas soluções aqui. Uma é simples e aproximada, a outra é mais difícil e mais nítida.

Solução 1

Transforme a condição para corresponder todos os servidores de interesse em uma regra. A abordagem mais simples é usar uma especificação CIDR, por exemplo:

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)

Isso corresponde aos hosts 173.194.44.80 a 173.194.44.86: mais dois do que você deseja. Você obtém 99% do objetivo com 10% da complexidade. Para a maioria dos casos eu iria por este caminho. Esse caso específico é particular porque o Google é uma das organizações de 2 a 3 no mundo que possui um grande número de redes e que frequentemente reafirma seus endereços. Para lidar com o google, yahoo etc eu não iria para esta solução.

Solução 2

Use tag , uma beleza muito própria do PF. As tags permitem que você insira uma nota em um pacote e aplique regras posteriormente, com base nela. Veja um exemplo para o seu caso:

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)

Notas laterais

  • você não precisa mais de flags S/SA : é o padrão para conexões com estado
  • especificar regras de firewall que correspondam por nome de host é perigoso
por 22.11.2012 / 05:32