Trouver le processus qui utilise un port

Salut à tous

Je vois que j’ai régulièrement une requête vers safebrowsing-cache-google.com (de mon ordi via le port 54684; j’ai fouillé sur le net, rien d’alarmant là-dedans). Mais j’en suis arrivé à me poser le problème suivant: comment trouver le processus qui utilise un port ?
netstat -lapute |grep 54684 ne renvoie rien . (cette commande à des retours pour des processus qui “écoutent” un port, ce qui n’est pas le cas ici…enfin, je pense)

Des idées ?

Merci pour vos futurs éclaircissements.

Un processus qui utilise un port mais ne l’écoute pas, c’est que la connexion est en mode ESTABLISHED, donc :

netstat -pe |grep ESTABLISHED |grep num_du_port

en gros, sinon, t’enlève au moins le ‘l’ qui filtre l’état “listen”, tu garde le ‘e’ pour avoir le nom du programme et tu greppes sur le numero du port.

Si netstat -lapute |grep 54684 ne renvoie rien, netstat -pe |grep ESTABLISHED |grep 54684 n’en renverra pas plus.
Je planche plutôt sur l’idée suivante: écrire un script qui, dès que la requête visée sort sur tcpdump (par exemple safebrowsing-cache-google.com), le script lance lsof, et me liste tous les processus en cours, avec les ports.
Ce serait donc un petit script à base de tcpdump, awk et autres, mais je galère un peu (par exemple, comment insérer des commandes bash dans un script awk).

bien sur que si, a cause du l, qui dans “-lapute”, ne liste que les ports en ecoute.
Tu le vires, et tu liste toutes les connexions (modulo ce que filtrera le reste des parametres -apute)

edt: mouai… pas sur en fait… un peu brouillon cette commande… bon je verrais ca plus tard :017

“netstat -lapute |grep 54684 ne renvoie rien . (cette commande à des retours pour des processus qui “écoutent” un port, ce qui n’est pas le cas ici…enfin, je pense)”
Chez moi, la commande me renvoi une ligne même si le prog n’est pas en écoute sur le port en questoin (genre une connexion web sortante en cours)

Mais justement, mon pb est le suivant: je cherche quel processus a utilisé tel port (et pas “utilise tel port”).
Comme je ne compte pas rester dvt mon ordi, j’essaye de faire un script qui surveille pour moi la sortie de tcpdump, et regarde avec lsof quel est le processus concerné.

Mais justement, mon pb est le suivant: je cherche quel processus a utilisé tel port (et pas “utilise tel port”).
Comme je ne compte pas rester dvt mon ordi, j’essaye de faire un script qui surveille pour moi la sortie de tcpdump, et regarde avec lsof quel est le processus concerné.[/quote]

Arf… Désolé, j’avais mal compris :blush:
… Mais bien lu, à ma décharge :mrgreen: :

OMG ! Je vais vanter une solution graphique au lieu d’une en console !

Tu peux utiliser Wireshark pour faire tes captures. Il te suffit de rajouter une colonne pour le port (dans Edit > Preferences > Columns). Puis de cliquer sur la colonne en question pour voir les paquets triés par port…

Note que pour plus de sécurité, tu peux sniffer les paquets avec tcpdump ou tshark et n’utiliser wireshark que pour filtrer : linuxfr.org//~jgoffaux/29317.html#1102002

Sinon, le script, ça doit le faire aussi, soit en utilisant tcpdump/tshark, soit en lançant netstat en boucle…

Utilise lsof

lsof -i TCP:80

lsof -i

la dernière te donne toutes les connexions. Tu trouveras ton bonheur.

euh moi j’aime bien:

lsof -i -P :033

Ça enlève juste le renommage des ports connus dans /etc/service ou il y a un truc qui m’échappe?

Merci à tous pour vos conseils. Je vous tiens au courant.

C’est juste, et je préfère avoir le format numérique car le fichier peux prêter a confusion :slight_smile:
c’est surtout pour s’il veux faire un grep sur le format numérique 8)
bon les gouts et les couleur :slight_smile:

Me revoilà.
Un petit rappel de mon pb: je veux pouvoir connaître le processus qui a été utilisé par une IP “suspecte” (repérée par tcpdump ou wireshark, et en supposant que cette IP refera son apparition à un moment).
j’ajoute cette règle à netfilter:

Remarque: je récupère des lignes de ce type dans /var/log/ulog/syslogemu.log:

[quote="/var/log/ulog/syslogemu.log"]May 5 10:21:50 bigbouzin traque IN= OUT=eth0 MAC= SRC=192.168.1.3 DST=IP_suspecte LEN=52 TOS=00 PREC=0x00 TTL=64 ID=41218 CE DF PROTO=TCP SPT=33948 DPT=19150 SEQ=4114912712 ACK=3646346252 WINDOW=501 ACK URGP=0
[/quote]
ce qui m’interrese, c’est le port de sortie (en vert).
J’ai fait un script awk, nommé traqueur, qui va :
[ul]–> filtrer les lignes de /var/log/ulog/syslogemu.log contenant traque
–> en isoler le port de sortie
–> lancer un lsof -i|grep le_susdit_port[/ul]

