netstat es una herramienta que proporciona un conjunto de comandos que permitirá saber qué está pasando en nuestra red. A lo largo de este artículo se explicarán algunas opciones básicas que permitirán entender mejor nuestra red y conocer qué programa puede estar causando problemas.



Índice

Netstat es un paquete de herramienas de red

El comando netstat sirve para varias cosas, como mostrar estadísticas de la red, imprimir la tabla de rutas, mostrar conexiones activas y mucho más. Para cada una de las opciones de uso menciondas existe un comando específico que realiza la misma tarea. Pero netstat los abarca todos bajo un mismo comando, y además es multiplataforma. Lo cual quiere decir que podremos usarlo tanto en Windows, Linux o Mac.

Tras esta pequeña introducción, veamos algunas salidas de este comando:

Mostrar las conexiones de red

Es posible mostrar las conexiones que existen actualmente entre tu máquina y otras máquinas, así como sockets escuchando en un puerto para que otra máquina se conecte. También muestra qué programas están activos en la red:

$ sudo netstat -apA inet
Active Internet connections (servers and established)
Proto Recv-Q Send-Q Local Address           Foreign Address         State       PID/Program name
tcp        0      0 *:sunrpc                *:*                     LISTEN      1775/rpcbind
tcp        0      0 *:38768                 *:*                     LISTEN      1808/rpc.statd  
tcp        0      0 localhost:smtp          *:*                     LISTEN      2861/exim4
tcp        0      0 *:17500                 *:*                     LISTEN      2477/dropbox
tcp        0      0 hkr-pc.local:48985      wordpress.com:https     ESTABLISHED 3451/firefox.real
tcp        0      0 hkr-pc.local:60706      93.184.220.111:http     TIME_WAIT   -
tcp        0      0 hkr-pc.local:60684      93.184.220.111:http     TIME_WAIT   -
tcp        0      0 hkr-pc.local:44415      216.151.210.122:http    TIME_WAIT   -
tcp        0      0 hkr-pc.local:43597      72.21.91.121:http       TIME_WAIT   -
tcp        0      0 hkr-pc.local:35340      178-33-113-45.ovh.:http TIME_WAIT   -
tcp        0      0 hkr-pc.local:36162      76.74.254.120:https     ESTABLISHED 3451/firefox.real
tcp        0      0 hkr-pc.local:44472      76.74.254.123:http      TIME_WAIT   -
tcp        0      0 hkr-pc.local:35336      178-33-113-45.ovh.:http TIME_WAIT   -
tcp        0      0 hkr-pc.local:43599      72.21.91.121:http       TIME_WAIT   -
tcp        0      0 hkr-pc.local:37806      amung.us:http           ESTABLISHED 3451/firefox.real
tcp        0  13352 hkr-pc.local:34422      ec2-23-21-220-38.:https ESTABLISHED 2477/dropbox
tcp        0      0 hkr-pc.local:43260      fa-in-f154.1e100.n:http ESTABLISHED 3451/firefox.real
tcp        0      0 hkr-pc.local:52897      wg-in-f95.1e100.ne:http TIME_WAIT   -
tcp        0      0 hkr-pc.local:60689      93.184.220.111:http     TIME_WAIT   -
tcp        0      0 hkr-pc.local:60687      93.184.220.111:http     TIME_WAIT   -
tcp        0      0 hkr-pc.local:60685      93.184.220.111:http     TIME_WAIT   -
tcp        0      0 hkr-pc.local:43335      wordpress.com:https     ESTABLISHED 3451/firefox.real
tcp        0      0 hkr-pc.local:52902      wg-in-f95.1e100.ne:http TIME_WAIT   -
tcp        0      0 hkr-pc.local:44416      216.151.210.122:http    TIME_WAIT   -
tcp       38      0 hkr-pc.local:58802      v-client-1a.sjc.d:https CLOSE_WAIT  2477/dropbox
tcp        0      0 hkr-pc.local:57347      ec2-23-21-114-122.:http ESTABLISHED 3451/firefox.real
tcp        0      0 hkr-pc.local:43601      72.21.91.121:http       TIME_WAIT   -
tcp        0      0 hkr-pc.local:60704      93.184.220.111:http     TIME_WAIT   -
tcp        0      0 hkr-pc.local:41758      199.119.233.72.sta:http ESTABLISHED 3451/firefox.real
tcp        0      0 hkr-pc.local:60710      93.184.220.111:http     TIME_WAIT   -
tcp        0      0 hkr-pc.local:52920      wordpress.com:http      ESTABLISHED 3451/firefox.real
tcp        0      0 hkr-pc.local:36232      76.74.254.123:https     ESTABLISHED 3451/firefox.real
tcp        0      0 hkr-pc.local:60688      93.184.220.111:http     TIME_WAIT   -
tcp        0      0 hkr-pc.local:40181      sjc-not20.sjc.drop:http ESTABLISHED 2477/dropbox
tcp        0      0 hkr-pc.local:60686      93.184.220.111:http     TIME_WAIT   -
tcp        0      0 hkr-pc.local:43600      72.21.91.121:http       TIME_WAIT   -
udp        0      0 *:bootpc                *:*                                 2405/dhclient
udp        0      0 *:sunrpc                *:*                                 1775/rpcbind
udp        0      0 *:678                   *:*                                 1775/rpcbind
udp        0      0 localhost:712           *:*                                 1808/rpc.statd  
udp        0      0 *:17500                 *:*                                 2477/dropbox
udp        0      0 *:mdns                  *:*                                 2298/avahi-daemon:
udp        0      0 *:44290                 *:*                                 1808/rpc.statd  
udp        0      0 *:53066                 *:*                                 2405/dhclient
udp        0      0 *:1900                  *:*                                 2905/minissdpd  
udp        0      0 *:45008                 *:*                                 2298/avahi-daemon:

