netstat -ntap zeigt für einige Verbindungen keinen PID- / Prozessnamen an?

10

Ich habe Ubuntu / Hardy Server, mit Kernel 2.6.24-23-Server und Netstat:

# netstat --version
net-tools 1.60
netstat 1.42 (2001-04-15)

Das Problem ist, dass wir viele ESTABLISHED-Verbindungen haben, die weder PID noch Programmnamen in der netstat -ntapAusgabe anzeigen . Netstat wurde von root aufgerufen, es gibt keine Chroots, Grsecurity oder ähnliches (oder so wurde mir gesagt :).

Irgendeine Idee, was falsch sein könnte?

AKTUALISIEREN

lsof -n -i funktioniert in Ordnung und zeigt den PID- / Prozessnamen für die Verbindungen an.


quelle
2
Sind Sie sicher, es als root oder mit sudo auszuführen?
Dom
Ja, es wurde auf root und sogar auf root via sudo ausgeführt. gleicher Effekt.
Sind Sie sicher , dass Sie nicht taten netstat -ntapstatt netstat ntap?
Kyle Brandt
Ich bin mir sicher, dass ich es getan habe netstat -ntap- genau wie ich geschrieben habe. Auf diese Weise werden netstat Optionen gemäß seiner Manpage gegeben.
Randnotiz - ich habe es gerade überprüft und es scheint, dass netstat Optionen ohne "-" nicht erkennt.

Antworten:

4

Dies tritt bei Kernelprozessen wie NFS auf, gelegentlich aber auch bei normalen Apps: RHEL 5 hat das gleiche Verhalten.

# netstat -taupen | grep 30715
tcp        0      0 0.0.0.0:30715           0.0.0.0:*               LISTEN      66558      81467710   - 

Beachten Sie, dass lsof andererseits Wörter richtig:

# lsof -i:30715
AppName 1598 useracct   78u     IPv4           81467710                   TCP *:30715 (LISTEN)
Mikemaccana
quelle
3
198_141:~ # netstat  -anp|grep 33000
tcp        0      0 0.0.0.0:53000           0.0.0.0:*               LISTEN       -                   
198_141:~ # lsof -i:33000
COMMAND   PID USER   FD   TYPE     DEVICE SIZE NODE NAME
vsftpd  28147 root    3u  IPv4 4089990174       TCP *:33000 (LISTEN)
198_141:~ # id
uid=0(root) gid=100(users) groups=16(dialout),100(users)
198_141:~ # 

In meiner Zwiebel könnte es zwei Situationen geben:

1) Benutzer mit normalem Berechtigungsauszug "netstat" können diese von root gestarteten Prozesse nicht sehen

2) Einige Prozesse werden im Kernel ausgeführt

Yans Ruan
quelle
1

Bei hergestellten Verbindungen sollte dies nur für Verbindungen geschehen, die vom Kernel-Space initiiert werden, wie z. B. NFS oder DRBD. Offensichtlich könnten wartende Verbindungen den Prozess unter ihnen zum Erliegen gebracht haben. Wenn Sie nicht herausfinden können, was eine bestimmte Verbindung verursacht, fügen Sie die Ausgabe ein, und jemand kann Ihnen sagen, um was es sich handelt.

womble
quelle
Dies sind definitiv keine kernelbasierten Verbindungen, da dies Verbindungen zur Datenbank von der Anwendung aus sind.
Ausgabe von netstat -atnp | grep EST?
womble
Dies ist, was mein Problem ist - Verbindungen werden aufgelistet durch anstelle von PID / Programmname Ich habe "-"
3
Und ich würde gerne sehen, was tatsächlich passiert, und nicht eine Interpretation davon.
womble
Ich kann Ihnen nicht die gesamte Ausgabe anzeigen, da sie Namen enthält, mit denen die Umgebung identifiziert werden kann. Die Zeile für diesen bestimmten Port sieht folgendermaßen aus: "tcp 0 0 localhost: 36949 localhost: 6543 ESTABLISHED -"
1

Ich habe das gleiche Verhalten und ich vermute, dass sich das Verhalten von netstat geändert hat. Zum Beispiel sehe ich den Port und das Programm für 'wget', aber nicht für Apache PHP-Prozesse, die für mich wichtiger sind.

Problemumgehung: Ich habe mein Skript neu geschrieben, um stattdessen lsof zu verwenden (siehe Hinweis oben).


quelle
Pascal: Haben Sie diesen Befehl mit sudo oder als root ausgeführt?
Stefan Lasiewski
0

Kommen Sie hierher, weil ich heutzutage auf Ubuntu 18.04 LTS auf dieselbe Frage stoße (netstat ist dieselbe Version netstat 1.42 (15.04.2001)), seltsamerweise nach 8 Jahren immer noch keine Antwort. Nachdem ich den Quellcode von Net-Tools durchsucht habe, kann ich ihn finden.

Im netstat-Quellcode:

  1. Alle Prozessordner in / proc werden iteriert. Jedes fd im Verzeichnis / proc // fd wird überprüft, um eine Zuordnung von Socket Inode zu PID / Progname zu erstellen.

  2. Anschließend wird / proc / net / tcp überprüft, um Informationen zum TCP-Socket (von der Funktion tcp_info) einschließlich des Socket-Inodes abzurufen.

  3. Bei der Ausgabe der TCP-Socket-Informationen wird die PID / Prognose in Schritt 1 über den Socket-Inode von der Karte abgefragt. Wenn nichts gefunden wird, wird '-' ausgegeben.

Wenn der Socket nach dem Erstellen der Karte erstellt wird, wird die PID / Prognose nicht in der Karte gefunden.

zenkj
quelle