Закрытие потерянных TCP-соединений на удивление сложно в Linux. Этот вопрос поднимался здесь, здесь, здесь и здесь ; однако ни один из подходов не работал для меня.

Вызов close() не работает, потому что нет связанного процесса. Установка CurrPorts не будет работать, потому что я не на Windows. Подход к установке значения tcp_max_orphans равным нулю не увенчался успехом (и я предполагаю, что даже если бы он это сделал , это не могло бы немедленно разорвать соединение). Запуск tcpkill не работает, потому что нет активного трафика. Запуск killcx завершается сбоем no response from child, operation may have failed завершилась неудачно Сбой tcp_killer от Google с Socket not found for connection . Установка короткого тайм-аута и ожидание его не вариант, потому что я должен немедленно повторно использовать IP и порт.

На протяжении всего этого netstat -tp постоянно показывает, что соединение живо:

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

Какой способ немедленно убить это TCP соединение?

1 ответ1

1

Лучшее решение, с которым я сталкивался (хотя и немного грубо), это замечательный модуль ядра drop-tcp-sock, созданный другим пользователем сообщества StackExchange. Он использует inet_twsk_deschedule_put() ядра Linux, и хотя эта функция предназначена для принудительного уничтожения TCP-соединений в TIME_WAIT , она также работает для уничтожения FIN_WAIT1 .

Этот модуль может быть загружен с:

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

а затем используется (в моем сценарии) с:

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

Всё ещё ищете ответ? Посмотрите другие вопросы с метками .