Saltar al contenido

Red y cortafuegos

El cortafuegos que lleva dentro el propio sistema: por dónde pasa un paquete en Linux, qué cadena y qué tabla le toca, cómo se escribe una regla y cómo se hace que sobreviva a un reinicio, y cómo se hace lo mismo en Windows con netsh.

netfilter: cadenas y tablas

El cortafuegos de Linux no es un programa, es una parte del núcleo llamada netfilter. iptables es solo la herramienta con la que se le escriben reglas. netfilter coloca puntos de enganche a lo largo del recorrido de un paquete, y en cada punto de enganche cuelga una cadena de reglas.

Hay cinco cadenas y su nombre dice dónde están. Entenderlas es entender el momento del recorrido en el que se puede actuar sobre el paquete.

CadenaCuándo se atraviesa
PREROUTINGNada más entrar, antes de decidir a dónde va el paquete
INPUTCuando el destino es la propia máquina
FORWARDCuando el paquete solo está de paso hacia otra máquina
OUTPUTCuando el paquete lo ha generado la propia máquina
POSTROUTINGJusto antes de salir por la interfaz, ya decidida la ruta

El otro eje son las tablas, que agrupan reglas por el tipo de trabajo que hacen. Cada tabla existe solo en las cadenas que le tienen sentido, y si no se indica ninguna se trabaja sobre la de filtrado.

TablaPara qué
filterDecidir si el paquete pasa o no. Es la tabla por defecto
natCambiar direcciones o puertos: traducción de direcciones
mangleModificar campos de la cabecera, como el marcado de paquetes
rawActuar antes que nada, típicamente para excluir del seguimiento
securityMarcado para políticas de control de acceso obligatorio

Una precisión que conviene tener clara porque circula mal: el seguimiento de conexiones no es una tabla. Es un subsistema de netfilter que recuerda el estado de cada conexión, y es lo que permite escribir reglas que aceptan el tráfico de vuelta de una conexión ya establecida sin abrir el puerto de entrada.

Cinco cadenas y cinco tablas. Las tablas son filter, nat, mangle, raw y security; el seguimiento de conexiones es un subsistema, no una tabla.

PREROUTING

Antes de decidir la ruta. Aquí se hace el DNAT: cambiar el destino del paquete que entra.

Decisión de encaminamiento

¿El paquete es para esta máquina o va de paso hacia otra?

INPUT o FORWARD

INPUT si es para la máquina; FORWARD si solo atraviesa. El filtrado de verdad vive aquí.

OUTPUT

Lo que genera la propia máquina, antes de salir.

POSTROUTING

Justo antes de poner el paquete en el cable. Aquí van SNAT y MASQUERADE: cambiar el origen.

Para el examen

  • Las cinco cadenas: PREROUTING, INPUT, FORWARD, OUTPUT y POSTROUTING

  • Las cinco tablas: filter, nat, mangle, raw y security

  • El seguimiento de conexiones: es un subsistema, no una tabla

Los tres recorridos de un paquete

Con cinco cadenas hay muchas combinaciones posibles, pero en la práctica un paquete solo sigue uno de tres recorridos, y saber cuál es lo que decide en qué cadena hay que escribir la regla. Es la pregunta más repetida de todo el subtema.

SituaciónCadenas que atraviesa
El paquete va dirigido a esta máquinaPREROUTING y después INPUT
El paquete lo genera esta máquinaOUTPUT y después POSTROUTING
La máquina hace de encaminadorPREROUTING, FORWARD y POSTROUTING

El tercer caso es el de una máquina con varias interfaces de red que reenvía tráfico de una a otra. No funciona de serie: el reenvío entre interfaces viene desactivado, y eso pilla a mucha gente escribiendo reglas de FORWARD que nunca llegan a aplicarse porque el paquete ni siquiera se plantea salir.

bash
# activar el reenvío hasta el próximo reinicio
echo 1 > /proc/sys/net/ipv4/ip_forward

# dejarlo activado de forma permanente, en /etc/sysctl.conf
net.ipv4.ip_forward=1

Si la máquina hace de encaminador y el tráfico no pasa, lo primero es comprobar el bit de reenvío. Sin él, las reglas de FORWARD son papel mojado.

Para el examen

  • Si la máquina encamina y el tráfico no pasa: revisar el bit de reenvío (ip_forward)

  • Sin él: las reglas de FORWARD no sirven de nada

Escribir reglas con iptables

Una regla de iptables se lee como una frase: en qué tabla, en qué cadena, qué paquetes seleccionar y qué hacer con ellos. Las opciones que eligen la cadena y la operación van en mayúscula; las que describen el paquete, en minúscula.

