A primeira coisa a fazer é determinar o que está acontecendo. Tudo o que você sabe no momento é que o Apache não responde às vezes e, durante esses momentos, você tem muitas conexões TCP semiabertas. Você não sabe se as conexões TCP são a causa do problema ou apenas um sintoma .
Você tem algum sistema de monitoramento de desempenho como Cacti, Munin, Zabbix, Observium ou qualquer outra opção neste espaço? Se não, pegue um deles agora. Configure-os para representar graficamente todas as coisas normais, como uso de memória, média de carga, uso da CPU, espaço livre em disco, IOPS, uso de rede, etc, mas também pode ser útil adicionar métricas personalizadas, como solicitações por minuto ou estados TCP. Além disso, adicione os modelos que correspondam aos serviços que você está usando, como Apache, MySQL, memcached, etc.
Ao analisar os gráficos que essas ferramentas produzem, você deve poder encontrar o recurso que está atingindo 100% durante esses tempos de inatividade. A partir daí, você pode rastrear a cadeia de causa e efeito até o gatilho inicial que causou o problema. É possível que o recurso que está sendo esgotado não esteja sendo medido por você e possa nem estar sob seu controle.
Como um palpite, se suas conexões estiverem no estado SYN_SENT
, você provavelmente está usando a API de outra pessoa por meio de HTTP e elas estão inativas ou bloquearam você temporariamente. Se eles estiverem no estado SYN_RECV
, pode haver um problema de firewall que esteja impedindo que as respostas SYN-ACK
sejam recebidas pelo cliente ou que a resposta do cliente seja recebida por você. Também poderia ser a inundação SYN que você sugeriu.
Durante um verdadeiro SYN-flood, você verá a largura de banda e o número de pacotes por segundo aumentando significativamente. Use tcpdump -w packet-capture-file.cap
ou -j LOG
no iptables para registrar esses pacotes e ver se você consegue identificar um padrão. Talvez o endereço de origem seja sempre o mesmo, talvez esteja sempre em um intervalo pequeno, talvez um sinalizador de TCP estranho (como URG ou PSH) esteja definido. Se isso falhar, veja se os endereços IP envolvidos fazem várias tentativas de conexão. Em caso afirmativo, você pode adicioná-los a uma regra de DROP
em seu firewall para que seu sistema operacional não tenha que lidar com eles. Dependendo de quantos endereços IP diferentes existem, você pode precisar dividir suas regras em várias tabelas para reduzir o tamanho da lista que o iptables deve verificar.
O DDoS pode ser grande o suficiente para esgotar a largura de banda do seu provedor de hospedagem. Se esse for o caso, eles provavelmente precisarão ir a uma empresa de mitigação de DDoS dedicada. Esses caras usam DNS ou BGP para direcionar seu tráfego para eles, filtrar o tráfego de DDoS e enviar o restante para você. Eles geralmente não são baratos e você terá que pesar o custo do tempo de inatividade contra o custo do serviço de mitigação. Também existem serviços como o CloudFlare que podem impedir ataques DDoS até certos limites e ter planos de preços mais acessíveis.