Les connexions sockets avec la commande ss
Sommaire
I. Présentation
Je vous propose, au cours de ce tutoriel de voir ce que peut faire la commande ss (sockets statistics) par rapport à la commande classique netstat. Cette dernière agrège des informations venant de différents fichiers du pseudo-système de fichiers /proc. Cependant, cette approche n’est pas suffisante lorsqu’il il y a beaucoup de connexions à traiter. Du coup, le résultat à l’affichage est fortement ralenti.
La commande ss obtient ses informations directement à partir de l'espace noyau (donc déjà plus rapide que l’agrégation de données depuis des fichiers). Les options utilisées avec ses commandes sont très semblables à celles de netstat, remplaçant même cette commande avantageusement.
Donc, nous allons voir quelques exemples d'application de la commande ss permettant de vérifier les connexions réseau et les statistiques au niveau des sockets. Il s’agit d’une commande pouvant s’intégrer parfaitement dans les analyses que l’on fait au niveau réseau et aurait pu figurer parmi la liste d’outils proposées dans le cours sur le modèle TCP/IP.
II. Liste les connexions
La commande basique consiste à énumérer toutes les connexions présentent sur un système :
# ss|less Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port u_str ESTAB 0 0 @/tmp/dbus-VvJjz9EBBc 526779 * 526778 u_str ESTAB 0 0 * 14801853 * 14801854 u_str ESTAB 37 0 * 529524 * 529525 u_str ESTAB 0 0 * 21235 * 21236 u_str ESTAB 0 0 * 529511 * 529512 u_str ESTAB 0 0 * 526668 * 526667 u_str ESTAB 0 0 * 14801854 * 14801853 u_str ESTAB 0 0 * 529071 * 529673 u_str ESTAB 0 0 * 22474 * 22978 u_str ESTAB 0 0 @/tmp/.X11-unix/X0 526800 * 526799 u_str ESTAB 0 0 /run/systemd/journal/stdout 20563 * 20562
De ce premier résultat, on peut toujours filtrer la sortie pour ne récupérer que les lignes concernant les échanges TCP, UDP ainsi que les sockets Unix. Pour ne visualiser que les connexions TCP, UDP ou les connexions de type sockets, on doit filtrer de la façon suivante :
# ss –t
REMARQUE : on peut aussi utiliser la commande équivalente ci-dessous, qui revient strictement au même :
# ss –A tcp
III. Types de connexions
Par défaut, l’option –t affiche uniquement les connexions qui sont de type établies (c’est-à-dire avec l’appellation "ESTABLISHED") ou connectées (avec l’étiquette "CONNECTED"). On évite ainsi toutes les connexions à l’écoute (étiquetées "LISTENING"). Le fait d’ajouter également l’option –a permet aussi de récupérer les connexions à l’écoute.
De la même façon, pour lister les échanges non connectés (c’est-à-dire les sessions UDP), on exécutera la commande suivante :
# ss –ua State Recv-Q Send-Q Local Address:Port Peer Address:Port UNCONN 0 0 *:37211 *:* UNCONN 0 0 *:884 *:* UNCONN 0 0 *:1014 *:* UNCONN 0 0 127.0.0.1:1019 *:* UNCONN 0 0 *:mdns *:* UNCONN 0 0 *:44306 *:* UNCONN 0 0 *:34239 *:* UNCONN 0 0 192.168.122.1:domain *:*
IMPORTANT : l’option –a permet d’afficher à la fois les sockets "CONNECTING" et "LISTENING". Comme le protocole UDP est un protocole sans connexion, la commande ss –u, seule ne remontera aucune ligne, dans bien des cas. Par contre, le fait de lui adjoindre l’option –a permet d’afficher toutes les connexions UDP.
Si l’on ne souhaite que les sockets de type Unix, il faut exécuter la commande suivante :
# ss –x[a]
Ici, -a est optionnelle et affichera le même résultat avec ou sans l’option. On peut également éviter de résoudre les noms de machines et n’afficher que les adresses IP :
# ss –nt State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 64 10.97.3.198:22 10.24.10.2:55214
Pour lister les sockets TCP à l’écoute :
# ss -ltn
Pour lister les sockets UDP à l’écoute :
# ss –lun
IV. Nom de processus et pid
De la même façon, on peut également récupérer le nom du processus (ainsi que son PID associé) en exécutant la commande suivante :
# ss –ltp … users:(("rpcbind",pid=720,fd=4),("systemd",pid=1,fd=78)) LISTEN 0 128 :::us-cli :::* users:(("httpd",pid=24053,fd=4),("httpd",pid=20059,fd=4),("httpd",pid=20058,fd=4),("httpd",pid=20057,fd=4),("httpd",pid=20056,fd=4),("httpd",pid=20055,fd=4)) LISTEN 0 128 :::ssh :::* …
On peut d’ailleurs disposer de statistiques précises concernant le nombre de sockets de chaque catégorie :
# ss –s Total: 622 (kernel 646) TCP: 22 (estab 1, closed 6, orphaned 0, synrecv 0, timewait 0/0), ports 0 Transport Total IP IPv6 * 646 - - RAW 0 0 0 UDP 23 15 8 TCP 16 10 6 INET 39 25 14 FRAG 0 0 0
On peut également faire afficher les différentes informations inhérentes à chaque socket en utilisant l’option –o :
# ss –nt State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 64 10.97.3.198:22 10.24.10.2:55214 timer :(on,418ms,0)
V. Affichage des connexions IPv4 et IPv6
Si l’on souhaite afficher les sockets uniquement de type IPv4, on peut le faire au travers de la commande :
# ss –tl –f inet
REMARQUE : à contrario, si l’on souhaite n’afficher que le sockets de type IPv6 on peut le faire en utilisant l’une des commandes ci-dessous :
# ss –tl6 # ss –tl –f inet6
VI. Filtrage des connexions
La commande ss supporte également un mode étendu autorisant le filtrage et l’affichage d’une catégorie spécifique de sockets. Les expressions permettant le filtrage doivent être de la forme suivante :
# ss [Option] [Etat] [Adresse]
Exemple : pour filtrer les connexions TCP IPv4 en mode "ESTABLISHED" :
# ss –t4 state established
Les différents états que l’on peut utiliser comme filtre sont les suivants :
- established
- syn-sent
- syn-recv
- fin-wait-1
- fin-wait-2
- time-wait
- closed
- close-wait
- last-ack
- closing
- all (tous ceux présent ci-dessus)
- connected
- synchronized
- bucket (mini socket : time-wait et syn-recv)
- big (opposé à bucket)
Billet très complet, merci.
Question : Sur un système que vous découvrez, quelle est la commande ss que vous allez faire en priorité ?
Bonjour,
Merci pour votre commentaire.
Pour répondre à votre question, tout dépend du type de recherche que vous effectuez.
Pour filtrer les connexions de type TCP, mon premier réflexe serait d’exécuter la commande : ss -t (quitte à filtrer encore plus ultérieurement).
Après, si on recherche plutôt des connexions liées à des processus, il vaut mieux exécuter ss -ltp que l’on peut mettre en corrélation avec les processus eux mêmes via ps -t (pour formater en arbre de dépendance).
J’espère avoir répondu à votre requête.
Cordialement
Ph. PIERRE