ss - statistiques de socket
Dans un tutoriel précédent, nous avons vu comment utiliser la commande netstat pour obtenir des détails sur les connexions réseau/socket. Cependant, la commande netstat a longtemps été obsolète et remplacée par la commande ss de la suite d'outils iproute.
La commande ss est capable d'afficher des détails sur les connexions réseau avec plus d'informations que la commande netstat et elle est plus rapide. La commande netstat lit divers fichiers /proc pour collecter des informations. Cependant, cette approche est plus lente lorsqu'il y a beaucoup de connexions à afficher.
La commande ss obtient ses informations directement à partir de l'espace du noyau. Les options utilisées avec les commandes ss sont très similaires à netstat, ce qui en fait un remplacement facile.
Donc, dans ce tutoriel, nous allons voir quelques exemples d'utilisation de la commande ss pour vérifier les connexions réseau et les statistiques de socket.
1. Lister toutes les connexions
La commande la plus simple consiste à lister toutes les connexions.
$ ss | less Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port u_str ESTAB 0 0 * 15545 * 15544 u_str ESTAB 0 0 * 12240 * 12241 u_str ESTAB 0 0 @/tmp/dbus-2hQdRvvg49 12726 * 12159 u_str ESTAB 0 0 * 11808 * 11256 u_str ESTAB 0 0 * 15204 * 15205 .....
Nous dirigeons la sortie vers moins afin que la sortie soit défilable. La sortie contiendra tous les détails de connexion tcp, udp et unix socket.
2. Filtrez les connexions tcp, udp ou unix
Pour afficher uniquement les connexions tcp ou udp ou unix, utilisez l'option t, u ou x.
$ ss -t State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 0 192.168.1.2:43839 108.160.162.37:http ESTAB 0 0 192.168.1.2:43622 199.59.149.201:https ESTAB 0 0 192.168.1.2:33141 83.170.73.249:ircd ESTAB 0 0 192.168.1.2:54028 74.125.135.125:xmpp-client
$ ss -t OR $ ss -A tcp
Par défaut, l'option "t" seule va signaler uniquement les connexions qui sont "établies" ou CONNECTÉES". Elle ne signale pas les sockets tcp qui sont "À L'ÉCOUTE". Utilisez l'option '-a' avec t, pour signaler tous à la fois.
Lister toutes les connexions udp
$ ss -ua State Recv-Q Send-Q Local Address:Port Peer Address:Port UNCONN 0 0 192.168.1.2:48268 *:* UNCONN 0 0 192.168.1.2:56575 *:* UNCONN 0 0 *:40309 *:* UNCONN 0 0 192.168.1.2:56879 *:* UNCONN 0 0 *:49014 *:* UNCONN 0 0 192.168.1.2:53124 *:* UNCONN 0 0 127.0.1.1:domain *:*
$ ss -a -A udp
The a option tells ss to report both "CONNECTED" and "LISTENING" sockets. Since UDP is a connection-less protocol, just "ss -u" will not report anything in most cases. Therefore we use the "a" option report all UDP connections (connected and listening).
De même, utilisez l'option x pour répertorier toutes les connexions socket unix.
3. Ne pas résoudre le nom d'hôte
Pour obtenir la sortie plus rapidement, utilisez l'option "n" pour empêcher ss de résoudre les adresses IP en noms d'hôte. Mais cela empêchera également la résolution des numéros de port.
$ ss -nt State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 0 192.168.1.2:43839 108.160.162.37:80 ESTAB 0 0 192.168.1.2:51350 74.125.200.84:443 ESTAB 0 0 192.168.1.2:33141 83.170.73.249:6667 ESTAB 0 0 192.168.1.2:54028 74.125.135.125:5222 ESTAB 0 0 192.168.1.2:48156 66.196.120.44:5050
4. Afficher uniquement les prises d'écoute
Cela listera toutes les prises d'écoute. Par exemple, le serveur Web apache ouvre une connexion socket sur le port 80 pour écouter les connexions entrantes.
$ ss -ltn State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 5 127.0.1.1:53 *:* LISTEN 0 128 127.0.0.1:631 *:* LISTEN 0 128 ::1:631 :::*
La commande ci-dessus répertorie toutes les connexions "tcp" "d'écoute". L'option n désactive la résolution du nom d'hôte des adresses IP, ce qui accélère la sortie.
Pour lister toutes les connexions udp en écoute, remplacez t par u
$ ss -lun State Recv-Q Send-Q Local Address:Port Peer Address:Port UNCONN 0 0 127.0.1.1:53 *:* UNCONN 0 0 *:68 *:* UNCONN 0 0 192.168.1.2:123 *:* UNCONN 0 0 127.0.0.1:123 *:* UNCONN 0 0 *:123 *:* UNCONN 0 0 *:5353 *:* UNCONN 0 0 *:47799 *:* UNCONN 0 0 *:25322 *:* UNCONN 0 0 :::54310 :::* .....
5. Afficher le nom et le pid du processus
Pour imprimer le nom/pid du processus propriétaire de la connexion, utilisez l'option p
$ ss -ltp State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 100 127.0.0.1:smtp *:* LISTEN 0 128 127.0.0.1:9050 *:* LISTEN 0 128 *:90 *:* LISTEN 0 128 *:db-lsp *:* users:(("dropbox",3566,32)) LISTEN 0 5 127.0.0.1:6600 *:* LISTEN 0 128 127.0.0.1:9000 *:* users:(("php5-fpm",1620,0),("php5-fpm",1619,0))
Dans la sortie ci-dessus, la dernière colonne contient le nom du processus et le pid. Dans cet exemple, dnsmasq est le nom du processus et 1299 est le pid.
$ sudo ss -ltp [sudo] password for enlightened: State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 100 127.0.0.1:smtp *:* users:(("master",2051,12)) LISTEN 0 128 *:90 *:* users:(("nginx",1701,6),("nginx",1700,6),("nginx",1699,6),("nginx",1697,6),("nginx",1696,6)) LISTEN 0 5 127.0.0.1:6600 *:* users:(("mpd",2392,5)) LISTEN 0 128 127.0.0.1:9000 *:* users:(("php5-fpm",1620,0),("php5-fpm",1619,0),("php5-fpm",1616,7)) LISTEN 0 16 *:2633 *:* users:(("oned",1853,16)) LISTEN 0 50 127.0.0.1:mysql *:* users:(("mysqld",1095,10)) LISTEN 0 5 127.0.1.1:domain *:* users:(("dnsmasq",1347,5)) LISTEN 0 32 *:ftp *:* users:(("vsftpd",1051,3)) LISTEN 0 128 *:ssh *:* users:(("sshd",1015,3)) LISTEN 0 128 127.0.0.1:ipp *:* users:(("cupsd",688,11)) LISTEN 0 128 :::http :::* users:(("apache2",5322,4),("apache2",5321,4),("apache2",5317,4),("apache2",5316,4),("apache2",5313,4),("apache2",2505,4)) LISTEN 0 128 :::ssh :::* users:(("sshd",1015,4)) LISTEN 0 128 ::1:ipp :::* users:(("cupsd",688,10))
6. Imprimer les statistiques récapitulatives
L'option s imprime les statistiques.
$ ss -s Total: 526 (kernel 0) TCP: 10 (estab 7, closed 0, orphaned 0, synrecv 0, timewait 0/0), ports 0 Transport Total IP IPv6 * 0 - - RAW 0 0 0 UDP 15 9 6 TCP 10 9 1 INET 25 18 7 FRAG 0 0 0
7. Afficher les informations de la minuterie
Avec l'option '-o', les informations de temps de chaque connexion seraient affichées. Les informations de la minuterie indiquent combien de temps avec
$ ss -tn -o State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 0 192.168.1.2:43839 108.160.162.37:80 ESTAB 0 0 192.168.1.2:36335 204.144.140.26:80 timer:(keepalive,26sec,0) ESTAB 0 0 192.168.1.2:33141 83.170.73.249:6667 ESTAB 0 0 192.168.1.2:58857 74.121.141.84:80 timer:(keepalive,23sec,0) ESTAB 0 0 192.168.1.2:42794 173.194.40.239:80 timer:(keepalive,32sec,0)
8. Afficher uniquement les connexions socket IPv4 ou IPv6
Pour afficher uniquement les connexions socket IPv4, utilisez l'option '-f inet' ou '-4'.
$ ss -tl -f inet State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 100 127.0.0.1:smtp *:* LISTEN 0 128 127.0.0.1:9050 *:* LISTEN 0 128 *:90 *:* LISTEN 0 128 *:db-lsp *:* LISTEN 0 5 127.0.0.1:6600 *:*
Pour afficher uniquement les connexions IPv6, utilisez l'option '-f inet6' ou '-6'.
$ ss -tl6 State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 100 ::1:smtp :::* LISTEN 0 128 :::12865 :::* LISTEN 0 128 :::http :::* LISTEN 0 128 :::ssh :::* LISTEN 0 128 ::1:ipp :::*
9. Filtrage des connexions par état tcp
La commande ss prend en charge les filtres qui peuvent être utilisés pour afficher uniquement des connexions spécifiques. L'expression de filtre doit être suffixée après toutes les options. La commande ss accepte le filtre au format suivant.
$ ss [ OPTIONS ] [ STATE-FILTER ] [ ADDRESS-FILTER ]
Voici maintenant quelques exemples sur la façon de filtrer les connexions de socket par états de socket.
Pour afficher toutes les sockets tcp Ipv4 qui sont dans l'état "connecté".
$ ss -t4 state established Recv-Q Send-Q Local Address:Port Peer Address:Port 0 0 192.168.1.2:54436 165.193.246.23:https 0 0 192.168.1.2:43386 173.194.72.125:xmpp-client 0 0 192.168.1.2:38355 199.59.150.46:https 0 0 192.168.1.2:56198 108.160.162.37:http
Affichage des sockets avec attente d'état
$ ss -t4 state time-wait Recv-Q Send-Q Local Address:Port Peer Address:Port 0 0 192.168.1.2:42261 199.59.150.39:https 0 0 127.0.0.1:43541 127.0.0.1:2633
L'état peut être l'un des suivants
1. established 2. syn-sent 3. syn-recv 4. fin-wait-1 5. fin-wait-2 6. time-wait 7. closed 8. close-wait 9. last-ack 10. closing 11. all - All of the above states 12. connected - All the states except for listen and closed 13. synchronized - All the connected states except for syn-sent 14. bucket - Show states, which are maintained as minisockets, i.e. time-wait and syn-recv. 15. big - Opposite to bucket state.
Notez que de nombreux états comme syn-sent, syn-recv n'afficheront aucune socket la plupart du temps, car les sockets restent dans de tels états pendant très peu de temps. L'idéal serait d'utiliser la commande watch pour détecter ces états de socket en temps réel.
Voici un exemple
$ watch -n 1 "ss -t4 state syn-sent"
Après avoir exécuté la commande ci-dessus, essayez d'ouvrir un site Web dans un navigateur ou téléchargez quelque chose à partir d'une URL. Immédiatement, vous devriez voir des connexions de socket apparaître dans la sortie, mais pendant très peu de temps.
Every 1.0s: ss -t4 state syn-sent Tue Apr 1 10:07:33 2014 Recv-Q Send-Q Local Address:Port Peer Address:Port 0 1 192.168.1.2:55089 202.79.210.121:https 0 1 192.168.1.2:33733 203.84.220.80:https 0 1 192.168.1.2:36240 106.10.198.33:https
10. Filtrer les connexions par adresse et numéro de port
Outre les états de socket tcp, la commande ss prend également en charge le filtrage basé sur l'adresse et le numéro de port du socket. Les exemples suivants le démontrent.
Affiche toutes les connexions socket avec le port source ou destination de ssh.
$ ss -at '( dport = :ssh or sport = :ssh )' State Recv-Q Send-Q Local Address:Port Peer Address:Port LISTEN 0 128 *:ssh *:* LISTEN 0 128 :::ssh :::*
Sockets avec port de destination 443 ou 80
$ ss -nt '( dst :443 or dst :80 )' State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 0 192.168.1.2:58844 199.59.148.82:443 ESTAB 0 0 192.168.1.2:55320 165.193.246.23:443 ESTAB 0 0 192.168.1.2:56198 108.160.162.37:80 ESTAB 0 0 192.168.1.2:54889 192.241.177.148:443 ESTAB 0 0 192.168.1.2:39893 173.255.230.5:80 ESTAB 0 0 192.168.1.2:33440 38.127.167.38:443
La syntaxe suivante fonctionnerait également
$ ss -nt dst :443 or dst :80
Plus d'exemples
# Filter by address $ ss -nt dst 74.125.236.178 # CIDR notation is also supported $ ss -nt dst 74.125.236.178/16 # Address and Port combined $ ss -nt dst 74.125.236.178:80
Les ports peuvent également être filtrés avec les options dport/sport. Les numéros de port doivent être précédés d'un ":".
$ ss -nt dport = :80 State Recv-Q Send-Q Local Address:Port Peer Address:Port ESTAB 0 0 192.168.1.2:56198 108.160.162.37:80 ESTAB 0 0 192.168.1.2:39893 173.255.230.5:80 ESTAB 0 0 192.168.1.2:55043 74.125.236.178:80
Ce qui précède est identique à> ss -nt dst :80
Quelques exemples supplémentaires de filtrage
# source address is 127.0.0.1 and source port is greater than 5000 $ ss -nt src 127.0.0.1 sport gt :5000 # local smtp (port 25) sockets $ sudo ss -ntlp sport eq :smtp # port numbers greater than 25 $ sudo ss -nt sport gt :1024 # sockets with remote ports less than 100 $ sudo ss -nt dport \< :100 # connections to remote port 80 $ sudo ss -nt state connected dport = :80
Les opérateurs suivants sont pris en charge lors de la comparaison des numéros de port
<= or le : Less than or equal to port >= or ge : Greater than or equal to port == or eq : Equal to port != or ne : Not equal to port < or gt : Less than to port > or lt : Greater than to port
Résumé
Les exemples ci-dessus couvrent la plupart de ce que la commande ss prend en charge. Pour plus d'informations, consultez les pages de manuel.
La documentation de la syntaxe du filtre peut être trouvée dans le paquet iproute2-doc qui peut être installé sur les systèmes debian/ubuntu
$ sudo apt-get install iproute2-doc
Le fichier /usr/share/doc/iproute2-doc/ss.html contient des détails sur la syntaxe du filtre de commande ss.