Las parámetros pasados a netstat son; -a para mostrar todos los sockets, -p muestra la columna PID/Program, -A inet muestra solo sockets TCP/UDP. En Windows la opción -A inet puede omitirse y -p debe reemplazarse por -o. En Mac, no hay equivalente a -p y -A inet debe reemplzarse por -f inet. Para conocer los nombres de los programas en Mac usa lsof -i

El singnificado de cada columna es el siguiente:

Procedamos a interpretar los resultados de netstat. En el ejemplo de arriba las direcciones de la columna Foreign adress aparecen cortadas. Para verlas completas es necesario ejecutar netstat con el parámetro -W:

$ sudo netstat -apWA inet | grep https
tcp        0      0 hkr-pc.local:50974      ec2-176-34-135-167.eu-west-1.compute.amazonaws.com:https ESTABLISHED 3619/firefox.real
tcp        0      0 hkr-pc.local:48162      ec2-50-18-192-251.us-west-1.compute.amazonaws.com:https ESTABLISHED 3619/firefox.real
tcp        0      0 hkr-pc.local:50145      ec2-46-51-197-88.eu-west-1.compute.amazonaws.com:https ESTABLISHED 3619/firefox.real
tcp        0      0 hkr-pc.local:50149      ec2-46-51-197-88.eu-west-1.compute.amazonaws.com:https ESTABLISHED 3619/firefox.real
tcp        0      0 hkr-pc.local:49490      fa-in-f113.1e100.net:https ESTABLISHED 3619/firefox.real
tcp        0      0 hkr-pc.local:48158      ec2-50-18-192-251.us-west-1.compute.amazonaws.com:https ESTABLISHED 3619/firefox.real
tcp        0      0 hkr-pc.local:59060      mad01s08-in-f31.1e100.net:https ESTABLISHED 3619/firefox.real
tcp        0      0 hkr-pc.local:50147      ec2-46-51-197-88.eu-west-1.compute.amazonaws.com:https ESTABLISHED 3619/firefox.real
tcp        0      0 hkr-pc.local:50976      ec2-176-34-135-167.eu-west-1.compute.amazonaws.com:https ESTABLISHED 3619/firefox.real
tcp        0      0 hkr-pc.local:50972      ec2-176-34-135-167.eu-west-1.compute.amazonaws.com:https ESTABLISHED 3619/firefox.real
tcp        0      0 hkr-pc.local:50973      ec2-176-34-135-167.eu-west-1.compute.amazonaws.com:https ESTABLISHED 3619/firefox.real
tcp        0      0 hkr-pc.local:50977      ec2-176-34-135-167.eu-west-1.compute.amazonaws.com:https ESTABLISHED 3619/firefox.real
tcp        0      0 hkr-pc.local:50144      ec2-46-51-197-88.eu-west-1.compute.amazonaws.com:https ESTABLISHED 3619/firefox.real
tcp        0      0 hkr-pc.local:50148      ec2-46-51-197-88.eu-west-1.compute.amazonaws.com:https TIME_WAIT   -
tcp        0      0 hkr-pc.local:50975      ec2-176-34-135-167.eu-west-1.compute.amazonaws.com:https ESTABLISHED 3619/firefox.real
tcp        0      0 hkr-pc.local:48163      ec2-50-18-192-251.us-west-1.compute.amazonaws.com:https ESTABLISHED 3619/firefox.real

