Commande ss : vérifier les ports et les processus sous Linux, comparaison avec netstat
Sur un serveur Linux, la commande ss indique quels ports sont ouverts et qui est connecté. ss est l'outil de consultation des sockets d'iproute2 qui remplace netstat. En listant avec ss les ports en écoute (LISTEN) et les connexions sur un serveur Debian 12, nous avons constaté que, depuis un compte standard, le nom des programmes lancés par d'autres comptes n'apparaît pas dans la colonne Process, même avec -p.
Les sorties ci-dessous ont été obtenues avec une locale anglaise. Les adresses du serveur et de ses correspondants sont indiquées sous forme d'adresses d'exemple.
1️⃣ Utilisation de base de la commande ss et colonnes de la sortie
Si vous lancez ss sans option, les ports en écoute sont exclus et seuls les sockets avec une connexion établie s'affichent. Sur le serveur de test, les premières lignes étaient toutes des sockets Unix (u_str, u_dgr) que les programmes du serveur utilisent pour communiquer entre eux.
ss | head -n 5Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process
u_str ESTAB 0 0 * 1013903 * 1013904
u_dgr ESTAB 0 0 * 1013960 * 13394
u_str ESTAB 0 0 * 1013907 * 1013908
u_str ESTAB 0 0 * 46066198 * 46066199Pour ne voir que les connexions TCP, ajoutez donc -t. Les sockets Unix disparaissent, et des noms de service comme ssh et https s'affichent à la place des numéros de port.
ss -tState Recv-Q Send-Q Local Address:Port Peer Address:Port Process
ESTAB 0 0 203.0.113.10:ssh 198.51.100.7:51114
ESTAB 0 0 203.0.113.10:26676 192.0.2.15:https
ESTAB 0 0 203.0.113.10:29714 192.0.2.16:httpsEn ajoutant aussi -n, les numéros de port restent tels quels au lieu d'être convertis en noms de service.
ss -tnState Recv-Q Send-Q Local Address:Port Peer Address:Port Process
ESTAB 0 0 203.0.113.10:22 198.51.100.7:51114
ESTAB 0 0 203.0.113.10:26676 192.0.2.15:443
ESTAB 0 0 203.0.113.10:29714 192.0.2.16:443Les colonnes Recv-Q et Send-Q n'ont pas le même sens selon l'état du socket. Sur un socket connecté, Recv-Q est le nombre d'octets reçus que le programme n'a pas encore lus, et Send-Q le nombre d'octets envoyés dont le correspondant n'a pas encore confirmé la réception.
Sur un socket en écoute, Recv-Q est le nombre de connexions en attente dans la file et Send-Q la taille maximale de la file. Ces définitions proviennent de la page man netstat(8) de net-tools.
2️⃣ Vérifier les ports sous Linux (-tln, -uln, -tulpn)
La sortie sans option n'affiche pas les ports qui attendent des connexions : pour vérifier les ports ouverts, ajoutez donc -l, qui ne sélectionne que les sockets en écoute. [ss -tln] affiche les ports TCP en écoute sous forme de numéros.
ss -tlnState Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 511 0.0.0.0:80 0.0.0.0:*
LISTEN 0 511 0.0.0.0:443 0.0.0.0:*
LISTEN 0 511 127.0.0.1:8080 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 511 [::]:80 [::]:*
LISTEN 0 511 [::]:443 [::]:*Si Local Address vaut 0.0.0.0, le socket accepte les connexions arrivant sur toutes les adresses IPv4 du serveur ; avec 127.0.0.1, on ne peut s'y connecter que depuis le serveur lui-même. [::] désigne toutes les adresses IPv6 : les ports 22, 80 et 443 sont donc ouverts à la fois en IPv4 et en IPv6.
Sans -n, les numéros de port sont remplacés par des noms de service. Le port 8080 apparaît sous le nom http-alt.
ss -tlState Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0 128 0.0.0.0:ssh 0.0.0.0:*
LISTEN 0 511 0.0.0.0:http 0.0.0.0:*
LISTEN 0 511 0.0.0.0:https 0.0.0.0:*
LISTEN 0 511 127.0.0.1:http-alt 0.0.0.0:*
LISTEN 0 128 [::]:ssh [::]:*
LISTEN 0 511 [::]:http [::]:*
LISTEN 0 511 [::]:https [::]:*UDP n'établit pas de connexion : même ses sockets en écoute n'ont pas d'état LISTEN. Dans la sortie de [ss -uln], la colonne d'état indiquait UNCONN partout. Le port 68 (bootpc) est celui du client DHCP et le port 123 (ntp) celui de la synchronisation de l'heure.
ss -ulnState Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
UNCONN 0 0 0.0.0.0:68 0.0.0.0:*
UNCONN 0 0 203.0.113.10:123 0.0.0.0:*
UNCONN 0 0 127.0.0.1:123 0.0.0.0:*
UNCONN 0 0 0.0.0.0:123 0.0.0.0:*
UNCONN 0 0 [::1]:123 [::]:*
UNCONN 0 0 [::]:123 [::]:*Pour voir TCP et UDP en même temps, regroupez les options comme dans [ss -tulpn]. Dès qu'il y a plus d'un type, une colonne Netid s'ajoute en tête.
ss -tulpnNetid State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
udp UNCONN 0 0 0.0.0.0:68 0.0.0.0:*
udp UNCONN 0 0 203.0.113.10:123 0.0.0.0:*
udp UNCONN 0 0 127.0.0.1:123 0.0.0.0:*
udp UNCONN 0 0 0.0.0.0:123 0.0.0.0:*
udp UNCONN 0 0 [::1]:123 [::]:*
udp UNCONN 0 0 [::]:123 [::]:*
tcp LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
tcp LISTEN 0 511 0.0.0.0:80 0.0.0.0:*
tcp LISTEN 0 511 0.0.0.0:443 0.0.0.0:*
tcp LISTEN 0 511 127.0.0.1:8080 0.0.0.0:*
tcp LISTEN 0 128 [::]:22 [::]:*
tcp LISTEN 0 511 [::]:80 [::]:*
tcp LISTEN 0 511 [::]:443 [::]:*3️⃣ Vérifier les processus avec la commande ss (-p)
-p est l'option qui affiche dans la colonne Process le programme qui utilise chaque socket. Pourtant, en lançant [ss -tlnp] depuis un compte standard du serveur de test, la colonne Process est restée vide comme ci-dessous, comme si l'option n'avait pas été prise en compte.
ss -tlnpState Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 511 0.0.0.0:80 0.0.0.0:*
LISTEN 0 511 0.0.0.0:443 0.0.0.0:*
LISTEN 0 511 127.0.0.1:8080 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 511 [::]:80 [::]:*
LISTEN 0 511 [::]:443 [::]:*ss trouve le processus qui utilise un socket en lisant le dossier fd de chaque processus sous /proc. Un compte standard ne peut pas ouvrir le dossier fd d'un processus lancé par un autre compte : le nom de ce programme n'apparaît donc pas dans la colonne. Ouvrir depuis un compte standard le dossier du processus 1, lancé par root, provoque une erreur de permission.
ls /proc/1/fdls: cannot open directory '/proc/1/fd': Permission deniedLes programmes lancés avec votre propre compte apparaissent bien dans la colonne Process, même depuis un compte standard. Nous l'avons vérifié en lançant le serveur web simple de python3 sur le port 8000 de 127.0.0.1.
python3 -m http.server 8000 --bind 127.0.0.1 &Une fois le serveur lancé, ajoutez [sport = :8000] pour n'afficher que la ligne du port 8000.
ss -tlnp sport = :8000State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0 5 127.0.0.1:8000 0.0.0.0:* users:(("python3",pid=343015,fd=3))Les parenthèses qui suivent users contiennent, dans l'ordre, le nom du programme, le pid et le numéro de descripteur de fichier (fd).
Une fois la vérification terminée, arrêtez le serveur web simple avec [kill %1]. Si vous relancez ensuite [ss -tln sport = :8000], seule la ligne d'en-tête reste et la ligne du port 8000 n'apparaît plus.
Depuis le compte root, ss peut lire les informations de tous les processus, et la colonne Process est donc remplie. Quand plusieurs processus écoutent ensemble sur un même port, les parenthèses de users contiennent une entrée pour chacun d'eux. Les noms de programme et les pid de la sortie root ci-dessous sont des valeurs d'exemple.
ss -tlnp sport = :443State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0 511 0.0.0.0:443 0.0.0.0:* users:(("app",pid=2101,fd=6),("app",pid=2100,fd=6))
LISTEN 0 511 [::]:443 [::]:* users:(("app",pid=2101,fd=7),("app",pid=2100,fd=7))Pour trouver un programme à partir de son numéro de port, vous pouvez aussi utiliser la commande lsof sous la forme [lsof -i :443].
Dans le diagramme ci-dessous, vous pouvez changer de compte pour comparer l'évolution de la colonne Process selon le compte.
4️⃣ Options de filtre d'état et de port de ss
Même après avoir vérifié les ports ouverts, il faut encore filtrer à part qui y est connecté en ce moment. ss ne garde que les lignes voulues lorsque vous ajoutez des conditions de filtre après les options.
Si vous écrivez un nom d'état après state, seuls les sockets dans cet état restent. La sortie de [ss -tn state established] n'a pas de colonne State et commence par la colonne Recv-Q.
ss -tn state establishedRecv-Q Send-Q Local Address:Port Peer Address:Port Process
0 0 203.0.113.10:22 198.51.100.7:51114
0 0 203.0.113.10:26676 192.0.2.15:443
0 0 203.0.113.10:29714 192.0.2.16:443Les ports se filtrent avec dport (port du correspondant) et sport (port local). Les connexions sortant du serveur vers des serveurs https externes se sélectionnent avec [dport = :443].
ss -tn dport = :443State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
ESTAB 0 0 203.0.113.10:26676 192.0.2.15:443
ESTAB 0 0 203.0.113.10:29714 192.0.2.16:443Associé à -l, sport permet de vérifier uniquement si ce port est en écoute.
ss -tln sport = :22State Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*Regroupez plusieurs conditions avec des parenthèses et or, et entourez-les d'apostrophes pour que le shell n'interprète pas les parenthèses en premier. Voici le résultat obtenu en ne sélectionnant que les connexions ssh, d'après l'exemple de la page man.
ss -tn state established '( dport = :ssh or sport = :ssh )'Recv-Q Send-Q Local Address:Port Peer Address:Port Process
0 0 203.0.113.10:22 198.51.100.7:51114TIME-WAIT est l'état dans lequel une connexion reste un court moment après sa fermeture. Il n'apparaît pas dans la sortie par défaut : pour le voir, il faut le sélectionner à part avec [state time-wait].
ss -tn state time-waitRecv-Q Send-Q Local Address:Port Peer Address:PortProcess
0 0 127.0.0.1:28750 127.0.0.1:80
0 0 127.0.0.1:57698 127.0.0.1:8080
0 0 [::1]:31936 [::1]:80Si vous vous trompez de nom d'état, la commande s'arrête aussitôt en laissant une seule ligne d'erreur [wrong state name]. Voici le résultat obtenu en saisissant foo exprès. Les noms utilisables figurent sur la ligne TCP-STATES de la sortie de [ss -h].
ss -tn state fooss: wrong state name: foo📌 Options principales : résultats de cet article
| Option | Rôle | Résultat dans cet article | |
|---|---|---|---|
| -t | Affiche uniquement les sockets TCP | Les sockets Unix disparaissent, et des noms de service comme ssh et https s'affichent à la place du port | |
| -n | Affiche les numéros de port au lieu des noms de service | Dans ss -tn, ssh s'affiche comme 22 et https comme 443 | |
| -l | Affiche uniquement les sockets en écoute (LISTEN) | ss -tln affiche des ports en écoute comme 22, 80 et 443 | |
| -u | Affiche uniquement les sockets UDP | La colonne d'état de ss -uln indique UNCONN partout | |
| -p | Affiche dans la colonne Process le programme qui utilise chaque socket | Depuis un compte standard, seul le python3 lancé par mon compte affiche un nom et un pid ; les programmes des autres comptes restent vides | |
| -s | Résume le nombre par type au lieu de lister les sockets | estab 9 sur la ligne TCP correspond aux 9 lignes de la sortie de state established sans l'en-tête | |
| -4 | Affiche uniquement les sockets IPv4 | Dans ss -t4ln, les lignes commençant par [::] disparaissent | |
| -6 | Affiche uniquement les sockets IPv6 | Dans ss -t6ln, les lignes commençant par 0.0.0.0 et 127.0.0.1 disparaissent | |
| -H | Affiche uniquement les lignes de sockets, sans en-tête | Le nombre de lignes de ss -H -tln | wc -l n'inclut pas l'en-tête | |
| state ÉTAT | Ne garde que les sockets dans cet état | La sortie de state established commence par Recv-Q sans colonne State ; un nom inexistant donne [wrong state name: foo] | |
| dport = :PORT | Filtre selon le port du correspondant | dport = :443 affiche deux lignes de connexions sortantes vers des serveurs https externes | |
| sport = :PORT | Filtre selon le port local | sport = :22 avec -l affiche deux lignes en écoute sur le port 22, en IPv4 et en IPv6 | |
| src ADRESSE | Ne garde que les sockets de cette adresse | ss -tln src 127.0.0.1 n'affiche que les ports de 127.0.0.1, qui n'acceptent que les connexions depuis le serveur lui-même |
📎 Autres options : selon le manuel officiel
| Option | Rôle | |
|---|---|---|
| -a, --all | Affiche ensemble les sockets en écoute et les sockets connectés | |
| -r, --resolve | Résout les adresses et les numéros de port en noms | |
| -e, --extended | Affiche pour chaque socket des informations détaillées comme uid et inode | |
| -o, --options | Affiche les informations de minuteurs, comme la retransmission TCP et keepalive | |
| -m, --memory | Affiche la mémoire utilisée par chaque socket | |
| -i, --info | Affiche les informations internes de TCP (rtt, cwnd, etc.) | |
| -x, --unix | Affiche uniquement les sockets du domaine Unix | |
| -w, --raw | Affiche uniquement les sockets RAW | |
| -f FAMILLE | Sélectionne selon la famille de sockets, comme unix, inet, inet6, link ou netlink | |
| -Q, --no-queues | Affiche la sortie sans les colonnes Recv-Q et Send-Q | |
| -K, --kill | Ferme de force les sockets qui correspondent au filtre ; ceux que le noyau ne prend pas en charge sont ignorés | |
| -E, --events | Affiche en continu les sockets qui se ferment | |
| -V, --version | Affiche les informations de version |
🔲 Simulateur de la commande ss
Dans le simulateur ci-dessous, vous pouvez saisir vous-même les options et filtres vus jusqu'ici et comparer la sortie avec [netstat -tln].
5️⃣ Résumé des sockets avec ss (-s)
-s affiche un résumé du nombre de sockets par type au lieu de la liste. D'après la page man, il ne compte pas la liste un par un, mais rassemble les chiffres à partir de diverses statistiques.
ss -sTotal: 340
TCP: 48 (estab 9, closed 15, orphaned 0, timewait 13)
Transport Total IP IPv6
RAW 0 0 0
UDP 8 4 4
TCP 33 25 8
INET 41 29 12
FRAG 0 0 0estab sur la ligne TCP correspond au nombre de connexions établies à cet instant. Vous pouvez donc le comparer au nombre de lignes affichées par [state established] au même moment.
ss -tn state established | wc -l10En retirant la ligne d'en-tête des 10 lignes de sortie, il en reste 9, soit autant que l'estab 9 de -s. timewait 13 est le nombre de sockets TIME-WAIT, qui n'étaient visibles qu'en les sélectionnant avec [state time-wait].
6️⃣ Commande ss comparée à netstat
netstat fait partie du paquet net-tools, dont la page man qualifie netstat de programme pratiquement abandonné (mostly obsolete) et recommande d'utiliser ss à la place. Toutefois, les scripts écrits pour le format de sortie de netstat ne peuvent pas lire la sortie de ss telle quelle, car l'ordre des colonnes et la notation des adresses diffèrent.
En affichant les ports TCP en écoute du même serveur avec les deux commandes, netstat a placé l'état tout à la fin et écrit les adresses IPv6 sous la forme :::22.
netstat -tlnActive Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:80 0.0.0.0:* LISTEN
tcp 0 0 0.0.0.0:443 0.0.0.0:* LISTEN
tcp 0 0 127.0.0.1:8080 0.0.0.0:* LISTEN
tcp6 0 0 :::22 :::* LISTEN
tcp6 0 0 :::80 :::* LISTEN
tcp6 0 0 :::443 :::* LISTENAvec ss, l'état vient en premier et les adresses IPv6 sont entourées de crochets, comme [::]:22.
ss -tlnState Recv-Q Send-Q Local Address:Port Peer Address:PortProcess
LISTEN 0 128 0.0.0.0:22 0.0.0.0:*
LISTEN 0 511 0.0.0.0:80 0.0.0.0:*
LISTEN 0 511 0.0.0.0:443 0.0.0.0:*
LISTEN 0 511 127.0.0.1:8080 0.0.0.0:*
LISTEN 0 128 [::]:22 [::]:*
LISTEN 0 511 [::]:80 [::]:*
LISTEN 0 511 [::]:443 [::]:*Les options de netstat les plus courantes correspondent aux commandes ss et ip suivantes.
| netstat | Commande de remplacement / ce qu'elle affiche |
|---|---|
| netstat -tln | ss -tlnPorts TCP en écoute, sous forme de numéros |
| netstat -tulpn | ss -tulpnPorts TCP et UDP en écoute avec leurs programmes |
| netstat -tan | ss -tanTous les sockets TCP, sous forme de numéros |
| netstat -r | ip routeTable de routage |
| netstat -i | ip -s linkStatistiques des interfaces réseau |
🔢 FAQ & contenus recommandés











ℹ️ Mention d'affiliation
Le contenu de ce site contient des liens d'affiliation. Lorsqu'un visiteur achète un produit ou un service via l'un de ces liens, le site perçoit une commission du vendeur. Le montant payé par l'acheteur(il baisse lors des promotions ↓), lui, n'augmente pas. Les prix, remises et stocks indiqués correspondent à la date de rédaction et peuvent différer ; vérifiez-les donc auprès du vendeur avant d'acheter. Les produits sont choisis et évalués selon nos propres critères, et les commissions n'influencent ni l'ordre de présentation ni le contenu des évaluations.