En ocasiones cuando el protocolo TCP/IP no funciona correctamente, tenemos una serie de herramientas que permiten comprobar el buen funcionamiento de la red o de un mecanismo específico como resolución de nombres, acceso a un ordenador o servidor, etc.

En el siguiente artículo hablaremos un poco de las herramientas que tenemos disponibles en GNU/Linux para realizar diferentes comprobaciones.

ARP

El protocolo ARP mantiene localmente en el ordenador una tabla de correspondencias entre las direcciones IP y las direcciones MAC. El comando arp permite editar esta tabla que se encuentra en memoria RAM.

Podemos usar el comando arp para añadir una entrada estática (un mapeo de una IP a una MAC) para llegar a un dispositivo de red que no dispone de dirección IP (por ejemplo una impresora) cuya dirección MAC conocemos.

Por ejemplo, para mostrar la tabla de direcciones que conocemos podemos ejecutar el siguiente comando:

arp -a

Y esta es la salida:

_gateway (192.168.1.1) en XX:XX:XX:XX:XX:XX [ether] en eth0
? (192.168.1.223) en XX:XX:XX:XX:XX:XX [ether] en eth0
? (192.168.1.221) en XX:XX:XX:XX:XX:XX [ether] en eth0
? (192.168.1.222) en XX:XX:XX:XX:XX:XX [ether] en eth0

Por ejemplo, en esta salida desde mi ordenador, nos dice que conoce 3 IP en la red que en este caso son 3 Raspberry Pi que tengo en casa.

PING

El comando ping utiliza el protocolo ICMP. Permite comprobar si hay una buena conectividad de red, haciendo el envío de peticiones echo request que esperan que respondan con un echo reply.

Es importante para este comando conocer la puerta de enlace con el router, siempre y cuando se haga el ping fuera de nuestra red.

Debemos de tener en cuenta que si estamos detrás de un router, éste puede tener activado un cortafuego que bloquee las peticiones de ICMP.

Por ejemplo, para saber si nuestra puerta de enlace responde correctamente:

ping 192.168.1.1

La respuesta será la siguiente:

PING 192.168.1.1 (192.168.1.1) 56(84) bytes of data.
64 bytes from 192.168.1.1: icmp_seq=1 ttl=64 time=1.04 ms
64 bytes from 192.168.1.1: icmp_seq=2 ttl=64 time=0.882 ms
64 bytes from 192.168.1.1: icmp_seq=3 ttl=64 time=0.909 ms
64 bytes from 192.168.1.1: icmp_seq=4 ttl=64 time=0.880 ms

--- 192.168.1.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3037ms
rtt min/avg/max/mdev = 0.914/0.929/0.942/0.01

También podéis hacer ping utilizando un nombre de dominio e incluso el número de paquetes para enviar con -c:

ping -c5 fsf.org

Con la siguiente salida:

PING fsf.org (209.51.188.174) 56(84) bytes of data.
64 bytes from www.fsf.org (209.51.188.174): icmp_seq=1 ttl=55 time=111 ms
64 bytes from www.fsf.org (209.51.188.174): icmp_seq=2 ttl=55 time=112 ms
64 bytes from www.fsf.org (209.51.188.174): icmp_seq=3 ttl=55 time=112 ms
64 bytes from www.fsf.org (209.51.188.174): icmp_seq=4 ttl=55 time=111 ms
64 bytes from www.fsf.org (209.51.188.174): icmp_seq=5 ttl=55 time=111 ms

--- fsf.org ping statistics ---
5 packets transmitted, 5 received, 0% packet loss, time 4000ms
rtt min/avg/max/mdev = 110.774/111.346/112.335/0.619 ms

TRACEROUTE

Este comando permite seguir la ruta completa del paquete IP hasta el destinatario y así poder identificar hasta donde llega el paquete y por donde pasa.

traceroute intenta alcanzar la dirección IP o nombre, limitándose a identificar los routers por donde pasa hasta alcanzar el destinatario.

Por ejemplo, el uso de tracerouter:

traceroute fsf.org

Y esta es la respuesta:

traceroute to fsf.org (209.51.188.174), 64 hops max
  1   192.168.1.1 (_gateway)  0,865ms  0,863ms  0,701ms 
  2   213.195.112.1 (213.195.112.1)  3,966ms  3,918ms  9,010ms 
  3   10.15.3.57 (10.15.3.57)  3,581ms  3,009ms  3,318ms 
  4   *  *  * 
  5   213.155.129.74 (bcn-b2-link.ip.twelve99.net)  3,220ms  2,834ms  2,715ms 
  6   *  *  * 
  7   62.115.133.238 (ldn-bb4-link.ip.twelve99.net)  37,694ms  37,290ms  37,610ms 
  8   198.160.62.0 (bbr02-et-0-0-7.bos01.twdx.net)  107,989ms  108,288ms  107,883ms 
  9   *  *  * 
 10   *  *  * 
 11   209.51.188.174 (www.fsf.org)  108,045ms  108,052ms  107,661ms

Si vemos (1) es la IP de nuestra puerta de enlace, que se trata del primer salto. Luego hace diferentes saltos hasta llegar a la web de la FSF (11).

En los saltos 4, 6, 9 y 10 que no indica ninguna IP o host, significa que la petición ha respondido un "Request timed out", por lo que significa que el equipo no responde a solicitudes ICMP.

IFCONFIG o IP

En antiguas versiones de GNU/Linux, sobretodo en las basadas en Debian, se utilizaba el comando ifconfig para mostrar el resultado de las tarjetas de red en nuestro equipo. Pero desde hace poco se utiliza el comando ip.

