Ist es unter Linux iptables möglich, den Namen des Prozesses / Befehls zu protokollieren, der eine ausgehende Verbindung initiiert?
19599
Nack
Ich möchte die Prozesse verfolgen, die ausgehende Verbindungen auf einem Linux-Desktop initiieren. Das Beste, was ich mir vorstellen kann, ist folgendes:
iptables -A OUTPUT -m state --state NEW -j LOG --log-uid
Dies protokolliert die UID / GID, die die Verbindung initiiert, nicht jedoch den Namen des Prozesses / Befehls oder die PID. Wenn ich nur die PID bekommen könnte, könnte ich wahrscheinlich ein Skript ausarbeiten, das den Prozessnamen abruft, wenn das Protokoll geschrieben wird, aber es scheint, als sei dies nicht einmal möglich.
Im Idealfall möchte ich auch die Prozesse protokollieren, die auch eingehende Verbindungen akzeptieren.
Irgendwelche Ideen, wie dies mit iptables [oder etwas anderem] in einer Linux-Box möglich wäre?
Ich glaube (nicht ganz sicher), dass diese Frage auf Serverfehler beantwortet wurde, schauen Sie nach.
niXar vor 15 Jahren
0
Persönlich würde ich für diesen Job [sysdig] (http://www.sysdig.org/) verwenden.
Charles Duffy vor 7 Jahren
0
Sie wollen das Owner-Match-Modul, das nur in der OUTPUT-Kette funktioniert (und eventuell PREROUTING ...?). Lesen Sie die Dokumente, aber es funktioniert in etwa so:
Kann ein iptables-Protokollbefehl eine Variable auf diese Weise setzen und interpolieren? Es scheint für mich nicht zu funktionieren. Es sieht außerdem so aus, als ob die Option --cmd-owner im Kernel> = 2.6.15 entfernt wurde. Das ist bedauerlich, denn es scheint eine nützliche Option zu sein.
vor 15 Jahren
1
Ja, --cmd-owner wurde entfernt: "unfixable broken"
guettli vor 13 Jahren
4
Danke für die Info, @guettli. Weitere Informationen finden Sie unter http://permalink.gmane.org/gmane.comp.security.firewalls.netfilter.general/41273, in dem mehr vom Änderungsprotokoll zitiert wird: * "[NETFILTER]: Entfernen Sie den Missbrauch von tasklist_lock in ipt {, 6}. owner; Entferne den cmd / sid / pid-Abgleich, da er nicht fixierbar ist, und verhindert, dass Änderungen an tasklist_lock gesperrt werden. "* Ich hätte jedoch gerne etwas mehr Hintergrundwissen oder bessere Alternativen.
nealmcb vor 12 Jahren
1
7
Ben Collins
Sie könnten ein Programm zur Überwachung von / proc / net / tcp schreiben, dessen Ausgabe folgendermaßen aussieht:
Sie können dann geöffnete Ports mit Inodes verknüpfen, die wiederum Prozessen und Dateideskriptoren zugeordnet werden können, indem Sie die für jeden Prozess aufgeführten Dateideskriptoren mit einem Lese-Link versehen:
Siehe hier, dass Inode 4847458 dem ersten TCP-Socket in der obigen Liste entspricht. Die Ausgabe von netstat -tapn überprüft dies für mich (und erinnert sich an 0x50 == 80):
obi-wan ~ # netstat -tapn Active Internet connections (servers and established) Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN 28850/cherokee-work
Wenn das Überwachungsprogramm eine Änderung in / proc / net / tcp feststellt, analysieren Sie die Daten und stellen Sie fest, ob es sich bei der Änderung um einen neu geöffneten Socket handelt. Dann könnten Sie einfach alle Dateibeschreibungen für jeden in / proc aufgelisteten Prozess auflisten, indem Sie readlink bei jedem on ausführen, um den passenden Inode zu finden. Sobald Sie das gefunden haben, haben Sie die besitzende PID, von der Sie alles erhalten können, was Sie möchten, insbesondere wenn Sie über die Prozessabrechnung verfügen.
Wenn Sie nicht möchten, dass Ihre Benachrichtigung sofort erfolgt, kann Ihr Überwachungsprogramm eine langsame Umfrage verwenden (etwa 50 ms oder 100 ms oder sogar 1000 ms).
Vielen Dank für die Bereitstellung einer Option! Das Abfragen und Abfragen jedes geöffneten Dateideskriptors ist jedoch nicht sehr robust und ineffizient. Ich hoffe immer noch, dass jemand eine bessere Lösung findet oder klärt, warum dies nicht mehr Bestandteil von iptables ist und warum --cmd-owner als unlösbar gilt.
nealmcb vor 12 Jahren
2
Wenn der Kernel nicht das Layout von / proc ändert oder wenn netstat und readlink oder ps sich nicht ändern (unwahrscheinlich), würde ich sagen, dass dies ziemlich robust ist. Um welche Art von Effizienzproblemen handelt es sich? Wenn Sie eine sofortige Verarbeitung wünschen, müssen Sie ein Kernel-Modul für die Verwendung mit iptables schreiben.
Ben Collins vor 12 Jahren
0
Wenn ich abgelehnte Verbindungen protokolliere, wird der Socket sofort vom Kernel zerstört, so dass ich kaum eine Chance habe, ihn in / proc zu sehen. Ändern Sie möglicherweise nur den REJECT in DROP, um die Verbindung zu beenden.
Marki555 vor 9 Jahren
0
In diesem Szenario hilft es zwar nicht, das sehr kleine Zeitfenster zu nutzen, aber was die Zerbrechlichkeit von Parsing / proc angeht, könnte man auch "lsof -F -i" verwenden und ein schön abstrahiertes Dump des Netzwerks erhalten Daten. Das kann auch gefiltert werden (zum Beispiel nur für einen bestimmten Port) und hat bereits alle Dateinamens- / PID- / Benutzerzuordnungen für Sie vorgenommen.
dannysauer vor 8 Jahren
0
5
Lokal
Nichts mit iptables oder Protokollierung zu tun; aber hier ist eine "top" -ähnliche Schnittstelle, die das Verzeichnis / proc / abfragt und die Bandbreite pro Programm / pid anzeigt:
"NetHogs ist ein kleines" Net Top "-Tool. Statt den Datenverkehr nach Protokollen oder nach Subnetz aufzuteilen, wie dies bei den meisten Tools der Fall ist, wird die Bandbreite nach Prozess gruppiert. NetHogs ist nicht auf ein spezielles Kernel-Modul angewiesen, das geladen werden soll."
Ich habe festgestellt, dass Nethogs unzuverlässige Werte liefern, aber auf 2 (+ netatop) ist dies gut.
Tobu vor 11 Jahren
0
1
Mark
Als ich mir eine ähnliche Frage anschaue und versuche, Skype zu beschleunigen, habe ich herausgefunden
$ netstat -p | grep <mycmdname>
ist eine gute Möglichkeit, die Portnummer mit pid / cmd zu verknüpfen, da pid-owner / cmd-owner jetzt nicht mehr direkt in iptables unterstützt wird. Sie müssen dann das Ergebnis analysieren und die iptables-Regel entsprechend dem Port hinzufügen. Natürlich benötigen Sie danach einen Bereinigungscode / beim Herunterfahren / Neustarten des Systems usw .; Speichern Sie die Portnummer / s in einer Datei zur Referenz zur Bereinigungszeit
in der Tat ist eine gute Antwort auf die Frage der Portnummern