Con el comando de arriba estoy mostrando únicamente las conexiones https establecidas con mi máquina. Ahora, sí que se ven las direcciones completas. Si te diriges a la dirección ec2-176-34-135-167.eu-west-1.compute.amazonaws.com podrás comprobar que dicha dirección pertenece al buscador duckduckgo. Y ha sido listada por netstat porque al momento de ejecutarlo tenía una pestaña del navegador abierta con el buscador del pato.

Veamos ahora la razón de que existan dos conexiones con datos pendientes en la cola de entrada y salida.

Ambas conexiones son de dropbox, una de ellas tiene el estado TCP en ESTABLISHED, así que de esa no hay que preocuparse, ya que está transmitiendo datos. La otra sin embargo tiene datos pendientes en la cola de entrada y estado TCP CLOSE WAIT, es decir, la máquina conectada a la nuestra ha cerrado la conexión, pero nuestro proceso local de dropbox no lo ha hecho. Lo cual quiere decir que aunque haya finalizado la tarea que se estaba llevando a cabo, no se han liberando los recursos que el socket había reservado. Estos escenários no deberían producirse, pero mientras no haya demasiados casos como este no debes preocuparte.

He comentado que en ocasiones es posible que tanto en la columna Local Address como en Foreign Address aparezca la dirección local de nuestra máquina. Este comportamiento lo usan algunos programas para conseguir que la aplicación sea multiplataforma, ya que la comunicación a través de la red no varía de plataforma a plataforma (Linux, Windows, mac ect.)

Otro de los posibles valores que puede aparecer en la columna Foreign Address es *:*, y si el tipo de conexión es TCP tendrá el estado LISTEN. Esto quiere decir que la máquina local está esperando a que otra máquina remota envíe datos. Ejemplos típicos pueden ser sshd (esperando a que alguien abra una conexión ssh), apache o nginx (Esperando a que alguien solicite una página web) etc.

Cuando se realiza una conexión externa, el programa local no suele preocuparse por el puerto local usado para la conexión. Esa es la razón por la que el puerto en el lado local no suele reconocerse y se traduce al nombre del protocolo como https, www etc.

Netstat también sirve para mostrar la tabla de rutas (Routing Table)

Imprimiendo la tabla de rutas (Routing Table)

La tabla de rutas significa dedidir dónde mandar un paquete en base a su destino. Un ejemplo de estas tablas es el siguiente:

$ netstat -r
Kernel IP routing table
Destination     Gateway         Genmask         Flags   MSS Window  irtt Iface
default         10.61.29.89     0.0.0.0         UG        0 0          0 eth1
10.61.29.89     *               255.255.255.255 UH        0 0          0 eth1
192.168.1.32    *               255.255.255.248 U         0 0          0 eth1

Una breve explicación del significado de las columnas:

Mostrar estadísticas e interfaces

También es posible, con netstat, mostrar las interfaces disponibles y listar algunas estadísticas de cómo se están comportando:

$ netstat -i
Kernel Interface table
Iface       MTU Met   RX-OK RX-ERR RX-DRP RX-OVR    TX-OK TX-ERR TX-DRP TX-OVR Flg
eth0       1500 0         0      0      0 0             0      0      0      0 BMU
eth1       1500 0    253744      0      0 0        153622      0      0      0 BMRU
lo        16436 0         4      0      0 0             4      0      0      0 LRU

El significado de cada columna es el siguiente:

El motivo por el que el valor del “MTU” es mayor en la interfaz de loopback se debe a motivos de rendimiento, ya que no tendrá que partir los paquetes en trozos más pequeños.

Como se aprecia en el ejemplo, todo parece estar correcto, ya que las columnas de errores están a 0. Una opción interesante de este comando es añadirle la opción -c, es decir “netstat -ci”, para ver la tabla cada segundo, y comprobar así si hay algún error.

Como nota final, y aunque este no es un artículo patrocinado, considero que debo proporcionar un enlace a la Linux Academy, perteneciente al autor cuyo artículo he traducido.

Referencias