O verniz demora a iniciar com uma ACL grande

2

Eu tenho um arquivo de configuração de verniz que se parece com isso:

 backend web1 { .host = "1.2.3.1" ; ... }
 backend web2 { .host = "1.2.3.2" ; ... }
 backend web3 { .host = "1.2.3.3" ; ... }
 backend web4 { .host = "1.2.3.4" ; ... }


 director default_director round-robin {
   { .backend = web1; }
   { .backend = web2; }
   { .backend = web3; }
   { .backend = web4; }
 }

 include "blacklist.vcl";

 sub vcl_recv
 {
     if (client.ip ~ blacklist ) {
          error 403 "You're blacklisted";
     }
     ..
 }

A entrada na lista negra consiste em sites que eu não quero acessar meu servidor, obviamente.

Infelizmente, meu arquivo de lista negra é grande e está ficando maior a cada dia / semana:

  $ wc -l varnish/blacklist.vcl 
  6664 varnish/blacklist.vcl

Eu mudei de blocking / 32s para blocking / 24s para reduzir a lista, mas ainda não consigo reiniciar o verniz em menos de 5 segundos.

Existe mais alguma coisa que eu possa fazer para carregar uma lista negra? Eu percebo que eu poderia usar o iptables, mas isso também é lento para uma entrada tão grande - já que eu tenho que apagá-los e recarregá-los quando houver alguma mudança.

    
por Steve Kemp 13.04.2013 / 00:42

2 respostas

3

Isso pode não ser o que você está procurando, se quiser apenas resolver o tempo necessário para reiniciar o verniz - mas, para recarregar a configuração, tenho a seguinte solução para você;

A configuração do Varnish é convertida em código-fonte C e compilada no carregamento. Portanto, o tempo necessário para carregar a configuração inclui tempo de compilação. É mais provável que isso esteja causando a longa espera por você.

Você pode usar o varnishadmin para carregar uma nova configuração, como esta:

# varnishadm
vcl.load my_alias_2013-04-13 /etc/varnish/config.vcl
vcl.use my_alias_2013-04-13

O exemplo acima também produzirá informações de depuração muito úteis se houver algo sintaticamente errado com o VCL. Ele não limpará seu cache nem interromperá o serviço. O vcl.use basicamente carrega um arquivo .so embutido e altera alguns ponteiros na memória - o que facilita a execução durante o tempo de execução sem precisar reiniciar o serviço inteiro.

    
por 13.04.2013 / 01:19
3

O verniz é particularmente ruim com isso, o código C gerado para fazer isso é, na verdade, uma busca linear - tão ruim quanto adicionar regras individuais ao iptables.

Mas, você pode usar o iptables e torná-lo rápido também.

Use ipset em seu lugar. IPSets são rápidas pesquisas hash de ips, é muito rápido para encontrar um ip em um grande número de endereços.

Crie um ipset com o comando:

ipset create myset hash:ip

Isso gerará o conjunto onde você coloca seus endereços.

Em seguida, adicione seus ips ao conjunto.

ipset add myset 1.1.1.1
ipset add myset 1.1.1.2
ipset add myset 1.1.1.3
ipset add myset 1.1.1.4
...

Por fim, adicione uma regra ao IPtables para usar esse conjunto para realizar uma correspondência.

iptables -N VARNISH_BL
iptables -I VARNISH_BL -m set --match-set myset src -j REJECT
iptables -I INPUT -m tcp -p tcp --dport 80 -m conntrack --ctstate NEW -j VARNISH_BL
iptables -I INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT

Você pode despejar o conjunto para reinicialização posterior (após uma reinicialização, por exemplo) com ipset save myset , que é impresso no stdout. Você também pode, é claro, adicionar mais IPs ao conjunto a qualquer momento usando ipset add .

Você também pode querer que sua lista negra de IP expire automaticamente. ipset pode fazer isso também especificando um tempo limite padrão para qualquer IP adicionado ao conjunto no momento da criação com: ipset create myset hash:net timeout 86400

O padrão permite até 65535 hosts em um conjunto, mas verifique a página man, você pode criar conjuntos maiores usando o parâmetro maxelem .

    
por 13.04.2013 / 02:07

Tags