OpciónQué indica
-t tablaSobre qué tabla se trabaja. Sin ella, filter
-A cadenaAñade la regla al final de la cadena
-I cadena nInserta la regla en la posición indicada
-D cadena nBorra la regla que ocupa esa posición
-R cadena nReemplaza la regla de esa posición
-P cadena destinoFija la política por defecto de la cadena
-LLista las reglas; con -n sin resolver nombres y con -v con contadores
-FVacía todas las reglas de la cadena o de la tabla
-ZPone a cero los contadores de paquetes y bytes

La D mayúscula borra una regla; la d minúscula es la dirección de destino. Es la confusión que más reglas mal escritas produce.

Los criterios de selección describen qué paquetes encajan: el protocolo, las direcciones de origen y destino, los puertos y las interfaces por las que el paquete entra o sale.

CriterioSelecciona por
-p tcpProtocolo de transporte
-s red/máscaraDirección de origen
-d red/máscaraDirección de destino
--dport puertoPuerto de destino, ligado al protocolo indicado con -p
--sport puertoPuerto de origen
-i interfazInterfaz de entrada
-o interfazInterfaz de salida
-m móduloCarga un módulo de comparación adicional

Dentro de una cadena, las reglas se comprueban por orden y manda la primera que encaja: en cuanto una regla decide, el resto no se mira. De ahí que el orden importe tanto y que exista la opción de insertar en una posición concreta en vez de añadir al final.

bash
iptables -L -n -v
iptables -t nat -L -n -v
iptables -P INPUT DROP
iptables -A INPUT -p tcp --dport 22 -s 10.20.0.0/16 -j ACCEPT
iptables -I INPUT 1 -i lo -j ACCEPT
iptables -D INPUT 3
iptables -F

La política por defecto merece un aviso práctico: poner la de INPUT en descarte con una sesión remota abierta y sin haber permitido antes el puerto de administración deja la máquina inaccesible. Se permite primero y se cierra después, nunca al revés.

Para el examen

  • -D mayúscula: borra una regla

  • -d minúscula: es la dirección de destino

  • -A y -I: añade al final e inserta al principio

Qué hacer con el paquete: objetivos y traducción de direcciones

La opción -j indica el objetivo, es decir qué se hace con el paquete que ha encajado. Unos objetivos son de filtrado y otros de traducción de direcciones, y cada uno solo vale en determinadas tablas y cadenas.

ObjetivoEfectoDónde vale
ACCEPTDeja pasar el paqueteCualquier tabla
DROPLo descarta en silencio, sin avisar al origenFiltrado
REJECTLo rechaza y devuelve un mensaje de errorINPUT, FORWARD y OUTPUT
SNATCambia la dirección de origen por una fijanat, en POSTROUTING
MASQUERADEComo SNAT, pero toma la dirección de la interfaz de salidanat, en POSTROUTING
DNATCambia la dirección de destinonat, en PREROUTING
REDIRECTRedirige a un puerto de la propia máquinanat, en PREROUTING y OUTPUT

La diferencia entre descartar y rechazar no es de matiz. Descartar en silencio hace que el cliente espere hasta agotar el tiempo, lo que ralentiza a quien explora la máquina buscando puertos abiertos. Rechazar es más limpio para los servicios internos, porque el error llega de inmediato.

En la traducción de direcciones, la elección entre dirección fija y dirección de la interfaz depende de si la salida tiene una dirección estable. Con una conexión de dirección variable, la opción de enmascarar es la única que funciona sin reescribir la regla cada vez.

bash
# salida a internet de toda una red interna, con dirección pública fija
iptables -t nat -A POSTROUTING -s 10.20.30.0/24 -o eth0 -j SNAT --to 203.0.113.7

# lo mismo cuando la dirección de salida cambia
iptables -t nat -A POSTROUTING -s 10.20.30.0/24 -o eth0 -j MASQUERADE

# publicar hacia dentro un servidor web interno
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 443 -j DNAT --to 10.20.30.8

# atender en un puerto alto lo que llega al 8080
iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 8080 -j REDIRECT --to-port 80

DNAT cambia el destino y va en PREROUTING; SNAT y MASQUERADE cambian el origen y van en POSTROUTING. La regla nemotécnica es que el destino se decide antes de encaminar y el origen, después.

Para el examen

  • DNAT: cambia el destino; va en PREROUTING

  • SNAT y MASQUERADE: cambian el origen; van en POSTROUTING

Que las reglas sobrevivan al reinicio

Las reglas de iptables viven en memoria. Al apagar la máquina desaparecen, y ese es el error de bulto del administrador novato: dejar un cortafuegos perfectamente configurado que al siguiente reinicio no existe. Guardarlas y restaurarlas son dos órdenes.

FamiliaFichero donde se guardan por convenio
Debian y derivadas/etc/iptables/rules.v4 y rules.v6 para la versión 6
Red Hat y derivadas/etc/sysconfig/iptables
bash
iptables-save > /etc/iptables/rules.v4
iptables-restore < /etc/iptables/rules.v4

