Comment utiliser la commande ss sous Linux
L'outil en ligne de commande `ss` représente une alternative moderne à la commande `netstat`. Sous Linux, il vous permet d'obtenir des informations détaillées sur les connexions réseau actives. Découvrons comment exploiter ce puissant outil.
`ss` : Une évolution de `netstat`
Conçue pour remplacer la commande obsolète `netstat`, la commande `ss` offre une vue précise des communications entre votre machine et les autres ordinateurs, les réseaux et services.
L'utilitaire `ss` affiche les données statistiques pour divers types de sockets, notamment le Protocole de contrôle de transmission (TCP), le Protocole de datagramme utilisateur (UDP), les sockets Unix (interprocessus) et les sockets bruts. Ces dernières, les sockets brutes, fonctionnent au niveau réseau du modèle OSI. Cela implique que les en-têtes TCP et UDP sont gérés par l'application et non par la couche de transport. Le protocole ICMP (Internet Control Message Protocol) et l'utilitaire `ping`, sont de bons exemples utilisant les sockets brutes.
Mise en œuvre de `ss`
Il est inutile d'installer `ss`, car cet utilitaire est inclus dans toutes les distributions Linux modernes. Cependant, le résultat de la commande peut s'avérer très volumineux ; nos tests ont révélé jusqu'à 630 lignes de données, parfois affichées sur une grande largeur.
C'est pour cette raison que nous avons choisi de présenter des extraits de résultats sous forme de texte, car des captures d'écran seraient peu pratiques. Nous avons adapté ces résultats pour en faciliter la compréhension.
Inventaire des connexions réseau
La commande `ss` exécutée sans arguments affiche les sockets qui ne sont pas en mode écoute, c'est-à-dire celles qui ne sont pas en état d'attente de connexions.
Pour observer ce comportement, entrez la commande suivante :
ss

Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process u_str ESTAB 0 0 * 41826 * 41827 u_str ESTAB 0 0 /run/systemd/journal/stdout 35689 * 35688 u_str ESTAB 0 0 * 35550 * 35551 ... u_str ESTAB 0 0 * 38127 * 38128 u_str ESTAB 0 0 /run/dbus/system_bus_socket 21243 * 21242 u_str ESTAB 0 0 * 19039 * 19040 u_str ESTAB 0 0 /run/systemd/journal/stdout 18887 * 18885 u_str ESTAB 0 0 /run/dbus/system_bus_socket 19273 * 17306 icmp6 UNCONN 0 0 *:ipv6-icmp *:* udp ESTAB 0 0 192.168.4.28%enp0s3:bootpc 192.168.4.1:bootps
Voici la signification des colonnes :
Netid : Le type de socket. Dans l'exemple ci-dessus, nous avons "u_str" pour un flux Unix, "udp" pour UDP et "icmp6" pour un socket ICMP IP version 6. Les différents types de sockets Linux sont expliqués dans les pages de manuel.
State : L'état dans lequel se trouve le socket.
Recv-Q : Le nombre de paquets reçus.
Send-Q : Le nombre de paquets envoyés.
Adresse locale:Port : L'adresse locale et le port utilisés (ou les valeurs équivalentes pour les sockets Unix).
Adresse homologue:Port : L'adresse distante et le port (ou les valeurs équivalentes pour les sockets Unix).
La colonne "State" est généralement vide pour les sockets UDP. Voici les différents états possibles pour les sockets TCP :
LISTEN : Côté serveur uniquement. Le socket attend qu'une demande de connexion soit effectuée.
SYN-SENT : Côté client uniquement. Ce socket a envoyé une demande de connexion et attend de voir si elle est acceptée.
SYN-RECEIVED : Côté serveur uniquement. Ce socket attend un accusé de réception après avoir accepté une demande de connexion.
ESTABLISHED : Côté serveur et client. Une connexion a été établie, permettant le transfert de données entre les deux.
FIN-WAIT-1 : Côté serveur et client. Ce socket attend une demande de fin de connexion de la part du socket distant ou un accusé de réception d'une demande de terminaison précédemment envoyée.
FIN-WAIT-2 : Côté serveur et client. Ce socket attend une demande de fin de connexion de la part du socket distant.
CLOSE-WAIT : Côté serveur et client. Ce socket attend une demande de fin de connexion de la part de l'utilisateur local.
CLOSING : Côté serveur et client. Ce socket attend un accusé de réception de demande de terminaison de la part du socket distant.
LAST-ACK : Côté serveur et client. Ce socket attend un accusé de réception de la demande de fin de connexion qu'il a envoyé au socket distant.
TIME-WAIT : Côté serveur et client. Ce socket a envoyé un accusé de réception au socket distant et attend la confirmation de bonne réception de l'accusé de réception.
CLOSED : Aucune connexion. Le socket a été fermé.
Affichage des sockets en écoute
Pour visualiser les sockets en mode écoute, ajoutez l'option `-l` (listen) :
ss -l

Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process nl UNCONN 0 0 rtnl:NetworkManager/535 * nl UNCONN 0 0 rtnl:evolution-addre/2987 * ... u_str LISTEN 0 4096 /run/systemd/private 13349 * 0 u_seq LISTEN 0 4096 /run/udev/control 13376 * 0 u_str LISTEN 0 4096 /tmp/.X11-unix/X0 33071 * 0 u_dgr UNCONN 0 0 /run/systemd/journal/syslog 13360 * 0 u_str LISTEN 0 4096 /run/systemd/fsck.progress 13362 * 0 u_dgr UNCONN 0 0 /run/user/1000/systemd/notify 32303 * 0
Ces sockets sont toutes en état non connecté et en écoute. "rtnl" signifie routage netlink, utilisé pour la communication entre le noyau et l'espace utilisateur.
Affichage de toutes les sockets
Pour afficher la totalité des sockets, utilisez l'option `-a` (all) :
ss -a

Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process nl UNCONN 0 0 rtnl:NetworkManager/535 * nl UNCONN 0 0 rtnl:evolution-addre/2987 * ... u_str LISTEN 0 100 public/showq 23222 * 0 u_str LISTEN 0 100 private/error 23225 * 0 u_str LISTEN 0 100 private/retry 23228 * 0 ... udp UNCONN 0 0 0.0.0.0:631 0.0.0.0:* udp UNCONN 0 0 0.0.0.0:mdns 0.0.0.0:* ... tcp LISTEN 0 128 [::]:ssh [::]:* tcp LISTEN 0 5 [::1]:ipp [::]:* tcp LISTEN 0 100 [::1]:smtp [::]:*
Le résultat inclut toutes les sockets, quel que soit leur état.
Affichage des sockets TCP
Il est possible d'utiliser des filtres pour cibler des types de sockets spécifiques. L'option `-t` (TCP) permet d'afficher uniquement les sockets TCP :
ss -a -t

