06/11/2024

Commandes et Système

Les connexions sockets avec la commande ss

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)
author avatar
Philippe PIERRE
A exercé de nombreuses années en tant qu'administrateur de base de données et comme administrateur Système Unix/Linux. Il a enseigné les réseaux au CNAM (Paris). Aujourd'hui, employé en tant qu'ingénieur infrastructure, au sein d'un laboratoire pharmaceutique et administrant un cluster de calculs HPC, il connaît parfaitement les environnements GNU/Linux dans le cadre d'une entreprise et des systèmes de haute disponibilité. Il aime partager son expérience.
Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Envoyer par mail

2 commentaires sur “Les connexions sockets avec la commande ss

  • 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é ?

    Répondre
    • 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

      Répondre

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.