Guardar no basta: alguien tiene que restaurar en cada arranque. En la familia Debian eso lo hace un paquete específico de persistencia, que hay que instalar aparte y que carga automáticamente el fichero de reglas al iniciar el sistema.

iptables-save escribe y iptables-restore lee. Sin un mecanismo que ejecute la restauración al arrancar, el cortafuegos se pierde en el primer reinicio.

Para el examen

  • iptables-save: escribe las reglas

  • iptables-restore: las carga

  • Sin restaurarlas al arrancar: el cortafuegos se pierde en el primer reinicio

Lo que hay hoy encima de netfilter

iptables sigue siendo lo que se estudia y lo que se pregunta, pero conviene saber en qué punto está. El sustituto oficial es nftables, que unifica en una sola herramienta lo que antes eran cuatro utilidades distintas para tráfico IPv4, IPv6, puentes y tramas.

En las distribuciones actuales, escribir una regla con la orden clásica suele acabar traduciéndose por debajo a nftables mediante una capa de compatibilidad. Es decir, se sigue tecleando lo mismo, pero el motor de abajo ya no es el antiguo.

HerramientaQué es
netfilterEl subsistema del núcleo. Es quien filtra de verdad
iptablesLa herramienta clásica de reglas
nftablesSu sustituto, con una sintaxis unificada
ufwFrontend sencillo, habitual en la familia Debian
firewalldFrontend por zonas, habitual en la familia Red Hat

Los dos frontends existen porque escribir reglas a mano es propenso a errores. Trabajan por servicios y por zonas de confianza en vez de por direcciones y puertos sueltos, y por debajo generan las reglas correspondientes.

netfilter es el motor, iptables y nftables son las herramientas de reglas, y ufw y firewalld son capas de comodidad por encima. Confundir netfilter con iptables es el error de concepto más común.

Para el examen

  • netfilter: el motor, dentro del núcleo

  • iptables y nftables: las herramientas de reglas

  • ufw y firewalld: capas de comodidad por encima

  • Error de concepto más común: confundir netfilter con iptables

Cortafuegos y red en Windows: netsh

En Windows, la orden equivalente para tocar la red desde la consola es netsh. Su sintaxis se organiza en contextos: se indica de qué se va a hablar y después qué se quiere hacer. Los contextos que salen en el temario son el del cortafuegos, el de las interfaces, el inalámbrico y el del servicio web.

cmd
netsh advfirewall show allprofiles
netsh advfirewall set allprofiles state on
netsh advfirewall firewall add rule name="Intranet 8080" dir=in action=allow protocol=TCP localport=8080

Fíjese en la estructura de una regla: nombre, dirección del tráfico, acción, protocolo y puerto. Son los mismos conceptos que en iptables, con otra sintaxis. La diferencia visible es que el cortafuegos de Windows trabaja por perfiles, es decir por tipo de red, y una regla puede aplicarse solo al perfil activo.

El contexto de interfaces configura el direccionamiento, y sirve tanto para fijar una configuración estática como para volver a la automática.

cmd
netsh interface ip show config
netsh interface ip set address name="Ethernet" source=static addr=10.20.30.8 mask=255.255.255.0 gateway=10.20.30.1
netsh interface ip set address name="Ethernet" source=dhcp
netsh interface ip add dnsservers "Ethernet" 10.20.0.5
netsh interface ip delete arpcache

Dos posibilidades más que se preguntan: el contexto inalámbrico permite bloquear redes por su identificador, y el del servicio web permite asociar un certificado a una combinación de dirección y puerto, que es como se publica un servicio cifrado sin interfaz gráfica. Y la configuración entera se puede volcar a fichero y restaurar desde él.

cmd
netsh wlan add filter permission=block ssid="Invitados" networktype=infrastructure
netsh http add sslcert ipport=10.20.30.8:443 certhash=... appid={...}
netsh dump > C:\copias\red.txt
netsh exec C:\copias\red.txt

Alrededor de netsh están las órdenes de diagnóstico, que no configuran nada pero son las que se usan para averiguar qué está pasando.

OrdenQué responde
ipconfigConfiguración de las interfaces. /flushdns vacía la caché de nombres
arp -aLa tabla que empareja direcciones IP con direcciones físicas
getmacLa dirección física de las interfaces del equipo
routeLa tabla de encaminamiento
netstat -anoConexiones y puertos en escucha, con el proceso que los ocupa
tracert, pathpingEl camino que siguen los paquetes hasta un destino
nslookupConsultas al servidor de nombres

netstat -ano es la orden que resuelve la pregunta de qué proceso está ocupando un puerto, porque la opción o añade el identificador del proceso a la salida.

Para el examen

  • netstat -ano: qué proceso ocupa un puerto

  • Qué añade la o: el identificador del proceso

  • Cortafuegos de Windows: se gobierna con netsh advfirewall