Utilisation de la commande ss sous Linux pour afficher les détails sur les sockets
Le ss La commande est utilisée pour vider les statistiques de socket sur les systèmes Linux. Il sert de substitut à netstat commande et est souvent utilisé pour résoudre les problèmes de réseau.
Qu’est-ce qu’une prise ?
Pour tirer le meilleur parti de l’utilisation de ss commande, il est important de comprendre ce qu’est un socket. Un socket est un type de pseudo-fichier (c’est-à-dire qu’il ne s’agit pas d’un fichier réel) qui représente une connexion réseau. Un socket identifie à la fois l’hôte distant et le port auquel il se connecte afin d’envoyer des données entre les systèmes. Les sockets sont similaires aux tuyaux, sauf que les tuyaux ne facilitent que les connexions entre les processus sur le même système où les sockets fonctionnent sur le même système ou sur des systèmes différents. Contrairement aux tuyaux, les sockets fournissent également une communication bidirectionnelle.
Une fois qu’un socket est créé, les communications entre l’hôte local et un hôte distant prennent la forme de paquets réseau.
Utilisation de la commande ss
Sans argumentation, ss listera toutes les connexions réseau établies (ouvertes sans écoute), quel que soit leur état. Voici un exemple qui montre uniquement les premières lignes de la sortie de la commande plus une ligne avec les adresses IP :
$ ss | head -3; ss | grep 192 | tail -1 Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process u_str ESTAB 0 0 * 31510 * 31511 u_str ESTAB 0 0 * 30253 * 30254 tcp ESTAB 0 288 192.168.0.18:ssh 192.168.0.17:activesync
Les champs comme indiqué dans ss La sortie de la commande ci-dessus inclut :
- Dégager – Le type de socket – TCP, UDP, u_str (flux Unix) ou u_seq (séquence Unix)
- État – L’état de la prise – ESTAB (établi), UNCONN (non connecté) et LISTEN (écoute)
- Recv-Q – Le nombre de paquets reçus dans la file d’attente en attente de lecture
- Envoyer-Q – Le nombre de paquets dans la file d’attente en attente d’envoi
- Adresse locale : port – Adresse et port du système local
- Adresse homologue : port – Adresse et port du système distant
Le * les caractères dans la sortie ci-dessus indiquent que les sockets écoutent le trafic sur toutes les adresses. J’ai inclus la dernière ligne pour montrer une connexion entre deux systèmes spécifiques – ce système et un chut connexion à un hôte local.
Vous pouvez vous attendre à voir des centaines de lignes de sortie lorsque vous utilisez le ss ordre Pour compter les connexions socket établies sur votre système (ajout d’une ligne pour l’entête), vous pouvez utiliser une commande comme celle-ci :
$ ss | wc -l 622
La commande ci-dessous, qui utilise ok regarder uniquement le deuxième champ de chaque ligne de ss sortie, indique qu’une prise n’est pas connectée alors que 620 connexions sont établies. Cette commande trie le contenu du champ “State”. La deuxième ligne de la sortie ci-dessous montre l’en-tête de cette colonne.
$ ss | awk '{print $2}' | sort | uniq -c 620 ESTAB 1 State 1 UNCONN
En utilisant ss – un (afficher tous les sockets) la commande fera l’affaire ss la sortie affiche à la fois la prise d’écoute et la prise non écoutée. Pour TCP, “ne pas écouter” signifie des connexions établies tandis que “écouter” signifie attendre une connexion. Les commandes ci-dessous montrent la différence de volume de sortie.
$ ss | wc -l 617 $ ss -a | wc -l 820
Par exemple, le ss-a la sortie commencera probablement par une sortie comme celle-ci :
$ ss -a | head -7
Netid State Recv-Q Send-Q Local Address:Port Peer Address:Port Process nl UNCONN 0 0 rtnl:packagekitd/1032 * nl UNCONN 0 0 rtnl:evolution-calen/1685 * nl UNCONN 0 0 rtnl:kernel * nl UNCONN 0 0 rtnl:NetworkManager/772 * nl UNCONN 0 0 rtnl:abrt-applet/1863 * nl UNCONN 0 0 rtnl:goa-daemon/1653 *
Le Dégager les valeurs incluent:
- icmp6 — Protocole de message de contrôle Internet
- NL — lien net
- TCP — protocole de contrôle de transmission (orienté connexion)
- u_dgr — Datagrammes Unix
- UDP — protocole de datagramme utilisateur (sans connexion)
- u_seq — Séquences Unix
- u_str — Unix_stream
Résumés des sockets
Pour obtenir un rapport récapitulatif sur les sockets, utilisez le -s option comme indiqué dans la commande ci-dessous.
$ ss -s Total: 777 TCP: 9 (estab 1, closed 1, orphaned 0, timewait 1) Transport Total IP IPv6 RAW 1 0 1 UDP 10 6 4 TCP 8 5 3 INET 19 11 8 FRAG 0 0 0
Utilisation d’un script pour afficher la sortie ss
Le script ci-dessous extrait et résume le contenu de n’importe quel champ du ss sortie de commande.
Si vous ajoutez -une en tant qu’argument (ou, en fait, n’importe quel argument unique), le script résumera la sortie de ss-a commande au lieu de la ss commande sans options. Sélectionnez n’importe quel champ par numéro pour sélectionner cette colonne.
#!/bin/bash if [ $# != 0 ] then ss="ss -a" else ss="ss" fi echo "What column do you want to see?" echo 1: Netid echo 2: State echo 3: Recv-Q echo 4: Send-Q echo 5: Local Address:Port echo 6: Peer Address:Port echo 7: Process echo -n "> " read number case $number in 1) echo Netid; $ss | tail -n+2 | awk '{print $1}' | sort | uniq -c;; 2) echo State; $ss | tail -n+2 | awk '{print $2}' | sort | uniq -c;; 3) echo Recv-Q; $ss | tail -n+2 | awk '{print $3}' | sort | uniq -c;; 4) echo Send-Q; $ss | tail -n+2 | awk '{print $4}' | sort | uniq -c;; 5) echo Local Address:Port; $ss | tail -n+2 | awk '{print $5}' | sort | uniq -c;; 6) echo Peer Address:port; $ss | tail -n+2 | awk '{print $6}' | sort | column;; 7) echo Process; $ss | tail -n+2 | awk '{print $7}' | sort | uniq -c;; *) echo "huh?";; esac
Par exemple, pour vérifier combien de fois chaque Dégager valeur apparaîtra, vous pouvez exécuter le script comme ceci :
$ ss_summary What column do you want to see? 1: Netid 2: State 3: Recv-Q 4: Send-Q 5: Local Address:Port 6: Peer Address:Port 7: Process > 1 Netid 1 icmp6 1 tcp 46 u_dgr 1 udp 567 u_str
Demander de l’aide
Utilisez le ss-h commande pour obtenir une liste des nombreuses options de la commande avec une brève description.
$ ss -h Usage: ss [ OPTIONS ] ss [ OPTIONS ] [ FILTER ] -h, --help this message -V, --version output version information -n, --numeric don't resolve service names -r, --resolve resolve host names -a, --all display all sockets -l, --listening display listening sockets -o, --options show timer information -e, --extended show detailed socket information -m, --memory show socket memory usage -p, --processes show process using socket -i, --info show internal TCP information --tipcinfo show internal tipc socket information -s, --summary show socket usage summary --tos show tos and priority information --cgroup show cgroup information -b, --bpf show bpf filter socket information -E, --events continually display sockets as they are destroyed -Z, --context display process SELinux security contexts -z, --contexts display process and socket SELinux security contexts -N, --net switch to the specified network namespace name -4, --ipv4 display only IP version 4 sockets -6, --ipv6 display only IP version 6 sockets -0, --packet display PACKET sockets -t, --tcp display only TCP sockets -M, --mptcp display only MPTCP sockets -S, --sctp display only SCTP sockets -u, --udp display only UDP sockets -d, --dccp display only DCCP sockets -w, --raw display only RAW sockets -x, --unix display only Unix domain sockets --tipc display only TIPC sockets --vsock display only vsock sockets -f, --family=FAMILY display sockets of type FAMILY FAMILY := {inet|inet6|link|unix|netlink|vsock|tipc|xdp|help} -K, --kill forcibly close sockets, display what was closed -H, --no-header Suppress header line -O, --oneline socket's data printed on a single line --inet-sockopt show various inet socket options -A, --query=QUERY, --socket=QUERY QUERY := {all|inet|tcp|mptcp|udp|raw|unix|unix_dgram|unix_stream|unix_seqpacket|packet|netlink|vsock_stream|vsock_dgram|tipc}[,QUERY] -D, --diag=FILE Dump raw information about TCP sockets to FILE -F, --filter=FILE read filter information from FILE FILTER := [ state STATE-FILTER ] [ EXPRESSION ] STATE-FILTER := {all|connected|synchronized|bucket|big|TCP-STATES} TCP-STATES := {established|syn-sent|syn-recv|fin-wait-{1,2}|time-wait|closed|close-wait|last-ack|listening|closing} connected := {established|syn-sent|syn-recv|fin-wait-{1,2}|time-wait|close-wait|last-ack|closing} synchronized := {established|syn-recv|fin-wait-{1,2}|time-wait|close-wait|last-ack|closing} bucket := {syn-recv|time-wait} big := {established|syn-sent|fin-wait-{1,2}|closed|close-wait|last-ack|listening|closing}
Remarque qui comprend -S choix, ss n’affichera que les sockets SCTP. Avec le -une choix, ss affichera les sockets d’écoute et de non-écoute de chaque type. Avec le -l paramètres, ss affichera les sockets d’écoute (désactivés par défaut). Avec le -e choix, ss affichera des informations détaillées sur la prise. Ce ne sont là que quelques-unes des options disponibles. Consultez la liste ci-dessus ou utilisez le ss-h pour afficher les options disponibles sur votre hôte Linux.
conclure
Le ss La commande peut fournir des détails importants sur les sockets – probablement plus que certains d’entre nous ne pensaient disponibles. S’habituer à la commande et à son large éventail d’options peut prendre du temps, mais ce niveau de détail peut être utile pour comprendre comment vos systèmes Linux interagissent entre eux et avec ce système externe.
Copyright © 2022 IDG Communications, Inc.