Mam pewne martwe połączenie w jednej aplikacji, która jest zawieszona, jeśli komputer kliencki jest martwy.
->192.168.1.214:49029 (ESTABLISHED)
Czy istnieje sposób na zakończenie tej opcji z wiersza poleceń systemu Linux bez ponownego uruchamiania serwera?
Po wyszukiwaniu znalazłem rozwiązanie o nazwie tcpkill. Ale to nie zadziała dla mnie. Ponieważ trwale blokuje ten ip.
ss
polecenia jest znacznie łatwiejsza i bardziej ogólna niż inne.Odpowiedzi:
Pochodzi z: http://rtomaszewski.blogspot.sk/2012/11/how-to-forcibly-kill-established-tcp.html
Aby „zabić” gniazdo, musisz wysłać pakiet resetowania TCP. Aby go wysłać (i zostać zaakceptowanym przez drugą stronę), musisz znać rzeczywisty numer sekwencyjny TCP.
1) Wspomniana już
tcpkill
metoda uczy się numeru SEQ poprzez pasywne wąchanie sieci i oczekiwanie na nadejście prawidłowych pakietów tego połączenia. Następnie wykorzystuje wyuczony numer SEQ do wysyłania pakietów RSET do obu stron. Jednak jeśli połączenie jest bezczynne / zawieszone i nie przepływa danych, nic nie zrobi i będzie czekać wiecznie.2) Inna metoda wykorzystuje skrypt Perla o nazwie
killcx
( link do Sourceforge ). To aktywnie wysyła sfałszowane pakiety SYN i uczy się numeru SEQ z odpowiedzi. Następnie wysyła pakiety RSET w taki sam sposób jaktcpkill
.Alternatywnym podejściem (w oparciu o to, co chcesz osiągnąć) jest użycie
gdb
debugera w celu przyłączenia się do procesu będącego właścicielem tego gniazda / połączenia i wydaniaclose()
w jego imieniu syscall - jak szczegółowo opisano w tej odpowiedzi .Jeśli chcesz poradzić sobie tylko z zawieszonymi połączeniami (druga strona jest martwa), istnieją różne limity czasu (na przykład utrzymywanie protokołu TCP), które powinny automatycznie zamykać takie połączenia, jeśli są poprawnie skonfigurowane w systemie.
źródło
tcpkill
może zrobić to dla ciebie. W Ubuntu jest wdsniff
pakiecie.Coś jak:
(lub inne
tcpdump
podobne wyrażenie określające, które połączenie należy zabić).źródło
W jądrze Linuksa> = 4.9 możesz użyć
ss
polecenia z iproute2 z klawiszem-K
jądro musi zostać skompilowane z
CONFIG_INET_DIAG_DESTROY
włączoną opcją.źródło
tcpkill
nie może działać). Przyznaję jednak, że nie sprawdziłem,killcx
ale wydaje się, że wiele programów zabezpieczających uniemożliwiłoby to działanie, chyba że zmodyfikujesz iptables, aby przepuścić te sfałszowane pakiety.sudo ss -K ....
Ubuntu Bionic 18.04 LTS. Miałemtmux
proces, który utknął na małym ekranie z powodu zdalnego, ale martwego, ale nie przekroczonego limitu czasu połączenia. Wszystko naprawione!Zrób - jako root
netstat -tunp|grep 49029
. Ostatnia kolumna danych wyjściowych powinna zawierać identyfikator PID i nazwę programu procesu odpowiedzialnego za to połączenie.Jeśli masz szczęście, istnieje tylko jeden proces dla tego połączenia.
Jeśli masz pecha, staje się to bardziej skomplikowane (PID odpowiada za więcej niż tylko jedno połączenie). Co to za usługa?
Dlaczego chcesz zakończyć tę sesję?
źródło
tcpkill
nie można zamknąć martwego (zawieszonego) połączenia. Jest opartylibpcap
, buduje pakiet do wysłanegoFIN
pakietu. Jeśli połączenie jest już martwe, nie może uzyskać poprawnego numeru sekwencyjnego.Jedynym sposobem jest zamknięcie procesu, więc sprawia, że wszędzie NIE jest SPOF.
źródło