Capítulo 11. Netfilter e iproute (marcado de paquetes)

Hasta ahora hemos visto cómo funciona iproute, y hemos mencionado algunas veces netfilter. Este podría ser un buen momento para mirar las Rusty's Remarkably Unreliable Guides. Netfilter en sí lo puede encontrar aquí.

Netfilter nos permite filtrar paquetes, o cambiar sus cabeceras. Una capacidad especial es que podemos marcar un paquete con un número. Esto se hace con la estructura --set-mark.

Como ejemplo, esta orden marca todos los paquetes destinados al puerto 25, correo saliente:

# iptables -A PREROUTING -i eth0 -t mangle -p tcp --dport 25 \
 -j MARK --set-mark 1

Ahora digamos que tenemos varias conexiones, una que es rápida (y cara, por megabyte), y otra más lenta, pero de tarifa fija. Lo más seguro es que queramos hacer salir el correo mediante la ruta barata.

Ya hemos marcado los paquetes con un «1», y ahora le daremos instrucciones a la base de normas de rutado para que actúe sobre esto:

# echo 201 mail.out >> /etc/iproute2/rt_tables
# ip rule add fwmark 1 table correo.salida
# ip rule ls
0:	from all lookup local 
32764:	from all fwmark        1 lookup correo.salida
32766:	from all lookup main 
32767:	from all lookup default 

Ahora generaremos la tabla correo.salida con una ruta al enlace lento pero barato:

# /sbin/ip route add default via 195.96.98.253 dev ppp0 table# correo.salida

Y ya está. Si quisiéramos hacer algunas excepciones, hay muchas maneras de conseguirlo. Podemos modificar la orden de netfilter para excluir ciertas máquinas, o podemos insertar una regla con mayor prioridad que apunte a la tabla principal para dichas máquinas.

También podemos usar esta características para obedecer a los bits TOS marcando los paquetes con un tipo diferente de servicio con diferentes números, y creando reglas que actúen sobre esto. De esta manera podría dedicar, digamos, una línea RDSI a las sesiones interactivas.

No hace falta decir que esto funciona bien en una máquina que esté haciendo NAT («enmascaramiento»).

IMPORTANTE: Hemos recibido informes de que al menos MASQ y SNAT colisionan con el marcado de paquetes. Rusty Russell lo explica en este mensaje. Deshabilite el filtro de ruta inversa (reverse path filter) para que funcione correctamente.

Nota: para marcar paquetes, necesita activar algunas opciones en el núcleo:

IP: advanced router (CONFIG_IP_ADVANCED_ROUTER) [Y/n/?]
IP: policy routing (CONFIG_IP_MULTIPLE_TABLES) [Y/n/?]
IP: use netfilter MARK value as routing key (CONFIG_IP_ROUTE_FWMARK) [Y/n/?]

Vea también el Sección 15.5 en el Cookbook.