Ich möchte die Prozesse verfolgen, die ausgehende Verbindungen auf einem Linux-Desktop initiieren. Das Beste, was ich mir einfallen lassen kann, ist Folgendes:
iptables -A OUTPUT -m state --state NEW -j LOG --log-uid
Dies protokolliert die UID / GID, die die Verbindung initiiert, aber nicht den Prozess- / Befehlsnamen oder sogar die PID. Wenn ich nur die PID bekommen könnte, könnte ich wahrscheinlich ein Skript erstellen, das den Prozessnamen beim Schreiben des Protokolls abruft, aber es scheint, dass dies nicht einmal möglich ist.
Idealerweise möchte ich auch die Prozesse protokollieren, die auch eingehende Verbindungen akzeptieren.
Irgendwelche Ideen, wie dies mit iptables [oder irgendetwas anderem] auf einer Linux-Box möglich sein könnte?
Antworten:
Sie könnten ein Programm schreiben, um / proc / net / tcp zu überwachen, dessen Ausgabe so aussieht:
Sie können dann geöffnete Ports mit Inodes verknüpfen, die mit Prozessen und Dateideskriptoren verknüpft werden können, indem Sie für die für jeden Prozess aufgelisteten Dateideskriptoren einen Readlink ausführen:
Sehen Sie 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 daran, dass 0x50 == 80):
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önnen Sie einfach alle Dateideskriptoren für jeden in / proc aufgelisteten Prozess auflisten und jeweils einen Readlink ausführen, um den passenden Inode zu finden. Sobald Sie dies gefunden haben, haben Sie die PID, von der Sie alles bekommen können, was Sie sich wünschen, besonders wenn Sie über eine Prozessabrechnung verfügen.
Wenn Sie nicht möchten, dass Ihre Benachrichtigung sofort angezeigt wird, kann Ihr Monitorprogramm eine langsame Abfrage verwenden (möglicherweise eine Zeitspanne von 50 ms oder 100 ms oder sogar 1000 ms).
quelle
Sie möchten das Eigentümer-Match-Modul, das nur in der OUTPUT-Kette funktioniert (und möglicherweise PREROUTING ...?). Lesen Sie die Dokumentation, aber es wird ungefähr so funktionieren:
quelle
Nichts mit Iptables oder Protokollierung zu tun; Aber hier ist eine "top" -ähnliche Oberfläche, die das / proc / -Verzeichnis abfragt und die Bandbreite pro Programm / pid anzeigt:
http://sourceforge.net/projects/nethogs
"NetHogs ist ein kleines 'Net Top'-Tool. Anstatt wie die meisten Tools den Datenverkehr nach Protokollen oder Subnetzen aufzuteilen, wird die Bandbreite nach Prozessen gruppiert. NetHogs benötigt kein spezielles Kernel-Modul, das geladen werden soll."
quelle
Als ich mich mit einer ähnlichen Frage befasse und versuche, Skype zu beschleunigen, habe ich herausgefunden
ist eine gute Möglichkeit, die Portnummer mit pid / cmd zu verknüpfen, da pid-owner / cmd-owner in iptables nicht mehr direkt unterstützt werden. Sie müssen dann das Ergebnis analysieren und die iptables-Regel entsprechend dem Port hinzufügen. Natürlich benötigen Sie einen Bereinigungscode nach dem Herunterfahren / Neustarten des Systems usw .; Speichern Sie die Port-Nummer (n) in einer Datei, um sie bei der Bereinigung zu referenzieren
in der Tat ist eine gute Antwort auf die Frage nach den Portnummern
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, iptables-einträge nach portnummern ähnlich hinzuzufügen
quelle