Outils du sysadmin Linux : ss

networks-background

Nouvelle année, nouvelles résolutions. Même si l’activité du blog tend à diminuer ses derniers temps, et ce à cause de mon emploi du temps assez serré et du travail sur Sonerezh (bon ok je me suis remis à Battlefield 3 aussi :/), j’ai décidé de lancer une nouvelle rubrique intitulé « Outils du sysadmin Linux ». Cette rubrique contiendra des fiches pratiques à propos d’outils qu’il est indispensable de connaître pour tout administrateur Linux qui se respecte.

Ces fiches pratiques se veulent claires, enrichies d’exemples pour que ceux qui découvrent les outils en questions ne soient pas perdus et aient envie d’apprendre et de progresser.

Et on commence aujourd’hui avec un outil intitulé ss.

SS (pour Socket Statistics) est un outil qui s’utilise en ligne de commande et qui vient remplacer l’ancien netstat aujourd’hui déprécié. SS permet en outre de récupérer un plus grand nombre d’informations que netstat, est plus rapide, et va chercher ces informations directement dans /proc.

Je rappelle que /proc est un pseudo-système de fichier dynamiquement généré au démarrage de l’hôte par Procfs. Il contient des répertoires correspondants aux différents processus en cours sur votre machine, ainsi qu’un grand nombre d’informations détaillées sur votre matériel. Le très connu /proc/cpuinfo vous donne plein de détails sur votre ou vos processeurs par exemple.

Voici quelques exemples d’utilisation de ss qui devraient vous permettre de mieux appréhender ses possibilités.

Utilisation basique : lister toutes les connexions

C’est évidemment la première chose que l’on a envie de taper…

ss | less
Netid State      Recv-Q Send-Q                     Local Address:Port                         Peer Address:Port   
u_str ESTAB      0      0                                      * 6782615                                 * 6783210
u_str ESTAB      0      0                                      * 8241723                                 * 8241722
u_str ESTAB      0      0                                      * 8242377                                 * 8242376
u_str ESTAB      0      0                                      * 8242340                                 * 8242341
 
...

Par exemple moi qui suis en train d’écrire cet article je trouve un peu plus bas :

tcp    ESTAB      0      0        192.168.0.109:38166     91.121.166.59:https   
tcp    ESTAB      0      0        192.168.0.109:37135     91.121.166.59:https   
tcp    ESTAB      0      0        192.168.0.109:38161     91.121.166.59:https

Mais comme vous avez pu le constater, un simple « ss » est un peu brutal puisqu’il nous sort TOUTES les connexions : aussi bien TCP, UDP, Socket Unix… Donc ça fait beaucoup. Heureusement on va pouvoir filtrer.

Filtrer les connexions TCP, UDP ou Unix

Les options sont assez intuitives à utiliser :

  • -t / --tcp : n’affiche que les connexions TCP
  • -u / --udp : n’affiche que les connexions UDP
  • -x / --unix : n’affiche que les connexions Unix
ss -t
State       Recv-Q Send-Q                       Local Address:Port                           Peer Address:Port   
ESTAB       0      0                            192.168.0.109:40400                         213.186.33.20:imaps   
ESTAB       0      0                            192.168.0.109:38162                         91.121.166.59:https   
ESTAB       0      0                            192.168.0.109:36799                         91.121.166.59:https

On voit que mon client de messagerie est ouvert et qu’il est connecté au port IMAPS de mon serveur de messagerie 213.186.33.20 (OVH en l’occurrence). Attention cependant l’option -t n’affiche que les connexions ayant l’état « ESTABLISHED » ou « CONNECTED ». Si les autres états vous intéressent (je pense à « LISTENNING »), ajoutez un -a.

Cette option -A est particulièrement utile si l’on observe les connexions UDP d’une machine. En effet, comme UDP n’est pas un protocole orienté connexion (pas de négociation), ss -u ne renverra en général rien. Le -A force ss à afficher toutes les connexions UDP.
ss -au
State       Recv-Q Send-Q                       Local Address:Port                           Peer Address:Port  
UNCONN      0      0                                        *:openvpn                                   *:*

Afficher les numéros de port / ne pas résoudre les IPs

Si vous souhaitez un affichage plus « numérique », vous pouvez demander à SS de ne pas résoudre noms de domaines et noms de services. Le traitement s’en trouvera allégé.

ss -nt
State       Recv-Q Send-Q                         Local Address:Port                           Peer Address:Port 
ESTAB       0      0                              192.168.0.109:40400                         213.186.33.20:993   
ESTAB       0      0                              192.168.0.109:38162                         91.121.166.59:443

On retrouve le port distant 993 qui correspond à IMAPS, soit mon client de messagerie.

Lister uniquement les connexions ayant l’état « LISTENNING »

C’est plus ou moins l’inverse de la commande ss -t. Les connexions en écoute s’affichent avec la commade ss -lPar exemple ici sur le serveur qui héberge le blog :

ss -lnt
State       Recv-Q Send-Q                Local Address:Port                  Peer Address:Port 
LISTEN      0      128                               *:80                               *:*         
LISTEN      0      128                               *:443                              *:* 
...

On remarque un port 80 (HTTP) et un port 443 (HTTPS) en attente de connexion.

Afficher le nom du processus lié et son pid

On peut connaître le nom des processus à qui appartiennent ses connexions ainsi que leur pid en utilisant l’option -p.

