Linux: bloqueando uma enorme lista de IPs?

4

Qual é a maneira mais eficiente de bloquear o acesso a 8-10k endereços IP?

Meu servidor roda o EngineX no Debian.

Se possível, gostaria de mostrar a todos os endereços um erro interno do servidor (500).

Os IPs estão espalhados e não estão em nenhum subconjunto específico.

    
por Miko 11.04.2010 / 00:20

3 respostas

5

se os endereços estiverem agrupados em uma ou poucas sub-redes contínuas [por exemplo, poucos / 24s] - criaria uma regra simples de redirecionamento que DNAT todo o tráfego na porta 80 para algo que estivesse escutando na porta 81 [eg vhost from nginx] apenas serviria a página de erro:

iptables -t nat -A PREROUTING -p tcp -s 194.88.0.0/16 --dport 80 -j REDIRECT --to 81

se este for 8-10k ips únicos espalhados 'all around' ... vai ser interessante; -] - eu ainda iria com o cenário acima, mas para correspondência eu usaria setet . algo assim:

ipset --create ban iphash
ipset --add ban 80.1.2.3
ipset --add ban 90.4.5.6
ipset --add ban 153.17.18.19
# ....
iptables -t nat -A PREROUTING -p tcp -m set --set ban src --dport 80 -j REDIRECT --to 81
    
por 11.04.2010 / 00:36
1

Pode dar uma olhada em: link Ele lida com um grande número de regras muito bem. Se houver um padrão nos IPs que você está tentando bloquear, use a regra MATCH. A regra de pré-formatação do pQd funcionaria bem com o nf-hipac, que usa uma tabela de hash para armazenar as regras e é consideravelmente mais rápida do que as pesquisas padrão do iptables.

Você pode escrever o conjunto de regras em negar linhas no seu bloco de localização. Para simplificar, você poderia incluir um arquivo que incluísse seus blocos de negação e recarregasse a configuração de hora em hora. Como seria dentro do arquivo de configuração do nginx, ele não deveria afetar muito o desempenho.

    
por 11.04.2010 / 01:26
1

Se você tiver uma lista desses endereços em um arquivo, tente o seguinte na configuração do Nginx:

1 Defina um grupo de IP usando a diretiva geográfica (dentro do bloco http):

http {
...
  geo $block {
    default 0;
    include blacklist; 
  }
...
}

Isso significa que a variável $ block será definida como 0 por padrão.

2 Prepare um arquivo de lista negra para ficar assim:

192.168.0.0/24 1;
192.168.2.0/24 1;
10.0.0.0/8 1;

Ou seja, defina variável $ block como 1 para esses endereços.

3 Dentro do bloco "location", verifique esta variável e relate o erro 500 se for 1:

 if ($block = 1) {
   return 500;
 }

PS: A eficiência desta solução é discutível, uma vez que as conexões de IPs proibidos são aceitas () e passadas para o servidor web. No entanto, se esta pequena sobrecarga não é crítica para o seu host, eu prefiro fazê-lo com o Nginx, não com o iptables.

    
por 13.04.2010 / 09:45