Osierocone połączenia w stanie CLOSE_WAIT

30

Mam maszynę SLES, która gromadzi połączenia TCP w stanie CLOSE_WAIT dla tego, co wydaje się być wieczne. Deskryptory te w końcu pochłaniają całą dostępną pamięć. W tej chwili mam ich 3037, ale przed ostatnim ponownym uruchomieniem było znacznie więcej.

Interesujące jest to, że nie są to połączenia z portami lokalnymi, które, jak się spodziewałem, mają procesy nasłuchiwania. Nie mają powiązanych PID, a ich liczniki wydają się wygasły.

# netstat -ton | grep CLOSE_WAIT
tcp      176      0 10.0.0.60:54882     10.0.0.12:31663      CLOSE_WAIT  off (0.00/0/0)
tcp       54      0 10.0.0.60:60957     10.0.0.12:4503       CLOSE_WAIT  off (0.00/0/0)
tcp       89      0 10.0.0.60:50959     10.0.0.12:3518       CLOSE_WAIT  off (0.00/0/0)

# netstat -tonp | grep CLOSE_WAIT
tcp       89      0 10.0.0.59:45598     10.0.0.12:1998       CLOSE_WAIT  -                   
tcp       15      0 10.0.0.59:60861     10.0.0.12:1938       CLOSE_WAIT  -                   
tcp        5      0 10.0.0.59:56173     10.0.0.12:1700       CLOSE_WAIT  -     

Nie jestem czarnym pasem jeśli chodzi o stos TCP lub sieć jądra, ale konfiguracja TCP wydaje się rozsądna, ponieważ te wartości są domyślne, na stronę man:

# cat /proc/sys/net/ipv4/tcp_fin_timeout 
60
# cat /proc/sys/net/ipv4/tcp_keepalive_time 
7200

Co więc daje? Jeśli czas upłynął, czy stos nie powinien automatycznie wyczyścić tego? Skutecznie daję sobie długoterminową DoS, gdy te rzeczy się narastają.

pboin
źródło
Aha, a moje badania pokazują, że inni widzą takie artefakty w „lsof -i”. Ja nie widząc niczego dziwne tam.
pboin 25.03.11
2
Spróbuj sudo netstat -tonpsprawdzić, z którym programem to się dzieje.
BillThor,
1
Pomoże post i moja odpowiedź stackoverflow.com/a/17697733/540323 .
Amil Waduwawara,

Odpowiedzi:

16

Nie, nie ma limitu czasu CLOSE_WAIT. Myślę, że to właśnie offoznacza twój wynik.

Aby wyjść CLOSE_WAIT, aplikacja musi jawnie zamknąć gniazdo (lub wyjść).

Zobacz Jak złamać CLOSE_WAIT .

Jeśli netstatpokazuje się -w kolumnie procesu:

  • czy korzystasz z odpowiednich uprawnień i możliwości (np. jako root)?
  • mogą to być procesy jądra (np. nfsd)
Mikel
źródło
Robiąc netstaty, miałem pełne uprawnienia, tak. Pójdę sprawdzić kąt procesów jądra - to dobry pomysł. Jestem naprawdę zakłopotany, ponieważ nie powinno być żadnych gniazd nasłuchujących, z wyjątkiem dwóch lub trzech dobrze uprzywilejowanych portów. Może to dziwny problem z iptables. Też to sprawdzę.
pboin
1
Link jest zepsuty.
Nathan
10

CLOSE_WAITwskazuje, że klient zamyka połączenie, ale aplikacja jeszcze go nie zamknęła lub klient nie. Powinieneś określić, który program lub programy mają ten problem. Spróbuj użyć, netstat -tonp 2>&1 | grep CLOSEaby ustalić, które programy utrzymują połączenia.

Jeśli na liście nie ma żadnych programów, usługa jest dostarczana przez jądro. Są to prawdopodobnie usługi RPC, takie jak nfslub rpc.lockd. Usługi jądra nasłuchiwania można wyświetlić za pomocą netstat -lntp 2>&1 | grep -- -.

O ile usługi RPC nie są powiązane z ustalonymi portami, będą się łączyć z efemerycznymi portami, gdy wydaje się, że Twoje połączenia są wyświetlane. Możesz także sprawdzić procesy i podłączenia na drugim serwerze.

Możesz być w stanie powiązać swoje usługi NFS ze stałymi portami, wykonując następujące czynności:

  1. Wybierz cztery nieużywane porty dla NFS (tutaj użyte 32763-32766)
  2. Dodaj stałe porty dla NFS do /etc/services
    rpc.statd-bc 32763 / udp # RCP statd broadcast
    rpc.statd-bc 32763 / tcp
    rpc.statd 32764 / udp # RCP statd listen
    rpc.statd 32764 / tcp
    rpc.mountd 32765 / udp # RPC mountd
    rpc.mountd 32765 / tcp
    rpc.lockd 32766 / udp # RPC lockd / nlockmgr
    rpc.lockd 32766 / tcp
  3. Skonfiguruj statd, aby użyć opcji --port 32763 --outgoing-port 32764
  4. Skonfiguruj rpcmountd, aby użyć opcji --port 32765
  5. Zamknij i uruchom ponownie usługi NFS i RPC.
BillThor
źródło
Napisałem, że nie ma PID, ale nie pokazałem mojej pracy. Dzięki twojej sugestii dokonałem szybkiej edycji, dzięki.
pboin
@opboin: Dodano komentarze dotyczące portów bez PIDS (usługi jądra).
BillThor
3
CLOSE-WAIT oznacza, że peer zamknął swój koniec, a lokalny system operacyjny czeka na zamknięcie lokalnej aplikacji.
user207421,