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.
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:
- Busca la interfaz que tenga el estado
state UP(normalmenteeth0). - Busca la línea que comienza con
inet(noinet6). - Toma solo la parte de la dirección IP antes de la barra
/(por ejemplo, si vesinet 172.16.50.13/24, tu dirección IP es172.16.50.13). - Ignora la interfaz de bucle invertido o loopback (
lo) con la IP127.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,
ACCEPTpara aceptar oDROPpara 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 cadenaINPUT.-p icmp: Esta regla se aplica a los paquetes que utilizan el protocoloicmp.-j DROP: Si un paquete coincide, salta al objetivoDROP, 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.



