Questão Como matar imediatamente a conexão TCP órfã?


O fechamento de conexões TCP órfãs é surpreendentemente difícil no Linux. Esta questão foi levantada Aqui, Aqui, Aquie Aqui; no entanto, nenhuma das abordagens funcionou para mim.

Chamando close() não funciona porque não há processo associado. Instalando CurrPorts não funciona porque não estou no Windows. A abordagem de estabelecer tcp_max_orphans para zero não tem sucesso (e eu suponho que, mesmo que fosse, não mataria a conexão imediatamente). Corrida tcpkill não funciona porque não há tráfego ativo. Corrida killcx falha com no response from child, operation may have failed. Do Google tcp_killer falha com Socket not found for connection. Definir tempo de espera curto e esperar por isso não é uma opção, pois preciso reutilizar o IP e a porta imediatamente.

Ao longo de tudo isso netstat -tp mostra persistentemente que a conexão está viva:

Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0    156 localhost:54494         localhost:xmpp-client   FIN_WAIT1   -

Qual é o caminho para matar imediatamente esta conexão TCP?


0


origem




Respostas:


A melhor solução que eu já vi (embora um pouco de força bruta), é esse bom módulo do kernel chamado gota-tcp-meia feita por outro do utilizador da comunidade do StackExchange. Usa inet_twsk_deschedule_put() do kernel do Linux e, embora essa função seja destinada a forçar a eliminação de conexões TCP no TIME_WAIT estado, funcionou para matar FIN_WAIT1 também.

Este módulo pode ser carregado com:

git clone https://github.com/milabs/drop-tcp-sock.git
cd drop-tcp-sock && make
insmod ./drop-tcp-sock.ko

e depois usado (no meu cenário) com:

echo "127.0.0.1:54494 127.0.0.1:5222" >/proc/net/tcpdropsock

1