Apprenez ce qu'est la commande netstat et quelques exemples en temps réel.
netstat
(network statistics) 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.
Il est disponible sur les systèmes d'exploitation Linux, Unix-like et Fenêtres. 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> afficher la table des interfaces pour <Iface>
-i, --interfaces afficher la table des interfaces
-g, --groups afficher les membres des groupes multicast
-s, --statistics afficher les statistiques réseau (comme SNMP)
-M, --masquerade afficher les connexions masquées
-v, --verbose être verbeux
-W, --wide ne tronque pas les adresses IP
-n, --numeric ne résout pas les noms
--numeric-hosts ne résout pas les noms d'hôtes
--numeric-ports ne résout pas les noms de ports
--numeric-users ne résout pas les noms d'utilisateurs
-N, --symbolique résoudre les noms de matériel
-e, --extend afficher d'autres informations
-p, --programs afficher le PID/nom du programme pour les sockets
-o, --timers afficher les timers
-c, --continuous liste continue
-l, --listening afficher les sockets du serveur à l'écoute
-a, --all afficher toutes les sockets (par défaut : connecté)
-F, --fib afficher Forwarding Information Base (par défaut)
-C, --cache afficher le cache de routage au lieu du FIB
-Z, --context afficher 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 (DARPA Internet) 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: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 prises en écoute.
[root@lab ~]# netstat -l
Connexions Internet actives (uniquement les serveurs)
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 actives du domaine UNIX (serveurs uniquement)
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 la
commande vous montrera les statistiques globales où vous pouvez prêter attention aux messages de paquets rejetés.
[root@lab ~]# netstat -s
Ip :
731422 total packets received
0 forwarded
0 incoming packets discarded
731399 incoming packets delivered
787732 requests sent out
16 dropped because of missing route
Icmp :
5277 messages ICMP reçus
120 messages ICMP d'entrée ont échoué.
InCsumErrors : 6
histogramme d'entrée ICMP :
destination unreachable : 193
timeout in transit : 16
echo requests : 5060
echo replies : 2
9355 messages ICMP envoyés
0 messages ICMP échoués
histogramme de sortie ICMP :
destination unreachable : 4295
echo replies : 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 connexions échouées
645 réinitialisations de connexions reçues
2 connexions établies
646705 segments reçus
648037 segments envoyés
99463 segments retransmis
27377 mauvais segments reçus.
150893 resets envoyés
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 resets reçus 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 supplémentaires à cause d'une socket verrouillée
Le mode Quick ack a été activé 3082 fois
17 SYNs vers les sockets LISTEN ont été abandonnés
28179 paquets directement mis en file d'attente vers recvmsg prequeue.
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édits
332 fois récupérés 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 de congestion récupérées sans démarrage lent après ack partiel
1029 timeouts après récupération SACK
8 timeouts en état de perte
329 retransmissions rapides
3 retransmissions en avant
32 retransmissions en démarrage lent
44785 autres timeouts TCP
TCPLossProbes : 9763
TCPLossProbeRecovery : 1732
54 retransmissions SACK échouées
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
default gateway 0.0.0.0 UG 0 0 eth0
10.16.0.0 0.0.0.0 255.255.0.0 U 0 0 0 eth0
68.183.32.0 0.0.0.0 255.255.240.0 U 0 0 0 eth0
link-local 0.0.0.0 255.255.0.0 U 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. Disons que vous essayez de démarrer un serveur Apache ou Nginx, qui écoute sur le port 80, mais que vous n'y arrivez 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'adresse hexadécimale, vous pouvez exécuter la commande suivante pour savoir quel processus utilise 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
Kernel Interface table
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 de plantage 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 œil à ce cours Udemy.