Bloqueo de tráfico ICMP en Linux mediante iptables

CompTIABeginner
Practicar Ahora

Introducción

En esta práctica de laboratorio, aprenderás a utilizar iptables, una potente utilidad de firewall por línea de comandos en Linux, para bloquear el tráfico ICMP entrante. Configurarás una regla de firewall para descartar (drop) paquetes del protocolo ICMP, el cual es utilizado frecuentemente por el comando ping para probar la conectividad de red. Esta es una habilidad fundamental para asegurar un sistema Linux mediante el control del acceso a la red a nivel de protocolo.

Comenzarás realizando un escaneo de red preliminar con nmap para evaluar los puertos abiertos del sistema. Luego, establecerás una línea base utilizando ping para verificar que el tráfico ICMP está permitido inicialmente. El núcleo de la práctica consiste en crear y aplicar una regla específica de iptables para descartar todos los paquetes ICMP entrantes. Finalmente, verificarás que la regla esté activa y probarás su eficacia intentando hacer ping a tu máquina nuevamente, confirmando que las solicitudes ahora se bloquean con éxito.

Esta es una Guía de Laboratorio (Guided Lab), que proporciona instrucciones paso a paso para ayudarte a aprender y practicar. Sigue las instrucciones cuidadosamente para completar cada paso y ganar experiencia práctica. Los datos históricos muestran que este es un laboratorio de nivel principiante con una tasa de finalización del 99%. Ha recibido una tasa de valoraciones positivas del 98% por parte de los alumnos.

Escaneo de puertos TCP y UDP abiertos con nmap

En este paso, aprenderás a utilizar la herramienta nmap para escanear tu propio sistema en busca de puertos de red abiertos. Los puertos de red son los puntos finales de comunicación en un sistema operativo. Cuando un programa quiere recibir información de la red, se pone a "escuchar" en un puerto específico. Escanear los puertos abiertos es un primer paso fundamental para evaluar la seguridad de una máquina, ya que cada puerto abierto representa un punto de entrada potencial para un atacante.

Primero, necesitas instalar nmap, ya que no está incluido en el entorno base. Es una buena práctica actualizar la lista de paquetes antes de instalar nuevo software.

Ejecuta el siguiente comando para actualizar la lista de paquetes:

sudo apt-get update

Ahora, instala nmap ejecutando:

sudo apt-get install -y nmap

Deberías ver una salida indicando que nmap y sus dependencias se están instalando.

A continuación, necesitas encontrar la dirección IP de tu máquina para indicarle a nmap qué escanear. Puedes encontrarla usando el comando ip.

ip addr show

Busca una entrada como eth0 o ens33. Tu dirección IP aparecerá junto a inet. Tendrá un aspecto similar a 172.16.50.13/24.

Cómo identificar tu dirección IP a partir de la salida:

  1. Busca la interfaz que tenga el estado state UP (normalmente eth0).
  2. Busca la línea que comienza con inet (no inet6).
  3. Toma solo la parte de la dirección IP antes de la barra / (por ejemplo, si ves inet 172.16.50.13/24, tu dirección IP es 172.16.50.13).
  4. Ignora la interfaz de bucle invertido o loopback (lo) con la IP 127.0.0.1.

Para el resto de este laboratorio, utilizaremos <your_IP_address> como marcador de posición para tu dirección IP real.

1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueue state UNKNOWN group default qlen 1000
    link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00
    inet 127.0.0.1/8 scope host lo
       valid_lft forever preferred_lft forever
    inet6 ::1/128 scope host
       valid_lft forever preferred_lft forever
2: eth0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc mq state UP group default qlen 1000
    link/ether 00:16:3e:04:c3:1d brd ff:ff:ff:ff:ff:ff
    altname enp0s5
    altname ens5
    inet 172.16.50.13/24 metric 100 brd 172.16.50.255 scope global dynamic eth0
       valid_lft 1892159940sec preferred_lft 1892159940sec
    inet6 fe80::216:3eff:fe04:c31d/64 scope link
       valid_lft forever preferred_lft forever
