Mitigação / prevenção de DDoS com nginx

1

(Para contornar o problema "é uma duplicata": não vejo muitos pedidos. O número é bastante pequeno. Em vez disso, cada pedido faz o download de muitos dados.)

O servidor do qual estou falando tem 2x10 GBit / s de conectividade com a Internet, com um backend de 40 GBit / s. Ele serve cerca de 20 TBytes de dados para o público, usando nginx / vsftpd / rsyncd em um sistema Debian Stable. Além disso, o apache2 é usado para exibir conteúdo não estático, mas isso pode ser desconsiderado.

O hardware é robusto o suficiente para servir até cerca de 18 GBit / seg (como observado uma vez), e o tráfego é gratuito. Como o servidor é um espelho do software de código aberto e de outros softwares públicos, também não há uma questão de que o tempo de inatividade seja um problema crítico.

No entanto, observo um padrão específico de ataque DDoS que gostaria de deixar de afetar o servidor. Sempre que o ataque está em andamento, a maioria dos ISOs de DVD do Debian (cerca de 300 GByte, muito mais do que o que se encaixa na RAM) é baixada por vários hosts, com downloads por arquivo repetidos. Dependendo de como o ataque é organizado, isso faz com que a largura de banda aumente bastante e, é claro, coloca um certo estresse no hardware, limitando a experiência para usuários legítimos do servidor ao mesmo tempo.

Nesses ataques, tipicamente 2-3 redes são coordenadas no ataque, cada um fazendo o download dos arquivos conforme descrito. Na maioria das vezes, um clique em hosters ou caches de arquivos de algum tipo são abusados, enganados e baixados repetidamente no mesmo arquivo - e isso é automatizado para baixar vários arquivos diferentes como parte do ataque.

Existe alguma maneira de configurar o nginx para proibir certos intervalos de IP? Ou limite as taxas de tráfego para, digamos, 1 GBit / seg para essas redes (por algum tempo)?

Eu não quero impor um limite geral, já que o servidor deve ser usado, mesmo para transferências de alta velocidade (espelho para espelho, provavelmente).

Como observação, um invasor inteligente, qualquer que seja a motivação, pode começar a abusar do FTP / RSYNC em vez do HTTP, trabalhando em torno das soluções que essa pergunta pode produzir.

Atualmente, quando percebo que um ataque DDoS está ocorrendo, examino os arquivos de log, identifico as redes que estão abusando e as bani manualmente.

    
por C-Otto 28.08.2016 / 23:12

2 respostas

1

Na verdade, você pode usar Nginx limit_req módulo e também Nginx limit_conn

Ambos os módulos são capazes de limitar as conexões de uma fonte específica e também de limitar pedidos feitos de IPs, e isso no seu caso pode ser muito útil

De acordo com o reuqest, o nginx também pode ser usado para limitar a largura de banda.

location ^~ /videos/ {
...
limit_rate_after 100m;
limit_rate 150k;
...
}

neste exemplo limit_rate_after 100m; nginx irá ( por cada conexão de usuário, esteja ciente disso ) a conexão de aceleração para um máximo de 150k . Então, por exemplo, se você precisa permitir até 100m de largura de banda total e, em seguida, restringir a velocidade, isso pode ajudá-lo.

Esteja ciente de que esta solução limita a velocidade de download do nginx por conexão, assim, se um usuário abrir vários arquivos de vídeo, ele poderá fazer o download de 150k xo número de vezes que ele se conectou aos arquivos de vídeo. Se você precisar definir um limite para as conexões, poderá fazer isso com as diretivas limit_zone e limit_conn . Exemplo:

Dentro da sua configuração de bloqueio de servidor:

limit_rate 128K; limit_zone one $binary_remote_addr 10m;

Dentro da configuração do seu bloco de localização:

limit_conn one 10;

Neste exemplo, permitiria 10 conexões por IP com 1 Mbit cada.

Créditos

    
por 29.08.2016 / 07:19
0

Você pode usar o fail2ban com a verificação de configuração dos registros de acesso do nginx. Existem muitos guias na Web que ajudam com isso.

É muito difícil bloquear esse tipo de ataque sem software / hardware especializado, que faz o reconhecimento de padrões. Você provavelmente poderia usar algum tipo de lista negra, embora eu não tenha certeza de que possa haver um que se adapte ao seu caso de uso.

Outra solução seria usar algum tipo de parede de javascript, que bloqueia o download, a menos que o navegador use javascript, mas isso é uma prática ruim e bloqueia usuários legítimos usando curl / wget.

    
por 01.03.2018 / 21:07

Tags