Apprenez ce qu’est la commande netstat et quelques exemples en temps réel.

netstat (statistiques réseau) est un outil de ligne de commande qui affiche les connexions réseau (entrantes et sortantes), les tables de routage et un certain nombre de statistiques sur les interfaces réseau.

Il est disponible sur les systèmes d’exploitation Linux, Unix-like et Windows. netstat est puissant et peut être un outil pratique pour résoudre les problèmes liés au réseau et vérifier les statistiques de connexion.

Si vous tapez netstat -help, vous obtiendrez les instructions d’utilisation suivantes.

[root@lab ~]# netstat -help
utilisation : netstat [-vWeenNcCF] [<Af>] -r netstat {-V|--version|-h|--help}
       netstat [-vWnNcaeol] [<Socket> ...]
       netstat { [-vWeenNac] -I[<Iface>] | [-veenNac] -i | [-cnNe] -M | -s [-6tuw] } [delay]

        -r, --route afficher la table de routage
        -I, --interfaces=<Iface> affiche la table des interfaces pour <Iface>
        -i, --interfaces affichage de la table des interfaces
        -g, --groups affichage des membres des groupes de multidiffusion
        -s, --statistics affichage des statistiques de réseau (comme SNMP)
        -M, --masquerade affichage des connexions masquées

        -v, --verbose être verbeux
        -W, --wide Ne pas tronquer les adresses IP
        -n, --numeric ne résout pas les noms
        --numeric-hosts ne résout pas les noms d'hôtes
        --numérique-ports ne résout pas les noms de ports
        --numérique-utilisateurs ne résout pas les noms d'utilisateurs
        -N, --symbolique résout les noms de matériel
        -e, --extend affiche d'autres informations/plus d'informations
        -p, --programmes affiche le PID/nom du programme pour les sockets
        -o, --timers affichage des minuteries
        -c, --continu liste continue

        -l, --listening affichage des sockets du serveur d'écoute
        -a, --all affichage de toutes les sockets (par défaut : connectées)
        -F, --fib affiche Forwarding Information Base (par défaut)
        -C, --cache affiche le cache de routage au lieu de la FIB
        -Z, --context affiche le contexte de sécurité SELinux pour les sockets

  <Socket>={-t|--tcp} {-u|--udp} {-U|--udplite} {-S|--sctp} {-w|--raw}
           {-x|--unix} --ax25 --ipx --netrom
  <AF>=Utiliser '-6|-4' ou '-A <af>' ou '--<af>' ; par défaut : inet
  Liste des familles d'adresses possibles (qui supportent le routage) :
    inet (Internet DARPA) inet6 (IPv6) ax25 (AMPR AX.25) 
    netrom (AMPR NET/ROM) ipx (Novell IPX) ddp (Appletalk DDP) 
    x25 (CCITT X.25) 
[root@lab ~]#

Laissez-moi vous montrer quelques exemples de la commande. Les exemples suivants ont été testés sur RHEL/CentOS, mais je ne vois aucune raison pour qu’ils ne fonctionnent pas sur une autre distro comme Ubuntu.

Connexion établie

Si vous recherchez toutes les connexions établies depuis le serveur.

[root@lab ~]# netstat -natu | grep 'ESTABLISHED'
tcp 0 21 68.183.37.102:22 222.186.31.135:21714 ESTABLISHED
tcp 0 36 68.183.37.102:22 52.148.155.182:49859 ESTABLISHED
tcp 0 0 68.183.37.102:22 61.177.142.158:55481 ESTABLISHED
[root@lab ~]#

Si vous avez beaucoup de connexions établies et que vous souhaitez rechercher l’une des IP, vous pouvez utiliser un autre grep.

[root@lab ~]# netstat -natu | grep 'ESTABLISHED' | grep 61.177.142.158
tcp 0 1280 68.183.37.102:22 61.177.142.158:33932 ESTABLISHED
[root@lab ~]#

Connexion d’écoute

Disons que vous avez démarré un service, et qu’il est supposé écouter sur une IP:Port particulière, ceci serait pratique pour vérifier.

