|
|
 | |  |  | lister les ports ouverts sous Unix |  |
par Denis Ducamp (23/04/2001)
Cet article a pour but de montrer comment sur un système Unix déterminer
quels sont les ports ouverts ainsi que le processus lié à chacun d'eux.
Les deux commandes à connaître sont netstat et lsof. netstat est une
commande standard sous Unix alors que lsof est un programme complémentaire à
récupérer sur ftp://vic.cc.purdue.edu/pub/tools/unix/lsof/
De façon standard la commande netstat permet d'obtenir de nombreux
paramètres à propos des connexions réseau, des tables de routage, des
statistiques des interfaces, etc. Le paramètre -a affiche la liste complète
des sockets dont les sockets en écoute par les serveurs. Pour se limiter aux
sockets TCP et UDP, il est possible de rajouter respectivement les
paramètres -t ou -u . Il faut maintenant savoir comment interpréter la
sortie de la commande netstat, en voici un exemple :
$ netstat -antu
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 192.168.66.66:22 192.168.66.66:3812 ESTABLISHED
tcp 0 0 192.168.66.66:3812 192.168.66.66:22 ESTABLISHED
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN
udp 0 0 192.168.66.66:123 0.0.0.0:*
udp 0 0 127.0.0.1:123 0.0.0.0:*
udp 0 0 0.0.0.0:123 0.0.0.0:*
Cette exemple montre des ports ouverts en TCP et UDP (première colonne).
Pour les ports TCP, un port ouvert est montré par une valeur "0.0.0.0:*"
dans la colonne "Foreign Address" et une valeur "LISTEN" dans la colonne
State. Pour les ports UDP, un port ouvert est montré par une valeur
"0.0.0.0:*" dans la colonne "Foreign Address".
Ainsi sur ce système, les ports 22 et 25 sont ouverts en TCP et seul le port
123 l'est en UDP. Il est à remarquer ici que sur le port 123 en UDP,
l'écoute est limitée aux adresses 192.168.66.66 et 127.0.0.1 . Au contraire
pour le port 22 en TCP, l'écoute est effectuée sur toutes les adresses du
système (0.0.0.0) ce qui signifie que si des adresses sont ajoutées au
système alors elles répondront également sur ce port.
Pour un port donné, il est possible que ce soit deux processus différents ou
un même processus qui écoutent sur des adresses différentes. Il n'est bien
sûr pas possible que deux processus écoutent sur la même adresse et le même
port.
La sortie de netstat montre également les connexions en cours : aussi bien
pour les connexions TCP et UDP, la colonne "State" a pour valeur ESTABLISHED
et la colonne "Foreign Address" l'adresse et le port de la machine distante.
Malheureusement il n'est pas évident de déterminer le sens de la connexion,
c'est à dire de dire de façon certaine qui est le client et qui est le
serveur.
Certaines connexions peuvent être dans des modes différents tel que
CLOSE_WAIT et TIME_WAIT pour les connexions en cours de fermeture et
SYN_SENT pour les connexions en cours d'ouverture. Il existe bien d'autres
états, un pour chaque état TCP.
Avec certaines versions de netstat, l'option -p permet d'obtenir le numéro
et le nom du processus auquel l'adresse locale est associée :
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 142/sshd
tcp 0 0 192.168.66.66:22 192.168.66.66:3812 ESTABLISHED 3481/sshd
tcp 0 0 192.168.66.66:3812 192.168.66.66:22 ESTABLISHED 3480/ssh
Dans l'exemple ci dessus, le programme nommé sshd et de pid 142 écoute sur
le port 22 de toutes les adresses du système.
Le programme nommé sshd et de pid 3481 possède du côté local de sa connexion
le port 22 alors que la partie distante a pour adresse IP 192.168.66.66 et
pour port 3812. Le programme nommé ssh et de pid 3480 possède du côté local
de sa connexion le port 3812 alors que la partie distante a pour adresse IP
192.168.66.66 et pour port 22.
La commande lsof, capable de lister tous les fichiers ouverts par tous les
processus, peut être utilisée pour connaître les ports ouverts et identifier
leurs propriétaires. L'option nécessaire est -i qui permet de n'afficher que
les fichiers de type Internet :
# lsof -ni
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
sshd 142 root 3u IPv4 110 TCP *:ssh (LISTEN)
master 227 root 9u IPv4 199 TCP *:smtp (LISTEN)
xntpd 3726 root 4u IPv4 94391 UDP *:ntp
xntpd 3726 root 5u IPv4 94392 UDP 127.0.0.1:ntp
xntpd 3726 root 6u IPv4 94393 UDP 192.168.66.66:ntp
ssh 3480 ducamp 3u IPv4 94139 TCP 192.168.66.66:3812->192.168.66.66:ssh (ESTABLISHED)
sshd 3481 root 4u IPv4 94140 TCP 192.168.66.66:ssh->192.168.66.66:3812 (ESTABLISHED)
Ici également il est possible de voir les types de sockets, TCP ou UDP, dans
la colonne NODE puis l'adresse et le port d'écoute dans la colonne NAME. Les
lignes correspondant à des connexions en cours sont affichées avec une
flèche "->" séparant les adresses et ports sources et destinations. Les
ports en écoute n'ont pas de flèche et ne comportent qu'une adresse et un
port. Dans ce dernier cas, l'adresse peut être une étoile si le processus
écoute sur toutes les adresses simultanément.
Il est possible de demander à lsof de n'afficher qu'un port donné, par
exemple :
# lsof -ni tcp:22
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
sshd 142 root 3u IPv4 110 TCP *:ssh (LISTEN)
ssh 3480 ducamp 3u IPv4 94139 TCP 192.168.66.66:3812->192.168.66.66:ssh (ESTABLISHED)
sshd 3481 root 4u IPv4 94140 TCP 192.168.66.66:ssh->192.168.66.66:3812 (ESTABLISHED)
ainsi que de spécifier une adresse IP :
# lsof -ni 'udp@192.168.66.66:123'
COMMAND PID USER FD TYPE DEVICE SIZE NODE NAME
xntpd 3726 root 6u IPv4 94393 UDP 192.168.66.66:ntp
Il existe également d'autres commandes permettant d'obtenir les mêmes
résultats comme fstat et sockstat sous FreeBSD et fuser sous Linux, mais
lsof par ses capacités entendues reste l'outil de choix pour effectuer ce
genre de travail, d'autant plus qu'il fonctionne sur de très nombreux
systèmes.
|