ss -lpt
State       Recv-Q Send-Q                Local Address:Port                  Peer Address:Port 
ESTAB       0      0                    192.168.106.10:38116                93.184.220.29:80     users:(("firefox",pid=3817,fd=40))
ESTAB       0      0                    192.168.106.10:38118                91.121.166.59:22     users:(("ssh",pid=3691,fd=3))
ESTAB       0      0                    192.168.106.10:35297                 54.68.118.19:443    users:(("firefox",pid=3817,fd=47))

Ça commence à devenir intéressant non ? 🙂

Afficher des statistiques avec SS

Et oui SS sait aussi faire ça ! Exemple :

ss -s
Total: 492 (kernel 0)
TCP:   77 (estab 25, closed 13, orphaned 1, synrecv 0, timewait 13/0), ports 0
 
Transport Total     IP        IPv6
*	  0         -         -        
RAW	  0         0         0        
UDP	  10        9         1        
TCP	  64        58        6        
INET	  74        67        7        
FRAG	  0         0         0

J’aurais bien aimé pouvoir vous apporter plus de précisions sur ces statistiques mais le manuel n’est pas très parlant…

Afficher les informations du timer

Ça se passe avec l’option -o :

sudo ss -ont
ESTAB      0      0                                192.168.100.55:35512                            173.255.230.5:80     timer:(keepalive,032ms,0)
ESTAB      0      0                                192.168.100.55:45141                            80.239.216.98:443   
ESTAB      0      0                                192.168.100.55:36198                             54.149.61.25:443    timer:(keepalive,30sec,0)
ESTAB      0      0                                192.168.100.55:35788                            91.121.166.59:443   
ESTAB      0      0                                192.168.100.55:35797                            91.121.166.59:443    timer:(keepalive,119min,0)
...

SS et les filtres

La commande SS fourni un ensemble de filtres pour permettre aux administrateurs d’analyser les connexions en détail. Ces filtres doivent respecter la syntaxe suivante

ss [OPTIONS] [NOM-FILTRE] [ARGUMENTS]

Filtrer les états

Par exemple si je cherche à afficher toutes les connexions IPv4 ayant l’état « ESTABLISHED » (ou connecté) :

ss -t4 state established
Recv-Q Send-Q                               Local Address:Port                                   Peer Address:Port   
0      0                                   192.168.100.55:35046                               173.194.116.111:https   
0      0                                   192.168.100.55:57947                                 157.56.250.66:imaps   
0      0                                   192.168.100.55:34196                                 213.186.33.20:imaps  
0      0                                   192.168.100.55:53446                                173.194.66.189:https   
...
Pour rappel une connexion TCP peut avoir les états suivants (qui sont autant de noms de filtres) : ESTABLISHED, SYN-SENT, SYN-RECV, FIN-WAIT1, FIN-WAIT2, TIME-WAIT, CLOSED, CLOSE-WAIT, LAST-ACK et CLOSING.
On trouve aussi les filtres all (tous), connected (tous sauf LISTEN et CLOSED), synchronized (tous sauf SYN-SENT), bucket et big, son opposé.

Beaucoup de ces filtres ne renverront en général rien puisque certains état utilisés lors des phases de négociation sont très rapide. Si vous voulez vraiment en voir vous pouvez surveiller un état en utilisant watch -n 0,1 ss -t4 state syn-sent.

Filtrer les adresses et les ports

SS supporte aussi les filtres par adresse ip et par port. Voyons un peu :

ss -at '( dport = :ssh or sport = :ssh )'
State      Recv-Q Send-Q                          Local Address:Port                              Peer Address:Port   
ESTAB      0      0                              192.168.100.55:32866                            91.121.166.59:ssh

Vous l’avez deviné je demande à SS de ne m’afficher que les connexions tcp à destination ou en provenance du port SSH, soit le 22. D’autres exemples :

ss -nt '( dport = :443 or dport = :80 )'
State      Recv-Q Send-Q                            Local Address:Port                              Peer Address:Port
CLOSE-WAIT 1      0                                192.168.100.55:44001                           98.137.200.255:80
ESTAB      0      0                                192.168.100.55:53446                           173.194.66.189:443
CLOSE-WAIT 1      0                                192.168.100.55:34090                           146.185.182.33:80
ESTAB      0      0                                192.168.100.55:49405                           173.194.66.113:443
ESTAB      0      0                                192.168.100.55:35788                            91.121.166.59:443
ESTAB      0      0                                192.168.100.55:35792                            91.121.166.59:443
ESTAB      0      0                                192.168.100.55:36029                            91.121.166.59:443

Ou son équivalent plus court : ss -nt dst :443 or dst :80.

# Filtre sur IP, port (différentes notations)
ss -nt dst 91.121.166.59
ss -nt dst 192.168.100.0/24
ss -nt dst 91.121.166.59:80

Et pour couronner le tout, ss propose aussi des opérateurs pour mettre en place des filtres plus complexes. Les opérateurs disponibles :

<= ou le : inférieur ou égal à >= ou ge : supérieur ou égal à
== ou eq : égal à
!= ou ne : différent de
< ou lt : strictement inférieur à > ou gt : strictement supérieur à

Voilà avec ça j’espère que vous allez pouvoir analyser les connexions de votre machine avec précision ! Si vous avez des questions ou si vous souhaitez aller plus loin, vous pouvez vous référer au manuel Linux sur SS.


Source : binarytides.com
Source de l’image : wallhaven.cc

Cet article vous a plu ? Partagez-le sur les réseaux sociaux !

Twitter Facebook Google Plus email