Вбивство tcp-з'єднання в Linux


49

У мене є одне мертве з'єднання в одній програмі, яка знаходиться в повішеному стані, якщо машина клієнта загинула.

->192.168.1.214:49029 (ESTABLISHED)

Чи є спосіб скасувати цю опцію з командного рядка Linux без перезавантаження сервера?

Після пошуку я знайшов рішення під назвою tcpkill. Але це не спрацює для мене. Оскільки він постійно блокує ip.


Відповідь про використання ssкоманди набагато простіша та загальніша, ніж інші.
nealmcb

Відповіді:


35

Спочатку від: 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), які повинні автоматично закрити такі з'єднання, якщо їх правильно налаштувати в системі.


Чи спрацює це, якби ми просто закрили TCP-сокет його дескриптором файлів (fd)? exec fd> & -
Олександр Гончій

@AlexanderGonchiy для живих з'єднань це заважатиме процесу реагувати на пакети, тому це спричинить затримку з'єднання. Для простою з'єднань нічого не трапиться. Я не впевнений, чи буде ядро ​​щось надіслати в мережу після закриття fd.
Marki555

Я обнюхав порядковий номер. Що мені робити тоді?
користувач3132194

18

tcpkillможе зробити це за вас. В Ubuntu він знаходиться в dsniffпакеті.

Щось на зразок:

$ sudo tcpkill -i wlan0 host 192.168.1.214

(або якийсь tcpdumpподібний вираз для того, яке з'єднання вбити).


4
Це працює лише в тому випадку, якщо з'єднання передає що-небудь. Він не працюватиме підвішеним / непрацюючим TCP-з'єднанням (детальніше див. Мою відповідь)
Marki555

17

У ядрі Linux> = 4.9 ви можете використовувати ssкоманду з iproute2 за допомогою ключа-K

ss -K dst 192.168.1.214 dport = 49029

ядро повинно бути скомпільовано з CONFIG_INET_DIAG_DESTROYвключеною опцією.


1
Для Linux це справді найкращий спосіб і майже єдиний спосіб, якщо у вас є простої з'єднання ( tcpkillне можна працювати). Однак я визнаю, що я не перевіряв, killcxале здається, що багато програмного забезпечення для безпеки не дозволять йому працювати, якщо ви не модифікуєте свої iptables, щоб пропустити ці підроблені пакети.
Сет Робертсон

Дякую! Працював як шарм з sudo ss -K ....Ubuntu Bionic 18.04 LTS. У мене був tmuxпроцес, який застряг на невеликому розмірі екрана через віддалений, але мертвий, але не вичерпаний з’єднання. Все виправлено!
nealmcb

6

Do - як корінь netstat -tunp|grep 49029. В останньому стовпці виводу повинно бути вказано назву PID та програми процесу, відповідального за це з'єднання.

Якщо вам пощастило, є єдиний процес для саме цього з'єднання.

Якщо вам не пощастило, це ускладнюється (PID відповідає за більше, ніж лише одне з'єднання). Що це за послуга?

Чому ви хочете припинити цей сеанс?


8
Я не можу вбити цей процес. Це сервер-редуктор. Я хочу просто закрити зв’язок.
Vivek Goel

0

tcpkillне вдається закрити мертве (повішене) з'єднання. На його основі libpcapбудується пакет для відправленого FINпакету. Якщо з'єднання вже відмерло, воно не може отримати потрібний порядковий номер.

Єдиний спосіб полягає в тому, щоб закрити процес, так що робить всюди НЕ МОЖЛИВО.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.