Affichage des sockets UDP
L'option `-u` (UDP) permet de filtrer les résultats pour afficher uniquement les sockets UDP :
ss -a -u

State Recv-Q Send-Q Local Address:Port Peer Address:Port Process UNCONN 0 0 0.0.0.0:631 0.0.0.0:* UNCONN 0 0 0.0.0.0:mdns 0.0.0.0:* UNCONN 0 0 0.0.0.0:60734 0.0.0.0:* UNCONN 0 0 127.0.0.53%lo:domain 0.0.0.0:* ESTAB 0 0 192.168.4.28%enp0s3:bootpc 192.168.4.1:bootps UNCONN 0 0 [::]:mdns [::]:* UNCONN 0 0 [::]:51193 [::]:*
Affichage des sockets Unix
Pour visualiser les sockets Unix, ajoutez l'option `-x` (unix) :
ss -a -x

Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process u_str ESTAB 0 0 * 41826 * 41827 u_str ESTAB 0 0 * 23183 * 23184 u_str ESTAB 28 0 @/tmp/.X11-unix/X0 52640 * 52639 ... u_str ESTAB 0 0 /run/systemd/journal/stdout 18887 * 18885 u_str ESTAB 0 0 /run/dbus/system_bus_socket 19273 * 17306
Affichage des sockets brutes
L'option `-w` (raw) filtre les sockets brutes :
ss -a -w

Affichage des sockets IPv4
L'option `-4` (IPV4) liste les sockets utilisant le protocole TCP/IP version 4 :
ss -a -4

Affichage des sockets IPv6
L'option `-6` (IPV6) filtre les sockets IP version 6 :
ss -a -6

Filtrage des sockets par état
L'option `state` permet de lister les sockets en fonction de leur état : établie, en écoute ou fermée. On peut également utiliser l'option de résolution `-r` pour afficher les noms d'hôtes et les protocoles à la place des adresses IP et des ports.
La commande suivante affiche les connexions TCP établies avec tentative de résolution des noms :
ss -t -r state established

On observe quatre connexions établies. L'adresse "ubuntu20-04" a été résolue et "ssh" est affiché pour le port 22.
On peut utiliser la même méthode pour les sockets en écoute :
ss -t -r state listening

Recv-Q Send-Q Local Address:Port Peer Address:Port Process 0 128 localhost:5939 0.0.0.0:* 0 4096 localhost%lo:domain 0.0.0.0:* 0 128 0.0.0.0:ssh 0.0.0.0:* 0 5 localhost:ipp 0.0.0.0:* 0 100 localhost:smtp 0.0.0.0:* 0 128 [::]:ssh [::]:* 0 5 ip6-localhost:ipp [::]:* 0 100 ip6-localhost:smtp [::]:*
Filtrage des sockets par protocole
Les options `dport` et `sport` permettent de filtrer les sockets par protocole de destination et source.
La commande ci-dessous affiche les sockets utilisant le protocole HTTPS avec une connexion établie :
ss -a state established ‘( dport = :https or sport = :https )’

On peut utiliser le nom du protocole ou le port associé. Le port par défaut de SSH (Secure Shell) est le port 22.
Voici les mêmes résultats avec le nom du protocole, puis avec le numéro de port:
ss -a ‘( dport = :ssh or sport = :ssh )’
ss -a ‘( dport = :22 or sport = :22 )’

Les deux commandes donnent le même résultat.
Affichage des connexions vers une adresse IP
L'option `dst` (destination) permet de filtrer les connexions vers une adresse IP de destination précise :
Voici un exemple:
ss -a dst 192.168.4.25

Identification des processus associés
L'option `-p` (process) permet d'afficher les processus utilisant les sockets (l'utilisation de `sudo` est nécessaire) :
sudo ss -t -p

State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
ESTAB 0 0 192.168.4.28:57650 54.218.19.119:https users:(("firefox",pid=3378,fd=151))
ESTAB 0 0 192.168.4.28:ssh 192.168.4.25:43946 users:(("sshd",pid=4086,fd=4),("sshd",pid=3985,fd=4))
Cet exemple montre que les deux connexions TCP établies sont utilisées par le service SSH et par Firefox.
Un successeur digne
La commande `ss` reprend les fonctionnalités de `netstat`, mais d'une manière plus simple et accessible. Pour découvrir d'autres options et astuces, consultez la page de manuel.