[root@lab ~]# netstat -an | grep 'LISTEN'
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN     
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN     
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN     
tcp6 0 0 :::111 :::* LISTEN     
tcp6 0 0 :::80 :::* LISTEN     
tcp6 0 0 :::22 :::* LISTEN     
[root@lab ~]#

Vous pouvez également utiliser l’argument -l pour afficher toutes les sockets en écoute.

[root@lab ~]# netstat -l
Connexions Internet actives (serveurs uniquement)
Proto Recv-Q Send-Q Adresse locale Adresse étrangère État     
tcp 0 0 localhost:smtp 0.0.0.0:* LISTEN     
tcp 0 0 0.0.0.0:sunrpc 0.0.0.0:* LISTEN     
tcp 0 0 0.0.0.0:ssh 0.0.0.0:* LISTEN     
tcp6 0 0 [: :]:sunrpc [: :]:* LISTEN     
tcp6 0 0 [: :]:webcache [: :]:* LISTEN     
tcp6 0 0 [: :]:ssh [: :]:* LISTEN     
udp 0 0 0.0.0.0:805 0.0.0.0:*         
udp 0 0 0.0.0.0:sunrpc 0.0.0.0:*         
udp 0 0 localhost:323 0.0.0.0:*         
udp6 0 0 [: :]:805 [: :]:*    
udp6 0 0 [: :]:sunrpc [: :]:*    
udp6 0 0 ip6-localhost:323 [: :]:*    
Sockets de domaine UNIX actives (uniquement les serveurs)
Proto RefCnt Flags Type State I-Node Path
unix 2 [ ACC ] STREAM LISTENING 15108 /run/dbus/system_bus_socket
unix 2 [ ACC ] STREAM LISTENING 8202 /run/systemd/journal/stdout
unix 2 [ ACC ] SEQPACKET LISTENING 12813 /run/udev/control
unix 2 [ ACC ] STREAM LISTENING 17542 public/pickup
unix 2 [ ACC ] STREAM LISTENING 15165 /var/run/rpcbind.sock
unix 2 [ ACC ] STREAM LISTENING 17546 public/cleanup
unix 2 [ ACC ] STREAM LISTENING 15605 /var/lib/gssproxy/default.sock
unix 2 [ ACC ] STREAM LISTENING 12706 /run/systemd/private
unix 2 [ ACC ] STREAM LISTENING 17549 public/qmgr
unix 2 [ ACC ] STREAM LISTENING 17571 public/flush
unix 2 [ ACC ] STREAM LISTENING 17553 private/tlsmgr
unix 2 [ ACC ] STREAM LISTENING 17586 public/showq
unix 2 [ ACC ] STREAM LISTENING 17556 private/rewrite
unix 2 [ ACC ] STREAM LISTENING 17559 private/bounce
unix 2 [ ACC ] STREAM LISTENING 17562 private/defer
unix 2 [ ACC ] STREAM LISTENING 17565 private/trace
unix 2 [ ACC ] STREAM LISTENING 17568 private/verify
unix 2 [ ACC ] STREAM LISTENING 17574 private/proxymap
unix 2 [ ACC ] STREAM LISTENING 17577 private/proxywrite
unix 2 [ ACC ] STREAM LISTENING 17580 private/smtp
unix 2 [ ACC ] STREAM LISTENING 17583 private/relay
unix 2 [ ACC ] STREAM LISTENING 17589 private/error
unix 2 [ ACC ] STREAM LISTENING 17592 private/retry
unix 2 [ ACC ] STREAM LISTENING 17595 private/discard
unix 2 [ ACC ] STREAM LISTENING 17598 private/local
unix 2 [ ACC ] STREAM LISTENING 17601 private/virtual
unix 2 [ ACC ] STREAM LISTENING 17604 private/lmtp
unix 2 [ ACC ] STREAM LISTENING 17607 private/anvil
unix 2 [ ACC ] STREAM LISTENING 17610 private/scache
unix 2 [ ACC ] STREAM LISTENING 15606 /run/gssproxy.sock
[root@lab ~]#