3: docker0: <NO-CARRIER,BROADCAST,MULTICAST,UP> mtu 1500 qdisc noqueue state DOWN group default
    link/ether 02:42:1d:45:49:f8 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever

Ahora estás listo para realizar tu primer escaneo. Comencemos escaneando los puertos TCP (Transmission Control Protocol) abiertos. TCP es un protocolo orientado a la conexión que se utiliza para muchos servicios comunes como SSH (puerto 22) y HTTP (puerto 80). La opción -sT en nmap realiza un escaneo de conexión TCP.

Importante: Sustituye <your_IP_address> por la IP real que encontraste en el paso anterior. Por ejemplo, si tu IP es 172.16.50.13, el comando sería nmap -sT 172.16.50.13.

Reemplaza <your_IP_address> con tu IP y ejecuta el comando:

nmap -sT <your_IP_address>

La salida mostrará los puertos que están en estado "open" (abierto). Es probable que tu sistema tenga el puerto SSH (22) abierto por defecto, y puede que tenga servicios adicionales ejecutándose en otros puertos.

Starting Nmap 7.80 ( https://nmap.org ) at 2025-07-01 14:08 CST
Nmap scan report for iZrj93qpoj98oqswu96cqfZ (172.16.50.13)
Host is up (0.00013s latency).
Not shown: 997 closed ports
PORT     STATE SERVICE
22/tcp   open  ssh
3000/tcp open  ppp
3001/tcp open  nessus

Nmap done: 1 IP address (1 host up) scanned in 0.06 seconds

A continuación, escaneemos los puertos UDP (User Datagram Protocol). UDP es un protocolo sin conexión utilizado para servicios como DNS (puerto 53) y DHCP (puerto 67/68). Los escaneos UDP pueden ser más lentos y menos fiables que los TCP. El uso de sudo proporciona mejores resultados para los escaneos UDP. La opción -sU le indica a nmap que realice un escaneo UDP.

Recuerda: Sustituye <your_IP_address> por tu dirección IP real del paso anterior.

Reemplaza <your_IP_address> con tu IP y ejecuta el comando:

sudo nmap -sU <your_IP_address>

La salida podría mostrar puertos como open|filtered. Esto significa que nmap no puede determinar si el puerto está abierto o si un firewall está bloqueando el escaneo. Este es un resultado común en los escaneos UDP.

Starting Nmap 7.80 ( https://nmap.org ) at 2025-07-01 14:09 CST
Nmap scan report for iZrj93qpoj98oqswu96cqfZ (172.16.50.13)
Host is up (0.0000060s latency).
Not shown: 998 closed ports
PORT     STATE         SERVICE
68/udp   open|filtered dhcpc
5353/udp open|filtered zeroconf

Nmap done: 1 IP address (1 host up) scanned in 1.29 seconds

Al completar estos escaneos, habrás identificado con éxito los servicios que están a la escucha de conexiones de red en tu máquina.

Verificación de la conectividad de red inicial con ping

En este paso, utilizarás el comando ping para verificar que tu sistema responde a las solicitudes de red antes de implementar cualquier regla de firewall. El comando ping envía paquetes ICMP (Internet Control Message Protocol) de tipo "echo request" a un host de destino. Si el host es alcanzable y está configurado para responder, devolverá un paquete "echo reply". Esta es una forma fundamental de probar la conectividad básica de la red.

Antes de crear una regla de firewall para bloquear este tipo de tráfico, debemos confirmar primero que el tráfico está permitido actualmente. Esto garantiza que, cuando probemos nuestra regla más adelante, podamos estar seguros de que la regla es la causa del bloqueo y no algún otro problema de red preexistente.

Haremos ping a la dirección de "bucle invertido" o loopback, 127.0.0.1. Esta dirección IP especial siempre apunta a tu propia máquina, lo que te permite probar la pila de red local sin necesidad de una conexión externa ni de conocer la dirección IP asignada a tu máquina.

Para enviar solo cuatro paquetes y luego detenerse, utilizaremos la opción -c 4. Esto es importante porque, sin ella, ping se ejecutaría continuamente hasta que lo detuvieras manualmente con Ctrl+C.

Abre tu terminal y ejecuta el siguiente comando:

ping -c 4 127.0.0.1

Deberías ver una salida que muestra que se enviaron cuatro paquetes y se recibieron cuatro, lo que indica que tu sistema está respondiendo correctamente a las solicitudes ICMP.

PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.045 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.055 ms
64 bytes from 127.0.0.1: icmp_seq=3 ttl=64 time=0.052 ms
64 bytes from 127.0.0.1: icmp_seq=4 ttl=64 time=0.053 ms

--- 127.0.0.1 ping statistics ---
4 packets transmitted, 4 received, 0% packet loss, time 3070ms
rtt min/avg/max/mdev = 0.045/0.051/0.055/0.003 ms

La línea 0% packet loss confirma que la conexión funciona perfectamente. Ahora que has establecido una línea base, estás listo para configurar una regla de firewall que bloquee exactamente este tipo de comunicación.

Creación de una regla de iptables para descartar paquetes ICMP

En este paso, configurarás una regla de firewall sencilla utilizando iptables, la utilidad de línea de comandos estándar para gestionar las reglas de filtrado de paquetes de red en el kernel de Linux. Crearemos una regla para bloquear el tráfico ICMP que probaste anteriormente con el comando ping.

iptables funciona con un sistema de tablas, cadenas (chains) y reglas.

  • Tablas: Son colecciones de cadenas para un propósito específico. La tabla más utilizada es filter, que es la predeterminada y se usa para el filtrado de paquetes.
  • Cadenas: Son listas de reglas que se comprueban en orden. Para el tráfico entrante, se utiliza la cadena INPUT.
  • Reglas: Una regla especifica los criterios para un paquete (como su protocolo o dirección de origen) y un objetivo o acción (qué hacer con el paquete, por ejemplo, ACCEPT para aceptar o DROP para descartar).

Primero, examinemos el conjunto actual de reglas. Dado que iptables modifica la configuración del kernel, debes usar sudo. La opción -L enumera las reglas de la tabla filter por defecto.

sudo iptables -L

Verás las tres cadenas por defecto: INPUT, FORWARD y OUTPUT. En este entorno, es posible que notes que Docker ya ha creado algunas reglas en la cadena FORWARD y ha añadido cadenas personalizadas para la red de contenedores. Las cadenas INPUT y OUTPUT siguen utilizando la política ACCEPT por defecto para el tráfico normal.

Chain INPUT (policy ACCEPT)
target     prot opt source               destination

Chain FORWARD (policy DROP)
target     prot opt source               destination
DOCKER-USER  all  --  anywhere             anywhere
DOCKER-ISOLATION-STAGE-1  all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere             ctstate RELATED,ESTABLISHED
DOCKER     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere
ACCEPT     all  --  anywhere             anywhere

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Chain DOCKER (1 references)
target     prot opt source               destination

Chain DOCKER-ISOLATION-STAGE-1 (1 references)
target     prot opt source               destination
DOCKER-ISOLATION-STAGE-2  all  --  anywhere             anywhere
RETURN     all  --  anywhere             anywhere

Chain DOCKER-ISOLATION-STAGE-2 (1 references)
target     prot opt source               destination
DROP       all  --  anywhere             anywhere
RETURN     all  --  anywhere             anywhere

Chain DOCKER-USER (1 references)
target     prot opt source               destination
RETURN     all  --  anywhere             anywhere

Ahora, vamos a añadir una regla para bloquear los paquetes ICMP entrantes. Añadiremos (-A de append) una nueva regla a la cadena INPUT.

El comando se construye de la siguiente manera:

  • sudo iptables: El comando para gestionar el firewall.
  • -A INPUT: Añade una regla a la cadena INPUT.
  • -p icmp: Esta regla se aplica a los paquetes que utilizan el protocolo icmp.
  • -j DROP: Si un paquete coincide, salta al objetivo DROP, que descarta silenciosamente el paquete sin enviar ninguna respuesta.

Ejecuta el siguiente comando para crear la regla:

sudo iptables -A INPUT -p icmp -j DROP

Este comando no producirá ninguna salida si tiene éxito. Ahora has instruido al firewall del kernel para que descarte todos los paquetes ICMP entrantes de cualquier origen.

Verificación de la regla del firewall y prueba del bloqueo

En este paso final, confirmarás que tu nueva regla de firewall se ha añadido correctamente y luego probarás su efecto intentando hacer ping a tu sistema de nuevo. Este proceso de verificación es crítico en la administración de redes para asegurar que las políticas de seguridad se implementen correctamente.

Primero, veamos de nuevo la lista de reglas para ver tu nueva incorporación. Al ejecutar el mismo comando que antes, podrás ver el estado actual del firewall.

sudo iptables -L

Ahora deberías ver tu nueva regla listada bajo la cadena INPUT. La salida muestra claramente que los paquetes que coincidan con el protocolo icmp serán enviados al objetivo DROP.

Chain INPUT (policy ACCEPT)
target     prot opt source               destination
DROP       icmp --  anywhere             anywhere

Chain FORWARD (policy ACCEPT)
target     prot opt source               destination

Chain OUTPUT (policy ACCEPT)
target     prot opt source               destination

Ahora que has confirmado que la regla está en su lugar, vamos a probarla. Ejecuta el mismo comando ping que utilizaste en el Paso 2.

ping -c 4 127.0.0.1

Esta vez, no verás respuestas. El comando parecerá quedarse colgado durante unos segundos y luego finalizará. La salida mostrará 100% packet loss. Este es el comportamiento esperado porque el firewall del kernel ahora está descartando silenciosamente los paquetes ICMP entrantes, tal como indicaste.

PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.

--- 127.0.0.1 ping statistics ---
4 packets transmitted, 0 received, 100% packet loss, time 3055ms

¡Has bloqueado con éxito el tráfico ICMP! Las reglas que creas con iptables no son persistentes y se borrarán al reiniciar el sistema. Sin embargo, es una buena práctica saber cómo eliminar una regla manualmente. Puedes hacerlo utilizando el flag -D (delete), especificando exactamente la misma regla que añadiste.

Vamos a eliminar la regla para restaurar la conectividad.

sudo iptables -D INPUT -p icmp -j DROP

Para confirmar que la regla ha desaparecido y la conectividad se ha restaurada, ejecuta ping una última vez.

ping -c 2 127.0.0.1

El ping debería tener éxito ahora, confirmando que has eliminado correctamente la regla del firewall.

PING 127.0.0.1 (127.0.0.1) 56(84) bytes of data.
64 bytes from 127.0.0.1: icmp_seq=1 ttl=64 time=0.048 ms
64 bytes from 127.0.0.1: icmp_seq=2 ttl=64 time=0.058 ms

--- 127.0.0.1 ping statistics ---
2 packets transmitted, 2 received, 0% packet loss, time 1024ms
rtt min/avg/max/mdev = 0.048/0.053/0.058/0.005 ms

Resumen

En esta práctica de laboratorio, aprendiste a realizar un reconocimiento de red inicial en un sistema Linux. Comenzaste instalando la herramienta nmap para escanear puertos TCP y UDP abiertos tras identificar la dirección IP de la máquina. Después, estableciste una línea base de conectividad de red mediante el comando ping, que confirmó que el sistema recibía y respondía correctamente al tráfico ICMP.

La parte central del laboratorio consistió en utilizar la utilidad de firewall iptables para manipular el tráfico de red. Construiste y aplicaste una regla específica a la cadena INPUT para descartar (DROP) todos los paquetes ICMP entrantes, bloqueando eficazmente herramientas como ping. Para completar el proceso, verificaste que la nueva regla estaba activa consultando el conjunto de reglas actual de iptables y probaste el bloqueo intentando hacer ping a la máquina de nuevo, confirmando que las solicitudes ahora fallaban por tiempo de espera (timeout) tal como se esperaba.