Este comando permite indicar, identificar o renovar una configuración IP para un ordenador que dispone de una dirección IP fija o dinámica.

El comando proprociona todos los detalles de la red física, tal como dirección IP, dirección de difusión, sitauación del multicast, número de paquetes enviados y recibidos, IRQ y direcciones utilizadas por la tarjeta de Red.

NETSTAT

Este comando permite visualizar los puertos abiertos de un ordenador y la tabla de enrutamiento del ordenador local.

netstat -an

Y esta es la salida:

Conexiones activas de Internet (servidores y establecidos)
Proto  Recib Enviad Dirección local         Dirección remota       Estado 
tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:587             0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:110             0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:143             0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:783           0.0.0.0:*               LISTEN     
tcp        0      0 217.71.201.164:8080     0.0.0.0:*               LISTEN     
tcp        0      0 217.71.201.164:80       0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:8081          0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:465             0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:8083            0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:8084          0.0.0.0:*               LISTEN     
tcp        0      0 217.71.201.164:53       0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:21              0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:53            0.0.0.0:*               LISTEN     
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN     
tcp        0      0 127.0.0.1:953           0.0.0.0:*               LISTEN 

También podemos saber que puertos tenemos abiertos en el dispositivo con:

netstat -tulpn

Con la siguiente salida:

tcp        0      0 127.0.0.1:3306          0.0.0.0:*               LISTEN      116195/mariadbd     
tcp        0      0 0.0.0.0:587             0.0.0.0:*               LISTEN      117051/exim4        
tcp        0      0 0.0.0.0:110             0.0.0.0:*               LISTEN      153184/dovecot      
tcp        0      0 0.0.0.0:143             0.0.0.0:*               LISTEN      153184/dovecot      
tcp        0      0 127.0.0.1:783           0.0.0.0:*               LISTEN      117342/perl         
tcp        0      0 217.71.201.164:8080     0.0.0.0:*               LISTEN      159786/apache2      
tcp        0      0 217.71.201.164:80       0.0.0.0:*               LISTEN      153032/nginx: maste 
tcp        0      0 127.0.0.1:8081          0.0.0.0:*               LISTEN      159786/apache2      
tcp        0      0 0.0.0.0:465             0.0.0.0:*               LISTEN      117051/exim4        
tcp        0      0 0.0.0.0:8083            0.0.0.0:*               LISTEN      125941/nginx: maste 
tcp        0      0 127.0.0.1:8084          0.0.0.0:*               LISTEN      153032/nginx: maste 
tcp        0      0 217.71.201.164:53       0.0.0.0:*               LISTEN      159078/named        
tcp        0      0 0.0.0.0:21              0.0.0.0:*               LISTEN      116051/vsftpd       
tcp        0      0 127.0.0.53:53           0.0.0.0:*               LISTEN      55554/systemd-resol 
tcp        0      0 127.0.0.1:53            0.0.0.0:*               LISTEN      55390/unbound       
tcp        0      0 0.0.0.0:22              0.0.0.0:*               LISTEN      155822/sshd: /usr/s 
tcp        0      0 127.0.0.1:953           0.0.0.0:*               LISTEN      159078/named        
tcp        0      0 0.0.0.0:25              0.0.0.0:*               LISTEN      117051/exim4        
tcp        0      0 217.71.201.164:8443     0.0.0.0:*               LISTEN      159786/apache2      
tcp        0      0 217.71.201.164:443      0.0.0.0:*               LISTEN      153032/nginx: maste 
tcp        0      0 0.0.0.0:993             0.0.0.0:*               LISTEN      153184/dovecot      
tcp        0      0 0.0.0.0:995             0.0.0.0:*               LISTEN      153184/dovecot      
tcp        0      0 127.0.0.1:9000          0.0.0.0:*               LISTEN      157225/php-fpm: mas 

Si nos fijamos, vemos puertos, por ejemplo el 8083 que se está usando para Nginx (seguramente para un Nginx Proxy).

NSLOOKUP

Este otro comando permite comprobar el buen funcionamiento de las resoluciones de nombres DNS.

Podemos revisar si un nombre de dominio responde correctamente a una IP o si tiene configurado uno o varios NS. También si un dominio responde bien a un NS concreto.

nslookup fsf.org

Esta sería la respuesta:

Server:         8.8.8.8
Address:        8.8.8.8#53

Non-authoritative answer:
Name:   fsf.org
Address: 209.51.188.174
Name:   fsf.org
Address: 2001:470:142:4::a

En este caso, nos indica que server está usando para resolver la IP y que dirección tiene el domino que consultamos.

Si un dominio no tiene respuesta para el NS, nos dará la siguiente respuesta:

** server can't find fsf.org: NXDOMAIN

Conclusión

Y hasta aquí las herramientas interesantes para gestionar nuestras redes y determinar que problemas pueden producirse en ellas.

Como última opción os dejamos este otro artículo sobre la herramienta dt que nos muestra toda la información sobre un nombre de dominio.

dt: Una herramienta CLI para mostrar información sobre su dominio
El comando dt es una herramienta bajo licencia Apache 2.0 escrita en Go. Es una herramienta CLI para DNS que muestra información sobre un dominio. En la actualidad, tiene las siguientes características: * Soporte de escáner de registros comunes (Tipo A, CNAME, TXT, etc). * Validación de cadenas…
Haz que cada palabra cuente: tu donación nos inspira a seguir creando contenido. Accede al apartado de Donación para hacer tu aportación