O Apache está funcionando, mas não responde (como solucionar o ataque DDoS)
Situação
Carga pesada no servidor.Todos os scripts de domínios estão bem
Nenhuma carga enorme ao ser verificada ao executar o comando 'top'.
Causa
Pode ser um ataque DDoSPor exemplo:
/var/log/apache2/error.log
:
[Mon Sep 23 14:33:34 2013] [error] [client 1.2.3.4] request failed: error reading the headers
Solução
Podemos confirmá-lo, verificando o resultado do comando netstat:# netstat -an|awk '/tcp/ {print $6}'|sort|uniq -c
Este comando mostrará os estados e o número de conexões nesse momento.Os diferentes estados visíveis principalmente em servidores são:
-
ESTABLISHED
- Conexões legítimas estabelecidas para o servidor -
SYN_SENT
- O cliente tentará ativamente estabelecer uma conexão. -
SYN_RECV
- Um pedido de conexão foi recebido da rede. -
FIN_WAIT
- O soquete está fechado e a conexão está desligada. -
TIME_WAIT
- O soquete está aguardando a conexão fechar para manusear pacotes ainda na rede. -
LISTEN
- O soquete está ouvindo (pronto) para as conexões entrantes. -
LAST_ACK
- A extremidade remota foi desligada e o soquete está fechado. Esperando reconhecimento.
SYN_SENT
,
SYN_RECV
,
TIME_WAIT
,
FIN_WAIT
são muito grandes, na taxa de 1000s, então o servidor certamente está sob ataque.Como primeiro passo, podemos ajustar os valores definidos para
SYN_SENT
,
SYN_RECV
,
TIME_WAIT
,
FIN_WAIT
no arquivo
/etc/sysctl.conf
.Reduza o valor da diretiva
net.ipv4.tcp_fin_timeout
para 3 ou 5.Por padrão é definido em 120.
Faça essas alterações no arquivo:
/etc/sysctl.conf
# Enable TCP SYN cookie protection
net.ipv4.tcp_syncookies = 1
# Decrease the time default value for tcp_fin_timeout connection
net.ipv4.tcp_fin_timeout = 3
# Turn off the tcp_window_scaling
net.ipv4.tcp_window_scaling = 0
# Turn off the tcp_sack
net.ipv4.tcp_sack = 0
Então execute o comando: # sysctl -p
Depois,
teremos que descobrir como o ataque está sendo executado, se é de IP
particular ou de um grande número de endereços IP para o servidor.
Se for de qualquer IP particular para o servidor, podemos corrigí-lo bloqueando o IP no firewall.
Se for de um grande número de IP com uma ou duas conexões, teremos que encontrar mais detalhes para detê-lo.
Mas
não será capaz de parar completamente o ataque DDOS, teremos que
ajustar algumas configurações no servidor para que o número de conexões
possa ser reduzido.
Uma vez que você entenda a porta, você precisa descobrir o ataque feito em um determinado domínio ou IP.
Uma vez que você entenda a porta, você precisa descobrir o ataque feito em um determinado domínio ou IP.
Suponha que o ataque seja feito na porta 80, então podemos ajustar as configurações do apache da seguinte maneira:
Depois de confirmar o ataque ao IP, precisamos descobrir se o ataque é feito para um domínio específico nesse IP ou para o IP como um todo.
-
Incremente o
MaxClients
para que possamos evitar que a condição do Apache atinja seu limite, já que o Apache não pode atender novos pedidos.MaxClients
pode ser configurado para um valor máximo do limite definido emServerLimit
-
Defina
KeepAlive on
para a definiçãoKeepAliveTimeout
-
KeepAliveTimeout
deve ser reduzido para 3 ou 5
MaxClients 500
KeepAlive On
KeepAliveTimeout 3
# /etc/init.d/httpd restart
Para reduzir o problema, precisamos descobrir se o ataque está em qualquer IP particular no servidor. Isso pode ser encontrado usando o seguinte comando:# netstat -lpan | grep SYN_RECV | awk '{print $4}' | cut -d: -f1 | sort | uniq -c | sort -nk 1
Depois de confirmar o ataque ao IP, precisamos descobrir se o ataque é feito para um domínio específico nesse IP ou para o IP como um todo.
Para isso, você pode verificar os logs de erro do apache ou o comando 'top'.
Além disso, você pode limitar o número de conexões pelo seguinte comando:
Além disso, você pode limitar o número de conexões pelo seguinte comando:
# iptables -I INPUT -i eth0 -p tcp --syn --dport 80 -m connlimit --connlimit-above 16 --connlimit-mask 24 -j REJECT
Aproveitem!
Comentários
Postar um comentário