O uso do destino DROP do iptables resultará no soquete CLOSE_WAIT que nunca será concluído?

5

Eu tenho algumas regras simples para bloquear certos blocos de IP usados com frequência por hackers / spammers, por exemplo:

iptables -A INPUT -s 173.208.250.0/24 -j DROP

Mas notei que o apache trava depois de alguns dias com muitos CLOSE_WAITs aparecendo na saída do netstat que nunca desaparecem:

# netstat -atlpn 
Active Internet connections (servers and established) 
Proto Recv-Q Send-Q Local Address Foreign   Address State PID/Program name 
tcp 1 0 ::ffff:10.0.0.107:80 ::ffff:173.208.250.123.50813 CLOSE_WAIT 29125/httpd

Isso pode ser causado pela especificação do destino DROP na regra? Devo usar o REJECT?

    
por AlJo 23.11.2013 / 19:50

1 resposta

5

Could this be caused by specifying the DROP target in the rule?

Não.

Should I use REJECT instead?

Não.

Um alvo DROP nessa regra na cadeia INPUT significará que o Apache nunca verá o primeiro pacote SYN ou qualquer pacote com esse endereço de origem. Sem estabelecer uma conexão, ela nunca terminará no estado CLOSE_WAIT. Veja o diagrama de estado da Wikipedia abaixo:

Como você pode ver, CLOSE_WAIT só acontece depois de uma sessão estabelecida e somente no servidor se o cliente iniciar o fechamento da sessão. Com o KeepAlive, a sessão fica aberta até que um dos clientes ou o servidor atinja seu tempo limite e encerre ativamente a sessão.

É comum que o servidor atinja esse tempo limite e feche a sessão, levando o servidor a acabar com muitas conexões no estado TIME_WAIT. Eles permanecerão nesse estado por dois minutos por padrão, mas isso raramente causará um problema. Conexões TIME_WAIT (no Linux) ligam uma combinação IP / porta, mas você não ficará sem essas até que você tenha aproximadamente 30.000 conexões no estado TIME_WAIT.

O intervalo de endereços de origem na sua regra não corresponde ao endereço IP no estado CLOSE_WAIT no seu exemplo.

O REJECT é educado para ser usado por pessoas educadas se, por alguma razão, você não conseguir aceitar suas conexões, pois isso permite que eles fechem a conexão imediatamente, mas para hackers / spammers não há necessidade de ser educado. Faça com que eles esperem pelo tempo limite configurado.

Então, o que pode causar conexões no estado CLOSE_WAIT? O cliente envia um FIN, o servidor responde com um FIN / ACK e aguarda o ACK final. Se ele nunca recebeu o ACK final, ele fica preso até que algo mais aconteça, como reiniciar o Apache.

O rastreamento de estado de conexão incorreto em outro código (como um firewall de hardware) pode causar isso, assim como problemas no final do cliente. Eu não sabia ao certo o que está causando seu problema específico.

    
por 23.11.2013 / 21:20