10.9. Eines de diagnòstic de xarxa
When a network application does not run as expected, it is important to be able to look under the hood. Even when everything seems to run smoothly, running a network diagnosis can help ensure everything is working as it should. Several diagnosis tools exists for this purpose; each one operates on a different level. It would go beyond the scope of this book to discuss all tools, so we will focus on the more well-known and commonly used tools in the following sections.
10.9.1. Diagnòstic local: netstat
Esmentem primer el comandament netstat
(al paquet net-tools); mostra un resum instantani de l'activitat de xarxa d'una màquina. Quan s'invoca sense cap argument, aquesta ordre llista totes les connexions obertes; aquesta llista pot ser molt detallada, ja que inclou molts sòcols de domini Unix (àmpliament utilitzats per dimonis) que no impliquen la xarxa en absolut (per exemple, la comunicació dbus
, el trànsit X11
, i comunicacions entre sistemes de fitxers virtuals i l'escriptori).
Per tant, les invocacions comunes utilitzen opcions que alteren el comportament de netstat
. Les opcions més utilitzades inclouen:
-t
, que filtra els resultats incloent només connexions TCP;
-u
, que funciona de manera similar per a les connexions UDP; aquestes opcions no són mútuament excloents, i una d'elles és suficient per deixar de mostrar les connexions de domini Unix;
-a
, també llista els sòcols en estat d'escolta (esperant connexions entrants);
-n
, per mostrar els resultats numèricament: adreces IP (sense resolució DNS), números de port (sense els àlies definits a /etc/services
) i identificadors d'usuari (sense noms d'usuari);
-p
, per llistar els processos implicats; aquesta opció només és útil quan netstat
s'executa com a usuari arrel, ja que els usuaris normals només veuran els seus propis processos;
-c
, per actualitzar contínuament la llista de connexions.
Altres opcions, documentades a la pàgina del manual netstat(8), proporcionen un control encara més refinat sobre els resultats mostrats. A la pràctica, les primeres cinc opcions s'utilitzen tan sovint juntes que els administradors de xarxes i sistemes pràcticament van adquirir netstat -tupan
com a acte reflex. Els resultats típics, en una màquina no massa carregada, poden ser com els següents:
#
netstat -tupan
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 397/rpcbind
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 431/sshd
tcp 0 0 0.0.0.0:36568 0.0.0.0:* LISTEN 407/rpc.statd
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 762/exim4
tcp 0 272 192.168.1.242:22 192.168.1.129:44452 ESTABLISHED 1172/sshd: roland [
tcp6 0 0 :::111 :::* LISTEN 397/rpcbind
tcp6 0 0 :::22 :::* LISTEN 431/sshd
tcp6 0 0 ::1:25 :::* LISTEN 762/exim4
tcp6 0 0 :::35210 :::* LISTEN 407/rpc.statd
udp 0 0 0.0.0.0:39376 0.0.0.0:* 916/dhclient
udp 0 0 0.0.0.0:996 0.0.0.0:* 397/rpcbind
udp 0 0 127.0.0.1:1007 0.0.0.0:* 407/rpc.statd
udp 0 0 0.0.0.0:68 0.0.0.0:* 916/dhclient
udp 0 0 0.0.0.0:48720 0.0.0.0:* 451/avahi-daemon: r
udp 0 0 0.0.0.0:111 0.0.0.0:* 397/rpcbind
udp 0 0 192.168.1.242:123 0.0.0.0:* 539/ntpd
udp 0 0 127.0.0.1:123 0.0.0.0:* 539/ntpd
udp 0 0 0.0.0.0:123 0.0.0.0:* 539/ntpd
udp 0 0 0.0.0.0:5353 0.0.0.0:* 451/avahi-daemon: r
udp 0 0 0.0.0.0:39172 0.0.0.0:* 407/rpc.statd
udp6 0 0 :::996 :::* 397/rpcbind
udp6 0 0 :::34277 :::* 407/rpc.statd
udp6 0 0 :::54852 :::* 916/dhclient
udp6 0 0 :::111 :::* 397/rpcbind
udp6 0 0 :::38007 :::* 451/avahi-daemon: r
udp6 0 0 fe80::5054:ff:fe99::123 :::* 539/ntpd
udp6 0 0 2001:bc8:3a7e:210:a:123 :::* 539/ntpd
udp6 0 0 2001:bc8:3a7e:210:5:123 :::* 539/ntpd
udp6 0 0 ::1:123 :::* 539/ntpd
udp6 0 0 :::123 :::* 539/ntpd
udp6 0 0 :::5353 :::* 451/avahi-daemon: r
Com era d'esperar, es mostren les connexions establertes, dues connexions SSH en aquest cas, i les aplicacions que esperen connexions entrants (mostrades amb LISTEN
), en particular el servidor de correu electrònic Exim4 que escolta pel port 25.
10.9.2. Diagnòstic remot: nmap
nmap
(al paquet del mateix nom) és, d'alguna manera, l'equivalent remot per netstat
. Pot escanejar un conjunt de ports "ben coneguts" per a un o diversos servidors remots, i llista els ports on es troba una aplicació per respondre a les connexions entrants. A més, nmap
és capaç d'identificar algunes d'aquestes aplicacions, de vegades fins i tot el seu número de versió. La contrapartida d'aquesta eina és que, ja que funciona remotament, no pot proporcionar informació sobre processos o usuaris; no obstant això, pot operar en diversos objectius alhora.
Una invocació típica nmap
només utilitza l'opció -A
(de manera que nmap
intenta identificar les versions del programari del servidor que troba) seguida d'una o més adreces IP o noms DNS de màquines per escanejar. De nou, hi ha moltes més opcions per controlar el comportament d'nmap
; si us plau consulteu la documentació de la plana del manual nmap(1).
#
nmap debian
Starting Nmap 7.80 ( https://nmap.org ) at 2022-02-22 20:58 CET
Nmap scan report for debian (192.168.122.57)
Host is up (0.000087s latency).
Not shown: 996 closed ports
PORT STATE SERVICE
22/tcp open ssh
79/tcp open finger
80/tcp open http
113/tcp open ident
Nmap done: 1 IP address (1 host up) scanned in 0.07 seconds
#
nmap -A localhost
nmap -A localhost
Starting Nmap 7.80 ( https://nmap.org ) at 2022-02-22 20:56 CET
Stats: 0:01:16 elapsed; 0 hosts completed (1 up), 1 undergoing Service Scan
Service scan Timing: About 83.33% done; ETC: 20:57 (0:00:15 remaining)
Nmap scan report for localhost (127.0.0.1)
Host is up (0.000086s latency).
Other addresses for localhost (not scanned): ::1
Not shown: 994 closed ports
PORT STATE SERVICE VERSION
22/tcp open ssh OpenSSH 8.4p1 Debian 5 (protocol 2.0)
|_auth-owners: foobar
25/tcp open smtp Postfix smtpd
|_auth-owners: foobar
|_smtp-commands: debian, PIPELINING, SIZE 10240000, VRFY, ETRN, STARTTLS, ENHANCEDSTATUSCODES, 8BITMIME, DSN, SMTPUTF8, CHUNKING,
| ssl-cert: Subject: commonName=debian
| Subject Alternative Name: DNS:debian
| Not valid before: 2022-02-22T14:48:42
|_Not valid after: 2032-02-20T14:48:42
|_ssl-date: TLS randomness does not represent time
79/tcp open finger?
|_auth-owners: foobar
|_finger: ERROR: Script execution failed (use -d to debug)
80/tcp open http Apache httpd 2.4.52 ((Debian))
|_auth-owners: foobar
|_http-server-header: Apache/2.4.52 (Debian)
|_http-title: Apache2 Debian Default Page: It works
113/tcp open ident Liedentd (Claimed user: foobar)
|_auth-owners: foobar
631/tcp open ipp CUPS 2.3
|_auth-owners: foobar
| http-robots.txt: 1 disallowed entry
|_/
|_http-server-header: CUPS/2.3 IPP/2.1
|_http-title: Home - CUPS 2.3.3op2
Service Info: Host: debian; OS: Linux; CPE: cpe:/o:linux:linux_kernel
Service detection performed. Please report any incorrect results at https://nmap.org/submit/ .
Nmap done: 1 IP address (1 host up) scanned in 87.91 seconds
As expected, e.g. the SSH, Apache and Postfix applications are listed. Note that not all applications listen on all IP addresses; since Postfix is only accessible on the lo
loopback interface, it only appears during an analysis of localhost
and not when scanning debian
(which maps to the enp1s0
interface on the same machine).
10.9.3. «Sniffers»: tcpdump
i wireshark
A vegades cal mirar el que realment passa pel cable, paquet per paquet. Aquests casos requereixen un “analitzador de trames”, més conegut com a «sniffer». Aquesta eina observa tots els paquets que arriben a una interfície de xarxa donada i els mostra de manera fàcil d'interpretar.
L'eina venerable en aquest domini és tcpdump
, disponible com a eina estàndard en una àmplia gamma de plataformes. Permet molts tipus de captura de trànsit de xarxa, però la representació d'aquest trànsit roman bastant obscura. Per tant, no la descriurem amb més detall.
Una eina més recent (i més moderna), wireshark
(al paquet wireshark), s'ha convertit en la nova referència en l'anàlisi de trànsit de xarxa a causa dels seus molts mòduls de descodificació que permeten una anàlisi simplificada dels paquets capturats. Els paquets es mostren gràficament amb una organització basada en les capes de protocol. Això permet a l'usuari visualitzar tots els protocols implicats en un paquet. Per exemple, donat un paquet que conté una sol·licitud HTTP, wireshark
mostra, per separat, la informació relativa a la capa física, la capa Ethernet, la informació del paquet IP, els paràmetres de la connexió TCP, i finalment la sol·licitud HTTP.
En el nostre exemple, els paquets que viatgen sobre SSH es filtren (amb el filtre !tcp.port == 22
). El paquet que es mostra actualment es va generar a la capa de transport del protocol SSHv2.