¿Te resulta más fácil leer con fondo crema, un tono de color, más contraste o un texto más grande? Elige tus colores y tu texto una sola vez, para todas las páginas.

Lección gratuita

Reglas de cortafuegos: drop, reject y orden

Después de esta lección: Puedo escribir una regla de cortafuegos y decir qué ve el otro lado.

Lección de 55 min12 comandosLaboratorio de pasarela NAT: masquerade y reenvío de puertos con nftables en tu navegador

El silencio que costó una tarde

Un cortafuegos puede tirar un paquete en silencio (drop) o rechazarlo con un aviso (reject). Esa diferencia decide cuánto tarda alguien en encontrar una avería.

Una desarrolladora no consigue llegar a un servidor de pruebas. La página se queda colgada, espera, lo intenta otra vez y llama al equipo de redes. Un rechazo le habría dicho en un segundo que el servidor estaba en marcha. El silencio no le dijo nada.

Al final de esta lección

Nota

Puedo escribir una regla de cortafuegos y decir qué ve el otro lado.

Palabras clave

PalabraQué significaEjemplo
Cortafuegosreglas que deciden qué paquetes pasan
Cadenauna lista de reglas, leídas en orden
Políticalo que pasa con un paquete que ninguna regla recoge
Droptirar un paquete sin ninguna respuesta
Rejectrechazar un paquete y avisar al remitente
Ganchoel punto del viaje de un paquete donde se lee una cadenainput

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Una cadena es una lista con una política

Un cortafuegos guarda sus reglas en una cadena. Un paquete se compara con las reglas desde arriba. La primera regla que coincide decide, y las demás no se leen.

Si ninguna regla coincide, decide la política. La cadena de la puerta de enlace tiene aquí la política drop: solo deja pasar lo que una regla permite.

Lee la cadena forward de la puerta

Comando
sudo ip netns exec gw nft list chain inet filter forward

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Ejemplo resuelto: leer esa cadena línea a línea

LíneaEn palabras sencillas
hook forward ... policy dropMira los paquetes que atraviesan, y tira lo que ninguna regla permite
ct state established,related acceptDeja pasar las respuestas a conexiones ya abiertas
iifname "to-lan" acceptDeja pasar todo lo que llega por el cable de la LAN

Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.

Una regla en una máquina tira un puerto

Ahora escribes una regla tú mismo, en la máquina LAN y no en la puerta de enlace. Va en una tabla aparte, llamada practica, y no se guarda nada.

Primero una tabla, luego una cadena en el gancho input, que ve los paquetes que llegan a esa máquina, y después una regla.

Crea una tabla en la máquina LAN

Comando
sudo ip netns exec lan nft add table inet practica

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Añade una cadena en el gancho input

Comando
sudo ip netns exec lan nft add chain inet practica guardia '{ type filter hook input priority 0 ; policy accept ; }'

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Añade una regla que tira el puerto 8081

Comando
sudo ip netns exec lan nft add rule inet practica guardia tcp dport 8081 drop

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Pide el puerto 80, sin regla

Comando
sudo ip netns exec gw curl --noproxy '*' -sS -m 3 -o /dev/null -w '%{http_code}\n' http://10.0.0.2/

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Pide el puerto 8081, que la regla tira

Comando
sudo ip netns exec gw curl --noproxy '*' -sS -m 3 http://10.0.0.2:8081/

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Reject dice no en voz alta

Un drop no da respuesta, así que el remitente espera hasta rendirse. Un reject devuelve un rechazo enseguida, así que el remitente lo sabe al instante.

Drop es más discreto hacia fuera. Reject es más amable con tus propios compañeros, que encuentran la avería antes.

Vacía la cadena

Comando
sudo ip netns exec lan nft flush chain inet practica guardia

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Añade una regla que rechaza el puerto 8081

Comando
sudo ip netns exec lan nft add rule inet practica guardia tcp dport 8081 reject with tcp reset

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Llama otra vez al puerto 8081

Comando
sudo ip netns exec gw nc -zv -w 2 10.0.0.2 8081

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Un error frecuente

Advertencia

Mucha gente cree que un puerto bloqueado siempre muestra Connection refused. Solo lo hace cuando el cortafuegos hace un reject. Con un drop, el remitente ve que se agota el tiempo, y eso se parece a una máquina apagada.

Gana la primera regla que coincide

Las reglas se leen desde arriba. Una regla añadida con add va abajo del todo. Una regla añadida con insert va arriba del todo.

Ahora dejas pasar a una máquina, la puerta de enlace en 10.0.0.1, hacia el puerto 8081, mientras todos los demás siguen rechazados.

Inserta una regla accept sobre el reject

Comando
sudo ip netns exec lan nft insert rule inet practica guardia ip saddr 10.0.0.1 tcp dport 8081 accept

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Pide otra vez el 8081

Comando
sudo ip netns exec gw curl --noproxy '*' -sS -m 3 http://10.0.0.2:8081/

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Borra la tabla de práctica

Comando
sudo ip netns exec lan nft delete table inet practica

Se muestra aquí y no se ejecuta. Crea una cuenta gratuita para pulsar Ejecutar y escribirlo en el terminal de tu propio laboratorio.

Para ir más lejos: cuenta las coincidencias

Haz otra vez la tabla y la cadena. Añade la regla tcp dport 8081 counter reject with tcp reset y llama tres veces al puerto 8081 con nc.

Lista la tabla con sudo ip netns exec lan nft list table inet practica. ¿Qué dice el contador, y por qué querría uno un equipo de redes? Borra la tabla después.