Ist es unter Linux iptables möglich, den Namen des Prozesses / Befehls zu protokollieren, der eine ausgehende Verbindung initiiert?

19421
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?

24
Ich glaube (nicht ganz sicher), dass diese Frage auf Serverfehler beantwortet wurde, schauen Sie nach. niXar vor 14 Jahren 0
Persönlich würde ich für diesen Job [sysdig] (http://www.sysdig.org/) verwenden. Charles Duffy vor 7 Jahren 0

4 Antworten auf die Frage

9

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:

iptables --append OUTPUT -m owner --cmd-owner "$app" \ --jump LOG --log-level DEBUG --log-prefix "OUTPUT $app packet died: " 
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 12 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:

obi-wan ~ # cat /proc/net/tcp sl local_address rem_address st tx_queue rx_queue tr tm->when retrnsmt uid timeout inode 0: 00000000:0050 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 4847458 1 e6060560 300 0 0 2 -1 1: 00000000:04D2 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 4847477 1 f2e64da0 300 0 0 2 -1 2: 00000000:0016 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 7109 1 f2e65ac0 300 0 0 2 -1 3: 0100007F:177A 00000000:0000 0A 00000000:00000000 00:00000000 00000000 1000 0 4864457 1 d2726540 300 0 0 2 -1 4: 00000000:01BB 00000000:0000 0A 00000000:00000000 00:00000000 00000000 0 0 4847462 1 e60609c0 300 0 0 2 -1 5: 6B00A8C0:0016 30F4B5CA:C3AB 01 00000044:00000000 01:00000031 00000000 0 0 4982752 3 f2e64940 55 4 0 2 -1 6: 0100007F:B143 0100007F:BC5E 01 00000000:00000000 00:00000000 00000000 1000 0 2130283 1 d59cce40 21 4 1 2 -1 7: 0100007F:BC5E 0100007F:B143 01 00000000:00000000 00:00000000 00000000 1000 0 2130285 1 d59cd2a0 21 4 0 2 -1 8: 6B00A8C0:0016 3276C35B:8E11 01 00000000:00000000 02:000ADAB1 00000000 0 0 4982629 2 d2727260 40 4 8 2 2 9: 6B00A8C0:0016 6500A8C0:DD5D 01 00000538:00000000 01:00000029 00000000 0 0 4864416 5 e6061b40 42 12 27 3 -1 

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:

obi-wan ~ # readlink /proc/28850/fd/3 socket:[4847458] 

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 11 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 8 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:

http://sourceforge.net/projects/nethogs

"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

$ sudo netstat -p | grep "tcp.*<mycmdname>" | sed -r "s/.*<MYCOMPUTER>:([0-9]+).*/\1/"` 

Möglicherweise müssen Sie das grep tcp-Element an Ihre Bedürfnisse anpassen

dann war es für meine Zwecke am einfachsten, tc u32-Filter nach Portnummern hinzuzufügen, iptables-Einträge nach Portnummern ähnlich