Présentation :
L'article suivant a été entièrement copié 1 à 1 (plein plagiat !!) du site suivant afin de pouvoir s'y référer ici au cas où l'article disparaîtrait de l'accès à Internet ou se déplacerait.
http:// www.linux-magazine.com/Issues/2015/181/Querying-Sockets-with-ss
Revue Linux. Article du numéro 181/2015
Auteur(s) :Chris Binnie
Le ss sans prétention L'utilitaire est facile à comprendre et facile à saisir, mais il ajoute de puissantes options à votre boîte à outils d'administration.
Les noms de quelques utilitaires Linux sont si petits que vous vous retrouvez à les lancer de manière inattendue en entrant une faute de frappe sur la ligne de commande. Pourquoi s'embêter à taper de longs mots alors qu'une abréviation parfaitement adaptée suffit ? Une commande minuscule (à la fois par son nom et par son encombrement de poche sur votre disque dur) est un petit utilitaire appelé ss .
Ss frappe plusieurs niveaux au-dessus de sa catégorie de poids mouche. Si vous connaissez l'un des outils populaires utilisés par les administrateurs système pour vérifier les liens réseau, je suis sûr que vous serez heureux d'apprendre que sa fonctionnalité ne sera pas trop difficile à comprendre.
Pour les curieux d'entre nous, le "ss ” l'abréviation est apparemment pour les mots “statistiques de socket.” Ss est fourni avec le package iproute2. Si, pour une raison très inhabituelle, vous ne trouvez pas ss sur votre système de type Debian, vous pouvez toujours l'installer en exécutant :
sudo apt-get install iproute2
Un socket, c'est un port et une adresse IP. Vous pouvez considérer un socket comme identifiant un service écoutant sur un numéro de port spécifique d'un ordinateur spécifique. Une paire de sockets, dans ce cas, se compose d'une adresse IP client, d'un numéro de port client, d'une adresse IP serveur et d'un numéro de port serveur. La requête d'informations par socket vous permet donc de vous concentrer rapidement sur un service spécifique exécuté à une adresse IP spécifique.
Je m'en voudrais de ne pas mentionner Unix Domain Sockets. Les sockets de domaine Unix, qui facilitent la communication entre les processus s'exécutant sur une machine locale, remplissent un certain nombre d'objectifs utiles, tels que l'activation des autorisations nécessaires pour accéder aux ressources entre des processus qui ne seraient autrement pas privilégiés.
Démarrer avec ss
Dans la plupart des scénarios, ss s'exécutera à partir d'un compte d'utilisateur ordinaire. Sur mon système, ss réside dans /usr/sbin/ss annuaire. Je vais commencer par quelques utilisations de base pour ss. La commande suivante affiche la sortie pour les réseaux IPv4 :# ss -4
La sortie abrégée (Liste 1) montre la communication client et serveur. Gardez à l'esprit qu'un client peut également être un serveur, et vice versa, selon le sens du flux d'informations.
Liste 1
Sortie ss de baseState Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 192.168.0.2:37564 192.168.0.100:www
ESTAB 0 0 192.168.0.2:47592 192.168.0.156:smtp
ESTAB 0 0 192.168.0.2:ssh 192.168.0.49:64009
Remplacez l'option -4 par -6 pour générer des informations sur les connexions IPv6.
Comme vous pouvez le voir dans la liste 1, 192.168.0.2 est l'adresse IP de la machine locale, et l'utile utilitaire /etc/services a converti certains numéros de port en noms (tels que ssh, www et smtp).
L'excellent ss offre également des informations sur TCP, UDP, les sockets de domaine Unix locaux et les sockets distants. Comme je le décrirai plus tard, ce qui rend ss exceptionnellement puissant, c'est sa capacité à gérer l'état des connexions.
J'utilise souvent ss pour interroger les ports ouverts par les démons installés sur l'ordinateur. Utilisez l'option l pour vérifier les ports d'écoute (Liste 2) :
Liste 2
Affichage des ports d'écouteState 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 *:sunrpc *:*
LISTEN 0 128 127.0.0.1:http *:*
# ss -l
Vous souhaiterez peut-être vérifier les ports d'écoute au cours de votre routine quotidienne d'administration système pour vous assurer que des services inattendus et potentiellement non sécurisés n'ont pas été laissés activés. Ou, vous voudrez peut-être rechercher des rootkits moins sophistiqués qui pourraient ne pas masquer efficacement leurs ports ouverts.
L'une ou l'autre des commandes lsof -i
netstat -tulpn
vous aidera à déterminer quels processus (PID) ouvrent vos ports, afin que vous puissiez les supprimer si nécessaire.
Exécuter simplement la commande ss sans aucune option fournit une liste des « connexions » actuelles ( notez qu'il s'agit en fait de "sockets"), comme indiqué dans le Listing 3.
Liste 3
sans fioritures
# ss
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 192.168.0.2:37564 192.168.0.49:tcpmux
ESTAB 0 64 192.168.0.2:ssh 192.168.0.143:64009
ESTAB 0 0 192.168.0.2:47609 192.168.0.88:gopher
PID
Si vous ne pouvez pas accéder à lsof et que vous n'aimez pas netstat (je ne suis pas un grand fan), l'utilitaire super-duper ss peut également signaler les PID pertinents pour vos ports ouverts. Pour voir quels processus utilisent directement les sockets, lancez simplement un -p dans le mix :# ss -p
Une mise en garde est que je dois me connecter en tant que root pour obtenir les informations détaillées. Le Listing 4 montre un exemple de ce à quoi s'attendre.
Liste 4 ss -p
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 10.10.10.20:ssh 10.10.10.10:52918 users:(("sshd",31195,3),("sshd",31204,3))
En partant du nom de l'application, qui est sshd dans ce cas, vous pouvez voir les PID 31195 et 31204 ; 31204 appartient à un utilisateur non privilégié (mon utilisateur de connexion), et 31195 semble résulter de la séparation intelligente des privilèges utilisée par sshd.
SSH est conçu pour minimiser les risques de bogues de programmation causant des problèmes systémiques très graves en limitant l'accès et en restreignant le service à une prison chrootée pour le processus SSH faisant face au réseau. Pour atteindre cet objectif, SSH utilise deux processus. Le processus appartenant à la racine surveille la progression du processus non privilégié, qui a un UID et un GID précédemment inutilisés.
Looking Deeper
Vous pouvez utiliser ss -s pour récupérer des chapes de statistiques relatives au nombre de sockets ouverts et aux protocoles qu'ils utilisent (Liste 5).
Liste 5
ss -s
Total: 201 (kernel 218)
TCP: 6 (estab 2, closed 0,
orphaned 0, synrecv 0,
timewait 0/0), ports 5
Transport Total IP IPv6
* 218 - -
RAW 0 0 0
UDP 5 5 0
TCP 6 6 0
INET 11 1 0
FRAG 0 0 0
Ce n'est pas la meilleure des comparaisons, mais vous pourriez obtenir un résultat vaguement similaire en utilisant la commande netstat suivante :# netstat -tan | grep -v "Proto" | grep -v "Active" | awk '{print $6}' | uniq -c
Il convient de mentionner que l'utilitaire super ss a l'habitude de surpasser les autres outils réseau dans les tests de référence. Comparé au netstat largement utilisé, par exemple, ss fournit ses résultats très rapidement. Gardez à l'esprit, cependant, que ss n'est pas conçu pour répondre à toutes les questions possibles, mais reflète plutôt la philosophie Unix selon laquelle chaque composant du système doit « bien faire une chose ». Les utilisateurs expérimentés combinent souvent ss avec des outils tels que netstat, puis élaguent la sortie à l'aide d'outils tels que grep, awk et sed.
Par exemple, si vous souhaitez voir quelle application bloque un port spécifique, vous pouvez utiliser ss avec grep, comme suit :# ss | grep 58620
Devenir précis
Vous ne pouvez regarder que les sockets TCP avec :# ss -t
Vous pouvez également écrire l'option –tcp. Augmentez le niveau de détail avec le commutateur -a (pour "tous") :# ss -t -a
Modifier très légèrement cette commande génère une sortie pour inclure les sockets UDP, Raw et Unix. Pour une vue détaillée de tous les sockets UDP, entrez# ss -u -a
et pour afficher tous les sockets Raw, entrez :# ss -w -a
Si vous devez vraiment vous faire plaisir avec plusieurs écrans de texte époustouflant, vous pouvez choisir d'afficher tous les sockets de domaine Unix avec :# ss -x -a
La boîte à outils apparemment sans fond fournie par l'utilitaire ss inclut également la possibilité de surveiller les sockets DCCP ; DCCP est un protocole réseau moins courant qui présente les caractéristiques de TCP orientées connexion et de vérification des erreurs avec les fonctionnalités de type diffusion d'UDP. Le protocole DCCP est souvent utilisé pour le streaming multimédia. Vérifiez le trafic DCCP avec cette petite commande astucieuse :# ss -d -a
Vous pouvez également surveiller l'état des connexions à votre ordinateur en étendant le niveau de détail à l'aide de l'option -e (Liste 6).
Liste 6 # ss -e
State Recv-Q Send-Q Local Address:Port Peer Address:Port
ESTAB 0 0 192.168.0.2:ssh 192.168.0.88:58302 timer:(keepalive,40min,0) ino:2184870 sk:ffff880138d26700
ESTAB 0 0 192.168.0.2:48246 192.1680.56:ntp timer:(keepalive,105min,0) ino:2187726 sk:ffff880138d2748
Le Listing 6 montre les options de minuterie qui offrent un aperçu de l'état actuel de tout keepalives sur une connexion. Cette fonctionnalité peut être utile pour des services tels que HTTP ou SSH, qui ont tendance à utiliser des keepalives (voir l'encadré intitulé "Keepalive Notes"). Le Listing 7 montre une sortie similaire en utilisant la commande netstat -to.
Notes Keepalive
Un paquet keepalive a généralement un TCP ACK configuré avec un numéro de séquence défini sur un de moins que le numéro actuel utilisé sur la connexion. Toute machine recevant un coup de pouce d'un tel paquet répondra simplement avec le numéro de séquence correct et, plaisanterie de Frankenstein mise à part, annoncera qu'elle est bien vivante.
Ces types de paquets sont parfois vides et ont généralement trois paramètres associés. Le paramètre retry déclarera combien de fois envoyer un paquet avant de conclure que l'autre extrémité de la connexion a rendu l'âme. Le paramètre de temps est configuré comme la fréquence des vérifications, et enfin l'intervalle dicte la durée entre deux paquets envoyés si aucune réponse n'est reçue.
À l'intérieur du noyau, vous pouvez modifier ces paramètres en modifiant ces valeurs dans le pseudo-système de fichiers époustouflant connu et apprécié sous le nom de /proc . Un fichier, dans ce cas, est /proc/sys/net/ipv4/tcp_keepalive_time , et vous pouvez le modifier comme suit :# echo 75 > /proc/sys/net/ipv4/tcp_keepalive_intvl
# echo 9 > /proc/sys/net/ipv4/tcp_keepalive_probes
Liste 7 # netstat -to
Proto Recv-Q Send-Q Local Address Foreign Address State Timer
tcp 0 0 host-one:48340 host-four:45358 ESTABLISHED keepalive (6830.00/0/0)
tcp 0 64 host-two:ssh host-three:58302 ESTABLISHED on (0.45/0/0)
Netstat vous permet également d'ajouter la commande polyvalente watch et de voir les mises à jour en temps réel :# watch netstat -to
C'est un appel proche, mais je dois admettre que, dans ce cas, netstat garde sa sortie belle et succincte et semble aussi bonne que la sortie de l'utilitaire ss.
Source et destination
Le La commande suivante vous permet de trouver des informations sur toutes les sockets avec une destination (dst) destinée à une adresse IP spécifique :# ss dst 192.168.0.1
À l'inverse, il ne faudra pas faire un saut énorme pour considérer que l'utilisation de l'option src révèle des informations du côté source du socket :# ss src 192.168.0.2
Pratique, hein ? Cette syntaxe est facile à mémoriser si vous êtes pressé, ce qui vous permet de sauver la situation lorsqu'un patron irritable vous souffle dans le cou pendant une panne.
Vous pouvez même utiliser les notations réseau CIDR dans l'appel d'adresse :
# ss dst 192.168.0.1/24
Ajoutez deux-points à la fin, et vous pouvez rechercher un port très spécifique et une plage d'adresses IP très large en même temps :# 192.168.0.1/24:53
J'apprécie vraiment cette fonctionnalité dans des situations avec beaucoup de trafic et de nombreux ports ouverts. Par exemple, cette option vous permet de surveiller toutes les activités liées au DNS sur un sous-réseau entier /24 avec une simple commande ss.
Expressions régulières
En plus des noms DNS et des adresses IP, vous pouvez également utiliser des expressions régulières opérateurs (regex) dans votre syntaxe ss. Jetez un oeil à cette petite pépite :# ss dport != :53
Cette commande exclut le dport de destination sur le port DNS 53.
Si vous avez besoin de garder un peu de bon sens et d'éviter de simplement regarder les chiffres, vous pouvez également traduire les ports au format /etc/services :# ss 192.168.0.1:http
Si vous êtes prêt à être impressionné, vous pouvez également inclure supérieur à, inférieur à, inférieur ou égal à, etc. :# ss dport > :53
D'autres caractères spéciaux sont également possibles, bien que parfois les caractères spéciaux doivent être échappés. Les équivalents alphabétiques, tels que eq (égal), ne (différent de), gt (supérieur à) et le (inférieur à) fonctionnent également. Votre kilométrage peut varier selon les différentes versions de l'utilitaire ss.
État de la connexion
Vous pouvez utiliser la commande –query ou -A ajout de requête pour vider une table de sockets. Le mot magique autobound vérifie les ports éphémères auxquels les sockets se sont attachés. Préparez-vous pour des chapes de sortie, même sur un système silencieux. Une version abrégée de la sortie est présentée dans le Listing 8.
Liste 8
# ss -a -A all autobound
01 u_str ESTAB 0 0 * 11984 * 0
02 u_str ESTAB 0 0 * 11996 * 0
03 u_str ESTAB 0 0 * 12003 * 0
04 u_str ESTAB 0 0 * 12005 * 0
05 u_str ESTAB 0 0 * 12010 * 0
Vous pouvez également filtrer par états TCP ; par exemple, la commande suivante filtre le trafic sFTP :# ss state connected dport = :sftp
Tout ce qui est traité comme "actuel" en relation avec le port sFTP s'affiche rapidement.
Vous pouvez compliquer un peu plus la commande avec un opérateur booléen :# ss ( sport = :ftp or dport = :http )
Vous pouvez même utiliser ss pour trouver des connexions qui sont dans un état TCP spécifique, y compris les connexions établies, syn-sent, syn-recv, fin-wait-1, fin-wait-2, time-wait, closed, attente rapprochée, dernier accusé de réception, écoute et fermeture.
Les paramètres d'état TCP vous permettent d'effectuer des requêtes très puissantes. Par exemple, la vérification des états FIN–WAIT–1 vous permet d'identifier si votre application a fermé son côté d'une connexion, mais qu'un hôte distant n'a pas fermé son côté, bloquant ainsi les précieux ports de votre machine :
ss -o state fin-wait-1 '( sport = \
:ftp or sport = :http )' \
dst 10.10.3.3/24:22
Ça se termine
Le ss est un outil puissant qui vous aidera à interroger votre réseau de manière très détaillée. Ss est extrêmement performant pour les requêtes manuelles et automatisées, et il nécessite très peu de frappes pour exécuter des commandes courantes.
Cet outil minuscule mais héroïque aide à muscler les muscles de tout administrateur système. Si vous souhaitez augmenter la puissance de votre boîte à outils d'administration, essayez de pratiquer certaines des commandes les plus complexes dans votre travail quotidien.