Спочатку від: http://rtomaszewski.blogspot.sk/2012/11/how-to-forcibly-kill-established-tcp.html
Щоб "вбити" сокет, потрібно надіслати пакет скидання TCP. Щоб надіслати його (і прийняти його іншою стороною), ви повинні знати фактичний номер послідовності TCP.
1) Уже згаданий tcpkill
метод дізнається номер SEQ, пасивно нюхаючи по мережі і чекаючи, коли дійсні пакети цього з'єднання надійдуть. Потім він використовує вивчений номер SEQ для надсилання пакетів RSET в обидві сторони. Однак якщо з'єднання в режимі очікування / повішене і дані не перетікають, воно нічого не зробить і буде чекати вічно.
2) Інший метод використовує сценарій perl, який називається killcx
( посилання на Sourceforge ). Це активно надсилає підроблені SYN-пакети та дізнається номер SEQ з відповіді. Потім він надсилає пакети RSET так само, як і tcpkill
.
Альтернативно підхід (заснований на тому, що ви хочете досягти) полягає у використанні gdb
налагоджувача для приєднання до процесу, що володіє цим сокетом / з'єднанням, та видача close()
syscall від його імені - як детальніше у цій відповіді .
Якщо ви хочете мати справу лише з повішеними з'єднаннями (інша сторона мертва), існують різні тайм-аути (наприклад, TCP keepalive), які повинні автоматично закрити такі з'єднання, якщо їх правильно налаштувати в системі.
ss
команди набагато простіша та загальніша, ніж інші.