Commande ss : vérifier les ports et les processus sous Linux, comparaison avec netstat

Environnement de testFamille DebianDebian 12iproute2 6.1.0compte utilisateur standardVérifié le 2026-11-04
Commandes réseaussEmplacement/usr/bin/ss

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 5
Netid 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              * 46066199

Pour 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 -t
State 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:https

En ajoutant aussi -n, les numéros de port restent tels quels au lieu d'être convertis en noms de service.

ss -tn
State 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:443

Les 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 -tln
State  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 -tl
State  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 -uln
State  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 -tulpn
Netid 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 -tlnp
State  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/fd
ls: cannot open directory '/proc/1/fd': Permission denied

Les 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 = :8000
State  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 = :443
State  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.

🧭 ss -p et les comptes : quand la colonne Process se remplit
Schéma explicatif
👤 Compte
$# ss -tlnp
Socket en écouteInformations du processusColonne Process
0.0.0.0:22LISTEN
➜
/proc/812/fdPropriétaire : root
➜
Processus d'autres comptes : illisiblesroot : lit tous les processusColonne Process videusers:(("sshd",pid=812,fd=3))
127.0.0.1:8080LISTEN
➜
/proc/2100/fdPropriétaire : root
➜
Processus d'autres comptes : illisiblesroot : lit tous les processusColonne Process videusers:(("app",pid=2100,fd=3))
127.0.0.1:8000LISTEN
➜
/proc/343015/fdPropriétaire : user
➜
Processus de mon compte : lisiblesroot : lit tous les processususers:(("python3",pid=343015,fd=3))
Un compte standard ne peut pas lire les informations /proc des processus lancés par d'autres comptes : la colonne Process de ces lignes reste vide, et seule la ligne python3 lancée avec votre propre compte est remplie.
root peut lire les informations de tous les processus : le nom du programme et le pid de chaque socket en écoute s'affichent donc dans la colonne Process.

4️⃣ Options de filtre d'état et de port de ss

  • ↪️ state, dport, sport

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 established
Recv-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:443

Les 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 = :443
State 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:443

Associé à -l, sport permet de vérifier uniquement si ce port est en écoute.

ss -tln sport = :22
State  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:51114

TIME-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-wait
Recv-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]:80

Si 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 foo
ss: wrong state name: foo

📌 Options principales : résultats de cet article

OptionRôleRésultat dans cet article
-tAffiche uniquement les sockets TCPLes sockets Unix disparaissent, et des noms de service comme ssh et https s'affichent à la place du port
-nAffiche les numéros de port au lieu des noms de serviceDans ss -tn, ssh s'affiche comme 22 et https comme 443
-lAffiche uniquement les sockets en écoute (LISTEN)ss -tln affiche des ports en écoute comme 22, 80 et 443
-uAffiche uniquement les sockets UDPLa colonne d'état de ss -uln indique UNCONN partout
-pAffiche dans la colonne Process le programme qui utilise chaque socketDepuis un compte standard, seul le python3 lancé par mon compte affiche un nom et un pid ; les programmes des autres comptes restent vides
-sRésume le nombre par type au lieu de lister les socketsestab 9 sur la ligne TCP correspond aux 9 lignes de la sortie de state established sans l'en-tête
-4Affiche uniquement les sockets IPv4Dans ss -t4ln, les lignes commençant par [::] disparaissent
-6Affiche uniquement les sockets IPv6Dans ss -t6ln, les lignes commençant par 0.0.0.0 et 127.0.0.1 disparaissent
-HAffiche uniquement les lignes de sockets, sans en-têteLe nombre de lignes de ss -H -tln | wc -l n'inclut pas l'en-tête
state ÉTATNe garde que les sockets dans cet étatLa sortie de state established commence par Recv-Q sans colonne State ; un nom inexistant donne [wrong state name: foo]
dport = :PORTFiltre selon le port du correspondantdport = :443 affiche deux lignes de connexions sortantes vers des serveurs https externes
sport = :PORTFiltre selon le port localsport = :22 avec -l affiche deux lignes en écoute sur le port 22, en IPv4 et en IPv6
src ADRESSENe garde que les sockets de cette adressess -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

OptionRôle
-a, --allAffiche ensemble les sockets en écoute et les sockets connectés
-r, --resolveRésout les adresses et les numéros de port en noms
-e, --extendedAffiche pour chaque socket des informations détaillées comme uid et inode
-o, --optionsAffiche les informations de minuteurs, comme la retransmission TCP et keepalive
-m, --memoryAffiche la mémoire utilisée par chaque socket
-i, --infoAffiche les informations internes de TCP (rtt, cwnd, etc.)
-x, --unixAffiche uniquement les sockets du domaine Unix
-w, --rawAffiche uniquement les sockets RAW
-f FAMILLESélectionne selon la famille de sockets, comme unix, inet, inet6, link ou netlink
-Q, --no-queuesAffiche la sortie sans les colonnes Recv-Q et Send-Q
-K, --killFerme de force les sockets qui correspondent au filtre ; ceux que le noyau ne prend pas en charge sont ignorés
-E, --eventsAffiche en continu les sockets qui se ferment
-V, --versionAffiche 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].

Simulateur de la commande ssiproute2 6.1.0
[root@server work]#
Cet écran de compte standard (user) fonctionne uniquement dans votre navigateur ; ↑↓ rappelle les commandes saisies auparavant.

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 -s
Total: 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         0

estab 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 -l
10

En 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 -tln
Active 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                  :::*                    LISTEN

Avec ss, l'état vient en premier et les adresses IPv6 sont entourées de crochets, comme [::]:22.

ss -tln
State  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.

netstatCommande de remplacement / ce qu'elle affiche
netstat -tlnss -tlnPorts TCP en écoute, sous forme de numéros
netstat -tulpnss -tulpnPorts TCP et UDP en écoute avec leurs programmes
netstat -tanss -tanTous les sockets TCP, sous forme de numéros
netstat -rip routeTable de routage
netstat -iip -s linkStatistiques des interfaces réseau
Les commandes ip qui remplacent netstat -r et netstat -i sont indiquées dans la section NOTES de la page man netstat(8) de net-tools.

🔢 FAQ & contenus recommandés

Avec -4, seuls les sockets IPv4 restent ; avec -6, seuls les sockets IPv6. Dans [ss -t4ln], les lignes commençant par [::] ont disparu, et dans [ss -t6ln], celles commençant par 0.0.0.0 et 127.0.0.1.

Si vous écrivez une adresse après src, seuls les sockets en écoute sur cette adresse restent. [ss -tln src 127.0.0.1] n'a affiché que les ports de 127.0.0.1, inaccessibles depuis l'extérieur du serveur.

Avec -H, seules les lignes de sockets s'affichent, sans en-tête. Lorsque vous comptez les lignes, comme avec [ss -H -tln | wc -l], la ligne d'en-tête n'est pas comptée avec elles.

🧭 Articles recommandés sur les commandes réseau 13 articles · 3 références
🗂️ Commandes réseau
📄 Commande ip 📄 Commandes netstat · ifconfig 📄 Commande nmtui 📄 Commande ss
📄 Commande SSH 📄 Commande rsync 📄 Commande wget 📄 Commandes rz · sz
📄 Commande host 📄 Commande nslookup
📄 Commande iptables 📄 Commande firewall-cmd 📄 Commande certbot

ℹ️ 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.

Laisser un commentaire

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

Prouvez que vous êtes humain : 1   +   3   =