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.