Verwaiste Verbindungen im Status CLOSE_WAIT

30

Ich habe eine SLES-Maschine, die TCP-Verbindungen in einem CLOSE_WAIT-Status für immer ansammelt. Diese Deskriptoren saugen schließlich den gesamten verfügbaren Speicher auf. Im Moment habe ich 3037 davon, aber es war viel höher, bevor kürzlich ein schneller Neustart durchgeführt wurde.

Interessant ist, dass sie nicht von Verbindungen zu lokalen Ports stammen, von denen ich einen Abhörprozess erwarte. Sie haben keine zugeordneten PIDs und ihre Timer scheinen abgelaufen zu sein.

# 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  -     

Ich bin kein Schwarzgurt, wenn es um den TCP-Stack oder das Kernel-Networking geht, aber die TCP-Konfiguration scheint vernünftig zu sein, da diese Werte laut Manpage Standard sind:

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

Also was gibt es? Wenn die Timer abgelaufen sind, sollte der Stack diese Informationen dann nicht automatisch löschen? Ich gebe mir effektiv einen langfristigen DoS, wenn sich diese Dinge aufbauen.

pboin
quelle
Oh, und meine Nachforschungen zeigen, dass andere Artefakte wie dieses in 'lsof -i' sehen. Ich bin nicht seltsam es etwas zu sehen.
pboin
2
Versuchen Sie herauszufinden, sudo netstat -tonpmit welchem ​​Programm dies geschieht.
BillThor
1
Der Beitrag und meine Antwort stackoverflow.com/a/17697733/540323 helfen.
Amil Waduwawara

Antworten:

16

Nein, es gibt kein Timeout für CLOSE_WAIT. Ich denke, das offbedeutet das in Ihrer Ausgabe.

Um herauszukommen CLOSE_WAIT, muss die Anwendung den Socket explizit schließen (oder beenden).

Siehe So unterbrechen Sie CLOSE_WAIT .

Wenn netstatzeigt -in der Prozesskolonne:

  • Laufen Sie mit den entsprechenden Berechtigungen und Fähigkeiten (z. B. als Root)?
  • es könnte sich um Kernelprozesse handeln (zB nfsd)
Mikel
quelle
Bei den Netzstatistiken hatte ich volle Privilegien, ja. Ich werde den Kernel-Prozess-Winkel untersuchen - das ist eine gute Idee. Ich bin wirklich verblüfft, denn es sollte überhaupt keine Abhörbuchsen geben, außer zwei oder drei bekannten privilegierten Ports. Vielleicht ist es ein seltsames Problem mit Iptables. Ich werde das auch überprüfen.
Pboin
1
Die Verbindung ist unterbrochen.
Nathan
10

CLOSE_WAITGibt an, dass der Client die Verbindung schließt, die Anwendung sie jedoch noch nicht geschlossen hat oder nicht. Sie sollten identifizieren, welches Programm oder welche Programme dieses Problem haben. Versuchen Sie mit netstat -tonp 2>&1 | grep CLOSEfestzustellen, welche Programme die Verbindungen halten.

Wenn keine Programme aufgelistet sind, wird der Dienst vom Kernel bereitgestellt. Dies sind wahrscheinlich RPC-Dienste wie nfsoder rpc.lockd. Listening-Kernel-Dienste können mit aufgelistet werden netstat -lntp 2>&1 | grep -- -.

Sofern die RPC-Dienste nicht an feste Ports gebunden wurden, werden sie an kurzlebige Ports gebunden, wie Ihre Verbindungen zu zeigen scheinen. Möglicherweise möchten Sie auch die Prozesse und Bereitstellungen auf dem anderen Server überprüfen.

Möglicherweise können Sie Ihre NFS-Dienste an feste Ports binden, indem Sie folgende Schritte ausführen:

  1. Wählen Sie vier nicht verwendete Ports für NFS aus (hier 32763-32766 verwendet)
  2. Fügen Sie feste Ports für NFS hinzu /etc/services
    rpc.statd-bc 32763 / udp # RCP statd broadcast
    rpc.statd-bc 32763 / tcp
    rpc.statd 32764 / udp # RCP statd hören
    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. Konfigurieren Sie statd, um die Optionen zu verwenden --port 32763 --outgoing-port 32764
  4. Konfigurieren Sie rpcmountd, um die Option zu verwenden --port 32765
  5. Fahren Sie die NFS- und RPC-Dienste herunter und starten Sie sie neu.
BillThor
quelle
Ich schrieb, dass es keine PIDs gab, zeigte aber nicht meine Arbeit. Ich habe auf Ihren Vorschlag hin eine schnelle Bearbeitung vorgenommen, danke.
pboin
@opboin: Kommentare zu Ports ohne PIDS (Kernel-Dienste) hinzugefügt.
BillThor
3
CLOSE-WAIT bedeutet, dass der Peer sein Ende geschlossen hat und das lokale Betriebssystem auf das Schließen der lokalen Anwendung wartet.
user207421