Je voudrais garder une trace des processus qui lancent des connexions sortantes sur un bureau Linux. Le mieux que je puisse trouver est le suivant:
iptables -A OUTPUT -m state --state NEW -j LOG --log-uid
Cela enregistre l'uid / gid qui initie la connexion, mais pas le nom du processus / commande ou même le pid. Si je pouvais simplement obtenir le pid, je pourrais probablement créer un script qui extrait le nom du processus lorsque le journal est écrit, mais il semble que ce ne soit même pas possible.
Idéalement, je voudrais également enregistrer les processus qui acceptent également les connexions entrantes.
Des idées sur la façon dont cela pourrait être possible avec iptables [ou autre chose] sur une boîte Linux?
Réponses:
Vous pouvez écrire un programme pour surveiller / proc / net / tcp, dont la sortie ressemble à ceci:
Vous pouvez ensuite relier les ports ouverts aux inodes, qui peuvent être liés aux processus et aux descripteurs de fichiers en effectuant un lien de lecture sur les descripteurs de fichiers répertoriés pour chaque processus:
Voir ici que l'inode 4847458 correspond au premier socket TCP dans la liste ci-dessus. La sortie de netstat -tapn le vérifie pour moi (et rappelez-vous que 0x50 == 80):
Lorsque le programme du moniteur remarque un changement dans / proc / net / tcp, analysez les données et déterminez si le changement est un socket nouvellement ouvert. Ensuite, vous pouvez simplement énumérer tous les descripteurs de fichiers pour chaque processus répertorié dans / proc, en effectuant un lien de lecture sur chacun pour trouver l'inode correspondant. Une fois que vous avez trouvé cela, vous disposez du pid propriétaire, à partir duquel vous pouvez obtenir tout ce que vous souhaitez, en particulier si vous avez un processus de comptabilité.
Si vous n'avez pas besoin que votre notification soit instantanée, alors votre programme de surveillance pourrait utiliser un sondage lent (peut-être une période de 50 ms ou 100 ms, voire 1000 ms).
la source
Vous voulez le module de correspondance propriétaire, qui ne fonctionne que sur la chaîne OUTPUT (et peut-être PREROUTING ...?). Lisez les documents, mais cela fonctionnera comme ceci:
la source
Rien à voir avec iptables ou la journalisation; mais voici une interface de type "top" 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 répartir 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."
la source
Alors que j'examine une question similaire, en essayant de limiter la vitesse de skype, j'ai trouvé
est un bon moyen de lier le numéro de port à pid / cmd, maintenant que pid-owner / cmd-owner n'est plus directement pris en charge dans iptables; vous devrez ensuite analyser le résultat, puis ajouter la règle iptables en fonction du port; naturellement, vous aurez besoin d'un peu de code de nettoyage après / lors de l'arrêt / redémarrage du système, etc; enregistrer le ou les numéros 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
vous devrez peut-être ajuster l'élément grep tcp en fonction de vos besoins
puis pour mes besoins, il était plus simple d'ajouter des filtres tc u32 en fonction des numéros de port, des entrées iptables en fonction des numéros de port similaires
la source