La commande Socket Statistics (ss) est similaire à la commande netstat, en ce sens qu'elle permet d'afficher des informations de socket réseau utiles.
Depuis quelque temps, la page de manuel de netstat indique “Ce programme est obsolète. Le remplacement de netstat est ss.”. Cela va donc être une commande utile pour savoir comment aller de l'avant.
Heureusement, de nombreuses options sont similaires à celles utilisées par netstat, mais il y a quelques différences, comme nous le verrons.
La commande ss fait partie du package iproute de CentOS/Red Hat 7 Linux et est installée par défaut.
La syntaxe de la commande ss que nous allons utiliser ici est illustrée ci-dessous. En gros, nous pouvons spécifier des indicateurs et des filtres facultatifs, comme nous le verrons.
ss [options] [ FILTER ]
Par défaut, si nous exécutons la commande ss sans autres options spécifiées, la liste des sockets ouverts qui ont établi des connexions est affichée, par exemple, les sockets TCP, UDP ou UNIX.
[root@srv ~]# ss | head -n 5 Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port u_str ESTAB 0 0 * 17735 * 17734 u_str ESTAB 0 0 * 17734 * 17735 u_str ESTAB 0 0 * 17731 * 17732 u_str ESTAB 0 0 /run/systemd/journal/stdout 30822 * 30821
Dans l'exemple ci-dessus, j'ai limité la sortie. Sur mon serveur, plus de 500 lignes ont été affichées en exécutant la commande ss. Vous pouvez donc en utiliser un peu moins pour pouvoir le lire facilement ou ajouter des options supplémentaires à la fin.
Plutôt que de lister tous les sockets, nous pouvons utiliser l'option -l pour lister spécifiquement les sockets qui écoutent actuellement une connexion.
[root@srv ~]# ss -lt State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 *:ssh *:* LISTEN 0 100 127.0.0.1:smtp *:* LISTEN 0 128 :::ssh :::* LISTEN 0 100 ::1:smtp :::*
Dans cet exemple, nous avons également utilisé l'option -t pour répertorier uniquement TCP.
Nous pouvons imprimer le processus ou le numéro PID qui possède un socket avec l'option -p.
[root@srv ~]# ss -pl | grep httpd tcp LISTEN 0 128 :::http :::* users:(("httpd",pid=12095,fd=4),("httpd",pid=12094,fd=4),("httpd",pid=12093,fd=4),("httpd",pid=12092,fd=4),("httpd",pid=12091,fd=4),("httpd",pid=12090,fd=4))
Par défaut, ss ne résoudra que les numéros de port, comme nous l'avons vu précédemment, par exemple dans la ligne ci-dessous que nous pouvons voir 192.168.1.14:ssh où ssh est répertorié comme port local.
[root@srv ~]# ss Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port tcp ESTAB 0 64 192.168.1.14:ssh 192.168.1.191:57091
Cependant, si nous spécifions l'option -n, cette résolution n'aura pas lieu et nous verrons plutôt le numéro de port plutôt que le nom du service.
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port tcp ESTAB 0 0 192.168.1.14:22 192.168.1.191:57091
Note:
22 est maintenant affiché plutôt que: ssh car nous avons désactivé toute la résolution de noms de noms d'hôtes et de ports
Nous pouvons également faire l'inverse et résoudre à la fois l'adresse IP et le numéro de port avec l'option -r. Avec cela, nous voyons maintenant le nom d'hôte du serveur 192.168.1.14 répertorié.
[root@srv ~]# ss -r Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port tcp ESTAB 0 64 srv.oowy.lan:ssh 192.168.1.191:57091
Nous pouvons utiliser l'option -4 pour afficher uniquement les informations correspondant aux sockets IPv4. Dans l'exemple ci-dessous, nous utilisons également l'option -l pour répertorier tout ce qui est écouté sur une adresse IPv4.
[root@srv ~]# ss -l4 Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port udp UNCONN 0 0 *:45476 *:* udp UNCONN 0 0 *:bootpc *:* udp UNCONN 0 0 127.0.0.1:323 *:* tcp LISTEN 0 128 *:ssh *:* tcp LISTEN 0 100 127.0.0.1:smtp *:*
De même, nous pouvons utiliser l'option -6 pour afficher uniquement les informations relatives aux sockets IPv6. Dans l'exemple ci-dessous, nous utilisons également l'option -l pour répertorier tout ce qui est écouté sur une adresse IPv6.
[root@srv ~]# ss -l6 Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port raw UNCONN 0 0 :::ipv6-icmp :::* udp UNCONN 0 0 :::18539 :::* udp UNCONN 0 0 ::1:323 :::* tcp LISTEN 0 128 :::http :::* tcp LISTEN 0 128 :::ssh :::* tcp LISTEN 0 100 ::1:smtp :::*
L'option -t peut être utilisée pour afficher uniquement les sockets TCP. Lorsqu'il est combiné avec -l pour imprimer uniquement les sockets d'écoute, nous pouvons tout voir en écoutant sur TCP.
[root@srv ~]# ss -lt State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 *:ssh *:* LISTEN 0 100 127.0.0.1:smtp *:* LISTEN 0 128 :::http :::* LISTEN 0 128 :::ssh :::* LISTEN 0 100 ::1:smtp :::*
L'option -u peut être utilisée pour afficher uniquement les sockets UDP. Comme UDP est un protocole sans connexion, la simple exécution avec l'option -u n'affichera aucune sortie. Nous pouvons combiner ceci avec l'option -a ou -l pour voir toutes les sockets UDP d'écoute, comme indiqué ci-dessous.
[root@srv ~]# ss -ul State Recv-Q Send-Q Local Address:Port Peer Address:Port UNCONN 0 0 *:45476 *:* UNCONN 0 0 *:bootpc *:* UNCONN 0 0 127.0.0.1:323 *:* UNCONN 0 0 :::18539 :::* UNCONN 0 0 ::1:323 :::*
L'option -x peut être utilisée pour afficher uniquement les sockets de domaine unix.
[root@srv ~]# ss -x Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port u_str ESTAB 0 0 * 17735 * 17734 u_str ESTAB 0 0 * 17734 * 17735 u_str ESTAB 0 0 * 17731 * 17732 u_str ESTAB 0 0 /run/systemd/journal/stdout 30822 * 30821 u_str ESTAB 0 0 * 17732 * 17731 u_str ESTAB 0 0 * 17729 * 17728
L'option -m peut être utilisée pour afficher la quantité de mémoire utilisée par chaque socket.
[root@srv ~]# ss -ltm State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 50 127.0.0.1:56996 *:* skmem:(r0,rb87380,t0,tb16384,f0,w0,o0,bl0) LISTEN 0 50 127.0.0.1:55365 *:* skmem:(r0,rb87380,t0,tb16384,f0,w0,o0,bl0) LISTEN 0 50 127.0.0.1:52101 *:* skmem:(r0,rb87380,t0,tb16384,f0,w0,o0,bl0) LISTEN 0 50 127.0.0.1:36206 *:* skmem:(r0,rb87380,t0,tb16384,f0,w0,o0,bl0)
Nous pouvons voir un aperçu rapide des statistiques avec l'option -s.
[root@srv ~]# ss -s Total: 317 (kernel 1228) TCP: 214 (estab 26, closed 162, orphaned 0, synrecv 0, timewait 161/0), ports 0 Transport Total IP IPv6 * 1228 - - RAW 1 1 0 UDP 2 2 0 TCP 52 45 7 INET 55 48 7 FRAG 0 0 0
Nous pouvons spécifier l'état d'une socket pour afficher uniquement les sockets dans cet état. Par exemple, nous pouvons spécifier les états, y compris établi, syn-envoyé, syn-recv, fin-wait-1, fin-wait-2, time-wait, fermé, fermé-wait, last-ack, écouter et fermer. L'exemple ci-dessous montre toutes les connexions TCP établies.
Pour générer cela, j'ai été connecté au serveur par SSH et j'ai juste chargé une page Web d'Apache. Nous pouvons alors voir que les connexions à Apache se transforment rapidement en time-wait.
[root@srv ~]# ss -t state established Recv-Q Send-Q Local Address:Port Peer Address:Port 0 64 192.168.1.14:ssh 192.168.1.191:57091 0 0 ::ffff:192.168.1.14:http ::ffff:192.168.1.191:57373 0 0 ::ffff:192.168.1.14:http ::ffff:192.168.1.191:57372
[root@srv ~]# ss -t state time-wait Recv-Q Send-Q Local Address:Port Peer Address:Port 0 0 ::ffff:192.168.1.14:http ::ffff:192.168.1.191:57373 0 0 ::ffff:192.168.1.14:http ::ffff:192.168.1.191:57372
L'option -v peut être utilisée pour afficher des informations de version spécifiques pour la commande ss. Dans ce cas, nous voyons la version du paquet iproute qui fournit ss.
[root@srv ~]# ss -v ss utility, iproute2-ss130716
L'option -h peut être utilisée pour afficher de l'’'aide supplémentaire concernant la commande ss, il est bon d'utiliser cette référence rapide si vous avez besoin d'une brève description de certaines des options les plus couramment utilisées. Notez que la sortie complète ici n'a pas été incluse pour des raisons de brièveté.
[root@srv ~]# ss -h Usage: ss [ OPTIONS ]