Avec Linux iptables, est-il possible de connecter le nom de processus / commande qui lance une connexion sortante?

Je voudrais garder une trace des processus qui lancent des connexions sortantes sur un bureau Linux. Le mieux que je peux proposer est le suivant:

iptables -A OUTPUT -m state --state NEW -j LOG --log-uid 

Cela enregistre l'uid / gid qui déclenche la connexion, mais pas le nom de processus / commande ou même le pid. Si je pouvais juste obtenir le pid, je pourrais probablement regrouper un script qui tire le nom du processus lorsque le journal est écrit, mais il semble que cela n'est même pas possible.

Idéalement, j'aimerais également enregistrer les processus qui acceptent les connexions entrantes aussi.

Des idées sur la façon dont cela pourrait être possible avec iptables [ou autre chose] sur une boîte Linux?

    Vous pouvez écrire un programme pour surveiller / proc / net / tcp, dont la sortie ressemble à ceci:

     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 

    Vous pouvez ensuite relier les ports ouverts aux inodes, qui peuvent être reliés aux processus et aux descripteurs de fichiers en faisant readlink sur les descripteurs de fichiers répertoriés pour chaque processus:

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

    Voyez ici que l'inode 4847458 correspond au premier socket tcp dans la liste ci-dessus. La sortie de netstat -tapn vérifie cela pour moi (et rappelle que 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 

    Lorsque le programme du moniteur note une modification dans / proc / net / tcp, analysez les données et déterminez si la modification est une socket nouvellement ouverte. Ensuite, vous pouvez simplement énumérer tous les descripteurs de fichier pour chaque processus répertorié dans / proc, en faisant readlink sur chacun pour trouver l'inode correspondant. Une fois que vous trouvez cela, vous avez le PID propriétaire, à partir duquel vous pouvez obtenir tout ce que vous pourriez vouloir, en particulier si vous avez une comptabilité de processus.

    Si vous n'avez pas besoin que votre notification soit instantanée, votre programme de surveillance pourrait utiliser un sondage lent (peut-être une période de 50 ms ou 100 ms ou même 1000 ms).

    Vous voulez le module de correspondance du propriétaire, qui ne fonctionne que sur la chaîne OUTPUT (et peut-être PREROUTING …?). Lisez les documents, mais cela fonctionnera comme suit:

     iptables --append OUTPUT -m owner --cmd-owner "$app" \ --jump LOG --log-level DEBUG --log-prefix "OUTPUT $app packet died: " 

    Rien à voir avec iptables ou l'enregistrement; Mais voici une interface "supérieure" qui interroge le répertoire / proc / et affiche la bande passante par programme / pid:

    http://sourceforge.net/projects/nethogs

    "NetHogs est un petit outil« net top ». Au lieu de briser le trafic par protocole ou par sous-réseau, comme la plupart des outils, il regroupe la bande passante par processus. NetHogs ne dépend pas d'un module de noyau spécial à charger.

    Comme je me penche sur une question similaire, j'essaie de limiter la vitesse de Skype, j'ai trouvé

     $ netstat -p | grep <mycmdname> 

    Est un bon moyen de lier le numéro de port à pid / cmd, maintenant que les propriétaires de pid-owner / cmd ne sont plus directement pris en charge par iptables; Vous devrez ensuite analyser le résultat, puis ajouter la règle iptables en fonction du port; Naturellement, vous aurez besoin d'un code de nettoyage ultérieur / lors de l'arrêt / redémarrage du système, etc. Enregistrez le (s) numéro (s) de port dans un fichier pour référence au moment du nettoyage

    En fait, une bonne réponse à la question des numéros de port est

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

    Vous devrez peut-être ajuster l'élément grep tcp selon vos besoins

    Alors, pour mes besoins, il était plus simple d'ajouter des filtres uk tc selon les numéros de port, les entrées iptables selon les numéros de port similaires