Jak pozbyć się gniazd w stanie FIN_WAIT1?

18

Mam port zablokowany przez proces, który musiałem zabić. (mały demon telnet, który się zawiesił). Proces został pomyślnie zakończony, ale port jest nadal w stanie „FIN_WAIT1”. Nie wychodzi z tego, czas oczekiwania wydaje się ustawiony na „dekadę”.

Jedynym sposobem, w jaki znalazłem uwolnienie portu, jest ponowne uruchomienie całej maszyny, co oczywiście jest czymś, czego nie chcę robić.

$ netstat -tulnap | grep FIN_WAIT1 
tcp        0  13937 10.0.0.153:4000         10.0.2.46:2572          FIN_WAIT1  -

Czy ktoś wie, jak mogę odblokować ten port bez ponownego uruchamiania?

Gert M.
źródło

Odpowiedzi:

18
# record what tcp_max_orphans's current value
original_value=$(cat /proc/sys/net/ipv4/tcp_max_orphans)

#set the tcp_max_orphans to 0 temporarily
echo 0 > /proc/sys/net/ipv4/tcp_max_orphans

# watch /var/log/messages
# it will split out "kernel: TCP: too many of orphaned sockets"
# it won't take long for the connections to be killed

# restore the value of tcp_max_orphans whatever it was before. 
echo $original_value > /proc/sys/net/ipv4/tcp_max_orphans

# verify with 
netstat -an|grep FIN_WAIT1
IdaWong
źródło
2
poprawiłoby to odpowiedź, aby najpierw zanotować ją $whateveritwasprzed zastąpieniem.
sprawdził
7

Powinieneś być w stanie ustawić limit czasu za pomocą /proc/sys/net/ipv4/tcp_fin_timeout.

Wydaje się, że nie ma możliwości ręcznego wyczyszczenia gniazda.

innaM
źródło
6
Ta odpowiedź jest nieprawidłowa. tcp_orphan_retries wpływa na FIN_WAIT1, tcp_fin_timeout wpływa na FIN_WAIT2.
suprjami
suprjami jest poprawny, tcp_fin_timeout wpływa na FIN_WAIT2. Który jest wyzwalany tylko przy użyciu SO_LINGER.
Matt
@innaM Czy możesz usunąć tę odpowiedź? To nie jest poprawne i kumuluje się opinie negatywne. Widzę, że nadal jesteś aktywny, dlatego wydaje się, że najbardziej sensowne jest usunięcie odpowiedzi.
Andrew B,
@Andrew B: Wydaje się, że nie można usunąć zaakceptowanych odpowiedzi.
innaM
6

Wygląda na to, że ustawienie tcp_orphan_retries kontroluje liczbę prób, które zostaną wykonane przed zwolnieniem portu bez serwera. Tutaj było 0, po ustawieniu na 1 porty zniknęły.

HTH

użytkownik64877
źródło
1
Ściśle powiązane: 0 jest wartością domyślną, co oznacza 8. serverfault.com/a/408882/152073
Andrew B
5

/proc/sys/net/ipv4/tcp_fin_timeoutoznacza limit czasu stanu FIN-WAIT-2, a nie FIN-WAIT-1. Powinieneś wybrać trasę tcpkill lub spróbować zagrać z czasem podtrzymania, /proc/sys/net/ipv4/tcp_keepalive_*aby wymusić zabicie przez SO.

Ryan Ahearn
źródło
2

Uruchomienie tych kroków pod identyfikatorem katalogu głównego i zostało dla mnie wyczyszczone:

Przechwyć ustawienie jądra, aby zmienić zmienną

$ orig_orphans=$(sysctl -a|grep tcp_max_orph|cut -f3 -d' ')

Tymczasowo ustaw maksymalną liczbę sierot na 0

$ sysctl -w net.ipv4.tcp_max_orphans=0

Sprawdź, czy problematyczny port nie jest już używany

$ netstat -np|grep 9716

Poczekaj chwilę i powtórz powyższy krok, jeśli to konieczne, aż powyższe polecenie nie zwróci żadnych wierszy

Zresetuj parametr jądra tcp_max_orphans z powrotem do pierwotnej wartości z powyższej zmiennej

$ sysctl -w net.ipv4.tcp_max_orphans=$orig_orphans
Rad Mandapati
źródło
Cześć, Witaj w Serverfault. Zredagowałem twój post, aby formatowanie odpowiedzi było bardziej spójne z innymi odpowiedziami na tej stronie. Do następnej odpowiedzi nie używaj tyle tytułów, co tutaj i rozważ wzięcie innych odpowiedzi jako szablonu własnych odpowiedzi. Dziękuję za Twój wkład. Ciesz się jazdą po awarii serwera.
Richard,
1

FIN_WAIT1

Aplikacja na komputerze lokalnym zamknęła połączenie. Wskazanie tego zostało wysłane do zdalnego komputera.

Aplikacja zamknęła stronę połączenia, gniazdo czeka teraz na zdalną stronę, aby potwierdzić to zamknięcie. Jeśli masz problem z trzymaniem wielu gniazd w FIN_WAIT1 , powinieneś postępować zgodnie z radą Manniego powyżej.

Dave Cheney
źródło
0

W jądrze Linuksa> = 4.9 możesz użyć sspolecenia z iproute2 z klawiszem -K

ss -K dst 192.168.1.214 dport = 49029 jądro musi zostać skompilowane z włączoną opcją CONFIG_INET_DIAG_DESTROY.

przez /unix//a/511691/43898

eri
źródło
-4

może to pomóc:

net.ipv4.tcp_keepalive_probes = 5
net.ipv4.tcp_keepalive_intvl = 15
net.ipv4.tcp_retries2 = 2
net.ipv4.tcp_orphan_retries = 1
net.ipv4.tcp_reordering = 5
net.ipv4.tcp_retrans_collapse = 0
wkf1436
źródło
6
Może to pomóc, jeśli wyjaśnisz, co to wszystko. Jesteśmy profesjonalistami i dlatego nie wklejamy na ślepo rzeczy i mamy nadzieję, że to pomoże.
Michael Hampton