¿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
| Palabra | Qué significa | Ejemplo |
|---|---|---|
| Regla | una condición sobre un paquete y lo que se hace con él | |
| Permitir | dejar pasar el paquete | accept |
| Denegar | descartar el paquete | drop |
| Política por defecto | lo que se hace si ninguna regla encaja | |
| Cadena | la lista de reglas que se leen en orden | |
| Estado de la conexión | si 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 reglas | Paquete: TCP al puerto 22 desde fuera | Resultado |
|---|---|---|
| 1 denegar TCP 22 desde fuera, 2 permitir TCP 22 de todos | Encaja con la regla 1 y se detiene | Se deniega |
| 1 permitir TCP 22 de todos, 2 denegar TCP 22 desde fuera | Encaja con la regla 1 y se detiene | Se permite |
| Ninguna regla de TCP 22 y política denegar | No encaja con nada: manda la política | Se deniega |
Las celdas que rellenan los estudiantes quedan en blanco en esta vista previa.
Mira qué línea gana en el ejemplo
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
sudo ip netns exec gw nft list rulesetSe 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
sudo ip netns exec gw nft -c -f /etc/nftables.confSe 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
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.