Utilisez grep pour filtrer les résultats.

Numéro de port utilisé par le PID

Vous savez que votre application a démarré et que vous connaissez le PID (Process Identifier), mais vous n’êtes pas sûr du numéro de port qu’elle utilise. L’exemple ci-dessous concerne le PID 3937

[root@lab ~]# netstat -anlp |grep 3937
tcp6 0 0 :::80 :::* LISTEN 3937/httpd          
unix 3 [ ] STREAM CONNECTED 2442387 3937/httpd          
[root@lab ~]#

Comme vous pouvez le voir, le port 80 est utilisé pour le PID 3937.

Statistiques de tous les protocoles

Si vous avez des déconnexions fréquentes dues à des paquets rejetés ? -l’argument de netstat vous montrera les statistiques globales où vous pouvez prêter attention aux messages de paquets rejetés.

[root@lab ~]# netstat -s
Ip :
    731422 total des paquets reçus
    0 transférés
    0 paquets entrants rejetés
    731399 paquets entrants délivrés
    787732 requêtes envoyées
    16 abandonnées à cause d'une route manquante
Icmp :
    5277 messages ICMP reçus
    120 messages ICMP d'entrée ont échoué.
    InCsumErrors : 6
    Histogramme d'entrée ICMP :
        destination inaccessible : 193
        délai d'attente en transit : 16
        demandes d'écho : 5060
        réponses echo : 2
    9355 messages ICMP envoyés
    0 messages ICMP échoués
    Histogramme de sortie ICMP :
        destination inaccessible : 4295
        réponses de l'écho : 5060
IcmpMsg :
        InType0 : 2
        InType3 : 193
        InType8 : 5060
        InType11 : 16
        OutType0 : 5060
        OutType3 : 4295
Tcp :
    42 ouvertures de connexions actives
    35226 ouvertures de connexions passives
    1693 tentatives de connexion échouées
    645 réinitialisations de connexion reçues
    2 connexions établies
    646705 segments reçus
    648037 segments envoyés
    99463 segments retransmis
    27377 mauvais segments reçus.
    150893 réinitialisations envoyées
    InCsumErrors : 27377
Udp :
    74547 paquets reçus
    4814 paquets vers un port inconnu reçus.
    56 erreurs de réception de paquets
    74584 paquets envoyés
    0 erreurs de tampon de réception
    0 erreurs de tampon d'envoi
    InCsumErrors : 56
UdpLite :
TcpExt :
    177 cookies SYN invalides reçus
    1693 réinitialisations reçues pour des sockets SYN_RECV embryonnaires
    316 sockets TCP ont terminé le temps d'attente dans le timer rapide
    3 paquets rejetés dans des connexions établies à cause de l'horodatage
    70248 acks retardés envoyés
    6 acks retardés ont été retardés davantage à cause d'une socket verrouillée
    Le mode Quick ack a été activé 3082 fois
    17 SYN vers des sockets LISTEN ont été abandonnés
    28179 paquets directement mis en file d'attente dans la préqueue recvmsg.
    9802 octets reçus directement dans le contexte du processus à partir de la préqueue
    72106 en-têtes de paquets prédits
    94182 accusés de réception ne contenant pas de données utiles reçus
    40094 accusés de réception prévus
    332 fois récupéré de la perte de paquets par des accusés de réception sélectifs
    8 fenêtres d'encombrement récupérées sans démarrage lent par DSACK
    1173 fenêtres d'encombrement récupérées sans démarrage lent après un acquittement partiel
    1029 dépassements de délai après récupération par SACK
    8 dépassements de délai dans l'état de perte
    329 retransmissions rapides
    3 retransmissions directes
    32 retransmissions en démarrage lent
    44785 autres dépassements de délais TCP
    TCPLossProbes : 9763
    TCPLossProbeRecovery : 1732
    54 retransmissions SACK ont échoué
    3144 DSACKs envoyés pour d'anciens paquets
    4 DSACKs envoyés pour des paquets hors service
    695 DSACKs reçus
    1 DSACKs pour des paquets hors service reçus
    44 connexions réinitialisées en raison de données inattendues
    76 connexions réinitialisées en raison d'une fermeture prématurée de l'utilisateur
    6079 connexions interrompues en raison d'un dépassement de délai
    TCPDSACKIgnoredNoUndo : 448
    TCPSpuriousRTOs : 5
    TCPSackShiftFallback : 465
    IPReversePathFilter : 11
    TCPRcvCoalesce : 32369
    TCPOFOQueue : 4313
    TCPOFOMerge : 4
    TCPChallengeACK : 2
    TCPSynRetrans : 43670
    TCPOrigDataSent : 208010
    TCPACKSkippedSeq : 12