[quote=“traqueur”]#! /usr/bin/awk -f
/traque/ { filtre les lignes contenant "traque"
if ($18 ~ /SPT/) { ce sont les champs 18 ou 19 qui contiennent le port de sortie, d’où le deux "if"
gsub(/[SPT=]/,"",$18) je vire le SPT= du champs, pour n’avoir que le n° de port
print “port de sortie:” $18
system (“lsof -i|grep “$18"” ) je lance lsof -i pour le port concerné
}
if ($19 ~ /SPT/) { idem que précédemment, dans le cas où le port de sortie est dans le champs 19
gsub(/[SPT=]/,”",$19)
print “port de sortie:” $19
system ("lsof -i|grep “$19"” )
}
}[/quote]
puis en console:

Le problème:
si je fais des tests sur un site, prenons le forum debian (IP 88.165.116.107), tout se passe bien a peu près bien:

# tail -f /var/log/ulog/syslogemu.log |awk -f traqueur port de sortie:43663 firefox-b 17451 yanlolot 23r IPv4 106727 0t0 TCP 192.168.1.3:43663->forum.debian-fr.org:www (ESTABLISHED) port de sortie:43663 firefox-b 17451 yanlolot 23r IPv4 106727 0t0 TCP 192.168.1.3:43663->forum.debian-fr.org:www (ESTABLISHED) port de sortie:43663 firefox-b 17451 yanlolot 23r IPv4 106727 0t0 TCP 192.168.1.3:43663->forum.debian-fr.org:www (ESTABLISHED) port de sortie:43663 port de sortie:43664 port de sortie:43663
Au bout d’un moment, lsof ne renvoie plus rien, alors qu’il y a des sorties sur des ports qui devraient apparaîtrent.

Encore plus foireux: un test sur l’IP du dns de mon FAI:

# tail -f /var/log/ulog/syslogemu.log |awk -f traqueur port de sortie:39611 port de sortie:39611 port de sortie:39614 port de sortie:39614 port de sortie:39614 port de sortie:39614 port de sortie:39611 port de sortie:39614 port de sortie:39614 port de sortie:39611 port de sortie:52484 port de sortie:39648 port de sortie:38089 port de sortie:33059 port de sortie:59091 port de sortie:52765 port de sortie:42603
Là, lsof ne me donne plus rien.

Je me demande si lsof ne serait pas trop lent ?: netfilter choppe l’IP voulue, et le temps que mon lsof s’exécute, le port concerné n’est plus utilisé.

Voilà où j’en suis: pour des requêtes rapides, mon script ne me renvoie rien. :confused:

Utilise l’option

[quote] --log-uid
Log the userid of the process which generated the packet.

[/quote] (mais il te faut utiliser LOG et non ULOG)

Arghhh, je ne l’avais pas vu cette option. Merci, je vais tester avec ça.

@fran.b: J’avais mal lu, l’option --log-uid va me donner l’id du user qui a envoyé la requête, et moi, ce qui m’interesse, c’est plutôt le PID, et il n’y a pas d’option --log-pid.
Je veux connaître le processus qui est à l’origine de la requête, pas le user.

flute, moi aussi j’ai mal lu. Il doit y avoir une option de ce type, ça me parait étonnant que ça n’existe pas…

On n’est pas les seuls à se poser la question:
stackoverflow.com/questions/7273 … t-initiate
kerneltrap.org/mailarchive/linu … /4/3189064
Malheureusement, aucune réponse dans les 2 cas :confused:
Le seul truc que j’ai, c’est mon script qui ne marchouille qu’à moitié…

[edit]le seul rapport avec pid dans le man d’iptables est --pid-owner:

--pid-owner processid Matches if the packet was created by a process with the given process id.
Mais ça n’est pas ça que je recherche.
[/edit]

Si t’as pas peur de faire chauffer ton CPU, ceci fonctionne bien chez moi (y compris sur les requêtes DNS en UDP : il me sort une 20aine de lignes pour une même requête DNS, ce qui signifie qu’il a le temps d’exécuter lsof | grep une 20aine de fois pendant la fraction de seconde où le paquet UDP est envoyé).

[code]#!/bin/sh

SCRIPT_DIR="$(dirname “$0”)“
LOG=”$SCRIPT_DIR/process.log"

if [ “$#” != “1” ]; then
cat >&2 <<HEREDOC
Usage:
$(basename “$0”) IP

Log des processus accédant à une adresse IP donnée, sous réserve que l’utilisateur ait les droits nécessaires.

HEREDOC
fi

IP="$1"

echo >&2 "Log des processus vers $LOG"
echo >&2 “Tapez Ctrl+C pour arrêter…”

touch "$LOG"
while true
do
lsof -ni | grep -F “>$IP” >> "$LOG"
done[/code]
Le point clef étant l’option “-n” de lsof qui l’empêche de résoudre les noms de domaine et l’oblige à afficher les adresses IP à la place, ce qui améliore énormément les performances.

Par contre j’admets, c’est bourrin. :005

@syam: c’est vrai que l’option -n de lsof améliore nettement ses performances. En tout cas suffisamment pour que les résultats de mon scripts soient corrects qd je surveille l’IP du forum (mon premier test de tt à l’heure), mais çe ne change rien pour l’IP des dns de mon FAI (mon deuxième test de tt à l’heure, lsof ne renvoie rien).
Et si, j’ai peur de faire chauffer mon CPU (je veux pouvoir lancer le script sur mon PC durant des heures et des heures). Ton script fait monter à 100% mon processeur.
Le script ne doit se déclencher qu’après avoir repéré l’IP, et ne pas tourner tte la journée pour chopper la requête lorsqu’elle fait son apparition.
Merci en tout cas.