98% de uso de cpu no servidor Ubuntu executando o apache, o site não está respondendo

4

Eu rodei um servidor com o apache2 em uma caixa do Ubuntu. É um pool de mineração de criptografia. Tudo corria normal mesmo com o grande fluxo de pessoas acessando nosso site. Então, do nada nosso uso da CPU em todos os 8 núcleos está em 98 a 100%

Eu uso um proxy reverso na frente do servidor para ajudar a mitigar os ataques DDOS, mas isso é algo que eu nunca encontrei antes.

netstat -an | grep: 80 | grep SYN | wc -l dá uma saída de 100+ enquanto isso está acontecendo.

Matar o apache imediatamente baixa a carga para níveis normais e permite que meus clientes continuem a usar os outros serviços no servidor. Mas temos que ter nosso front end funcionando.

Eu tentei várias regras do iptables, mas elas não funcionam. Eu modifiquei meu sysctl de acordo com algumas sugestões:

net.ipv4.conf.default.rp_filter = 1
net.ipv4.conf.all.rp_filter = 1
net.ipv4.tcp_syncookies = 1
net.ipv4.conf.all.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0
net.ipv4.conf.all.send_redirects = 0
net.ipv4.conf.all.accept_source_route = 0
net.ipv6.conf.all.accept_source_route = 0
net.core.wmem_max = 16777216
net.core.rmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216
net.ipv4.tcp_mem = 128000 200000 262144
net.ipv4.tcp_syncookies = 1
net.ipv4.tcp_synack_retries = 1
net.ipv4.ip_local_port_range = 1024 65000
net.ipv4.tcp_max_syn_backlog = 8192
net.ipv4.tcp_max_tw_buckets = 1800000
net.ipv4.tcp_fin_timeout = 30
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_timestamps = 0
net.ipv4.tcp_tw_recycle = 1
vm.swappiness = 5
net.ipv4.tcp_syncookies = 1

mas isso não parece mitigar o problema.

Estou no fim e preciso colocar o site em funcionamento novamente.

QUALQUER e todas as sugestões serão apreciadas.

Obrigado.

    
por user3491412 03.04.2014 / 00:25

2 respostas

1

Você pode encontrar o número das 10 principais conexões TCP atuais (ou outro número) por IP com   netstat -tan| grep -v 'LISTEN'| awk '{print $5}'| grep -v 'and' |grep -v 'Address' |cut -d':' -f1 |sort -n | uniq -c | sort -rn | head -n10

E também os 10 principais IPs em arquivos de log do Apache com cd /var/log/apache2; for i in ./access.log*; do echo $i; cat $i | awk '{print $1}'| sort -n | uniq -c | sort -rn | head -n10; done

Depois de determinar os IPs abusivos, você pode bloqueá-los com iptables -A INPUT -s 1.2.3.4 -j DROP .

Você também pode limitar as conexões com iptables, por exemplo, se você não quiser mais de 20 conexões por minuto de uma fonte:

iptables -I INPUT -p tcp --dport 80 -m state --state NEW -m recent --set

iptables -I INPUT -p tcp --dport 80 -m state --state NEW -m recent --update --seconds 60 --hitcount 20 -j DROP

    
por 03.04.2014 / 03:48
1

Sua pergunta é um pouco geral demais para uma "resposta", mas tenho várias sugestões:

Primeiro , use seu arquivo hosts.deny para permitir que apenas os mocinhos ou excluir bandidos selecionados. Lembre-se de colocar suas redes locais em seu arquivo hosts.allow, que tem precedência. Você pode encontrar bandidos no seu log Apache, ou fazendo isso (exemplo real do log de hoje)

# BADGUYS=('grep "authentication failure.*rhost=" /var/log/auth.log | \
    sed 's/.*rhost=\(\S*\).*//' | \
    sort -u')
# echo ${BADGUYS[0]}
109.228.29.199

e agora bloqueie-os

# for GUY in ${BADGUYS[*]}; do
> echo "ALL: $GUY" >> /etc/hosts.deny
> done

Isso pode ajudar bastante para manter as coisas funcionando enquanto você descobre o melhor protocolo de firewall. Aviso de isenção : o snippet acima é uma amostra e não uma discussão ou solução completa. Conforme apresentado, ele provavelmente bloqueará alguns usuários legítimos que tiveram problemas para digitar sua senha, portanto, audite os resultados. É por isso que você quer suas redes locais em hosts.allow .

Segundo , instale DenyHosts ou fail2ban , que fazem o acima automaticamente. Eu tenho mais experiência com DenyHosts, mas parece estar caindo em desuso. Ele tem como alvo hosts que atacam seu serviço ssh, mas pode bloquear todos os serviços.

Terceiro , resolva o problema das regras do iptables. O Ubuntu não (ou não) carrega regras por padrão, mas existem vários métodos para torná-lo persistente. Confira o pacote iptables-persistent .

    
por 18.07.2014 / 21:52