IpExt :
    InNoRoutes : 12
    InOctets : 133789295
    OutOctets : 151093769
    InNoECTPkts : 731338
    InECT1Pkts : 3
    InECT0Pkts : 1568
    InCEPkts : 108
[root@lab ~]#

Informations de routage du noyau

Vous avez un problème de routage ou la connectivité ne fonctionne pas comme prévu parce que la connexion passe par une route différente ?

Vérifiez rapidement la table de routage.

[root@lab ~]# netstat -r
Table de routage IP du noyau
Destination Gateway Genmask Flags MSS Window irtt Iface
passerelle par défaut 0.0.0.0 UG 0 0 0 eth0
10.16.0.0 0.0.0 255.255.0.0 U 0 0 0 0 eth0
68.183.32.0 0.0.0.0 255.255.240.0 U 0 0 0 0 eth0
link-local 0.0.0.0 255.255.0.0 U 0 0 0 0 eth0
[root@lab ~]#

PID utilisé par le numéro de port

Très pratique pour résoudre les problèmes de conflits de ports. Supposons que vous essayez de démarrer un serveur Apache ou Nginx, qui écoute sur le port 80, mais que vous n’y parvenez pas parce qu’un autre processus utilise déjà le port 80.

[root@lab ~]# netstat -anlp |grep 80 | grep LISTEN
tcp6 0 0 :::80 :::* LISTEN 3937/httpd          
[root@lab ~]#

Vous pouvez voir que le PID 3937 utilise ce port.

Si vous utilisez AIX, alors

netstat -Aan | grep $portnumber

Cela affichera l’adresse du bloc de contrôle du protocole en hexadécimal

Une fois que vous avez l’hexadécimal, vous pouvez exécuter la commande suivante pour savoir quel processus détient un numéro de port.

rmsock $address_of_pcb tcpcb

Liste des interfaces réseau

Vous avez plusieurs interfaces Ethernet ? Vous n’êtes pas sûr et vous voulez le savoir ?

[root@lab ~]# netstat -i
Table des interfaces du noyau
Iface MTU RX-OK RX-ERR RX-DRP RX-OVR TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0 1500 793026 0 0 0 849443 0 0 0 BMRU
lo 65536 6 0 0 0 6 0 0 0 LRU
[root@lab ~]#

Écoute continue

Il s’agit d’une excellente option pour résoudre les problèmes liés aux plantages des services. Supposons qu’une application se bloque de manière aléatoire toutes les quelques minutes. Mais vous ne savez pas quand exactement. Vous pouvez utiliser l’argument -c qui affichera continuellement les résultats.

[root@lab ~]# netstat -anlpc |grep 8080
tcp6 0 0 :::8080 :::* LISTEN 11766/httpd         
tcp6 0 0 :::8080 :::* LISTEN 11766/httpd         
tcp6 0 0 :::8080 :::* LISTEN 11766/httpd         
tcp6 0 0 :::8080 :::* LISTEN 11766/httpd

Lorsqu’il ne se met plus à jour, vous savez qu’il s’est planté.

Conclusion

netstat est l’une des commandes les plus utilisées par les administrateurs système et j’espère que les exemples ci-dessus vous donneront une idée de ce que vous pouvez faire avec. Si vous souhaitez en savoir plus sur l’administration Linux, jetez un coup d’œil à ce cours Udemy.