¿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 un cortafuegos

Después de esta lección: Puedo escribir y leer las reglas de un cortafuegos y decir qué decide para un paquete.

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

¿Cómo decide un cortafuegos qué tráfico pasa?

Un cortafuegos (en inglés, firewall) es un filtro que mira cada paquete y decide si lo deja pasar o lo descarta. Lo hace con una lista de reglas, y el orden de la lista cambia el resultado.

Una clínica dental quiere que sus recepcionistas lleguen al programa de citas y que nadie de fuera lo vea. Dos reglas en el orden equivocado dejan la puerta abierta de par en par.

Al final de esta lección

Nota

Puedo escribir y leer las reglas de un cortafuegos y decir qué decide para un paquete.

Palabras clave

PalabraQué significaEjemplo
Reglauna condición sobre un paquete y lo que se hace con él
Permitirdejar pasar el paqueteaccept
Denegardescartar el paquetedrop
Política por defectolo que se hace si ninguna regla encaja
Cadenala lista de reglas que se leen en orden
Estado de la conexiónsi un paquete responde a una conexión que ya existe

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

Una regla es una condición y una acción

Cada regla dice qué paquetes le interesan y qué hacer con ellos. Las condiciones miran el protocolo, el puerto y de dónde viene el paquete.

La acción es una de dos: permitir o denegar. Una regla como «permitir TCP al puerto 443, venga de donde venga» deja entrar el tráfico web cifrado.

Gana la primera regla que encaja

El cortafuegos lee la lista de arriba abajo y se detiene en la primera regla que encaja con el paquete. Las demás ya no se miran.

Si ninguna encaja, aplica la política por defecto. Una política que descarta lo que no está permitido es más segura que una que lo deja pasar.

Ejemplo resuelto: el mismo paquete, dos órdenes

Orden de las reglasPaquete: TCP al puerto 22 desde fueraResultado
1 denegar TCP 22 desde fuera, 2 permitir TCP 22 de todosEncaja con la regla 1 y se detieneSe deniega
1 permitir TCP 22 de todos, 2 denegar TCP 22 desde fueraEncaja con la regla 1 y se detieneSe permite
Ninguna regla de TCP 22 y política denegarNo encaja con nada: manda la políticaSe deniega

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

Mira qué línea gana en el ejemplo

Comando
printf "permitir tcp 22 oficina\ndenegar tcp 22 *\npermitir tcp 80 *\n" | grep -n "tcp 22"

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 añadir una regla de denegar al final cierra un puerto. Si una regla de permitir encaja antes, la de denegar nunca se llega a leer. Pon las reglas más concretas arriba y las más generales abajo.

La política por defecto siempre actúa

Hay dos estilos. Con política permitir, pasa todo salvo lo que prohíbes. Con política denegar, no pasa nada salvo lo que permites.

El segundo cuesta más al principio. Cada servicio nuevo necesita su regla. A cambio, un servicio que olvidaste no queda expuesto.

El estado de la conexión deja volver respuestas

Si solo dejas salir una petición, la respuesta también tiene que poder volver. Escribir una regla para cada respuesta sería imposible.

El cortafuegos recuerda las conexiones. Una regla del tipo «permitir lo que responde a una conexión que ya existe» deja volver las respuestas. Los intentos nuevos de fuera siguen sujetos a las demás reglas.

Lee las reglas de la puerta de enlace

Comando
sudo ip netns exec gw nft list ruleset

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

Cómo se lee ese conjunto de reglas

Hay una tabla inet filter con una cadena forward, la que mira el tráfico que la puerta reenvía de un lado a otro. La línea del tipo termina en policy drop: lo que ninguna regla permite, se descarta.

Después van dos reglas de permitir. La primera deja pasar lo establecido y relacionado, las respuestas. La segunda deja pasar todo lo que entra por el cable de lan.

Comprueba el fichero de reglas sin cargarlo

Comando
sudo ip netns exec gw nft -c -f /etc/nftables.conf

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

La opción -c comprueba y no cambia nada

La opción -c de nft revisa que el fichero esté bien escrito y no carga nada. Si todo es correcto, no imprime nada. Si hay un error, dice la línea.

Comprobar antes de cargar es un hábito importante: un fallo al aplicar reglas puede dejarte fuera de tu propio servidor.

Ejemplo: la primera coincidencia en código

Código: python
reglas = ["denegar tcp 22 fuera", "permitir tcp 22 oficina"]
paquete = "tcp 22 fuera"
decision = "denegar"  # la política por defecto
for regla in reglas:
    accion, protocolo, puerto, zona = regla.split(" ")
    if paquete == protocolo + " " + puerto + " " + zona:
        decision = accion
        break
print(decision)
# Cambia el paquete a "tcp 22 oficina" y ejecuta otra vez.

Sobre este laboratorio y su código: Laboratorio de pasarela NAT: masquerade y reenvío de puertos con nftables en tu navegador

¿Enseñas a una clase? Asigna este módulo a tus alumnos con guía del profesor, tareas con corrección automática y un laboratorio para cada alumno.