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

0

O fechamento de conexões TCP órfãs é surpreendentemente difícil no Linux. Este problema foi levantado aqui , aqui , aqui e aqui ; no entanto, nenhuma das abordagens funcionou para mim.

Chamar close() não funciona porque não há processo associado. A instalação de CurrPorts não funcionará porque não estou no Windows. A abordagem de definir tcp_max_orphans para zero não é bem-sucedida (e suponho que, mesmo que isso ocorresse, não eliminaria a conexão imediatamente). A execução de tcpkill não funciona porque não há tráfego ativo. A execução de killcx falha com no response from child, operation may have failed . O tcp_killer do Google falha com Socket not found for connection . Definir tempo de espera curto e esperar por isso não é uma opção porque eu preciso reutilizar o IP e a porta imediatamente.

Em todo esse netstat -tp mostra persistentemente que a conexão está ativa:

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

Qual é a maneira de eliminar imediatamente esta conexão TCP?

    
por vasilyrud 16.06.2018 / 14:11

1 resposta

1

A melhor solução que eu já vi (embora um pouco bruta), é esse bom módulo do kernel chamado drop-tcp -sock feita por outro usuário da comunidade do StackExchange. Ele usa inet_twsk_deschedule_put() do kernel do Linux e, embora essa função seja obrigatória a matar conexões TCP no estado TIME_WAIT , 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
    
por 16.06.2018 / 15:29