| Made possible by PowerDNS | ||
|---|---|---|
| Anterior | Capítulo 9. Disciplinas de colas (qdiscs) para gestión del ancho de banda | Siguiente |
Para determinar qué clase deberá procesar un paquete, se llama a una «cadena clasificadora» cada vez que hay que tomar una decisión. Esta cadena consiste en todos los filtros asociados a la qdisc con clases que debe decidir.
Repitamos el árbol, que no es un árbol:
root 1:
|
_1:1_
/ | \
/ | \
/ | \
10: 11: 12:
/ \ / \
10:1 10:2 12:1 12:2Cuando encolamos un paquete, se consulta la cadena de filtros para cada rama para que de las instrucciones relevantes. Una configuración típica podría tener un filtro en 1:1 que dirija un paquete a 12:, y uno en 12: que envíe el paquete a 12:2.
También podría asociar esta última regla a 1:1, pero puede ganar eficiencia haciendo pruebas más específicas más abajo en la cadena.
No se puede filtrar un paquete "hacia arriba", por cierto. Además, con HTB, ¡debería asociar todos los filtros a la raíz!
Y de nuevo: ¡los paquetes sólo se encolan hacia abajo! Cuando se desencolan, vuelven hacia arriba, donde está la interfaz. ¡No caen desde el final del árbol directamente al adaptador de red!
Como se explicó en el capítulo del Clasificador, puede hacer coincidencias con literalmente cualquier cosa, usando una sintaxis bastante complicada. Para empezar, le mostraremos cómo hacer cosas obvias, que por suerte es muy sencillo.
Digamos que tenemos una qdisc PRIO llamada «10:» que contiene tres clases, y queremos asignar todo el tráfico desde y hacia el puerto 22 a la banda de prioridad más alta. Los filtros podrían ser:
# tc filter add dev eth0 protocol ip parent 10: prio 1 u32 match \ ip dport 22 0xffff flowid 10:1 # tc filter add dev eth0 protocol ip parent 10: prio 1 u32 match \ ip sport 80 0xffff flowid 10:1 # tc filter add dev eth0 protocol ip parent 10: prio 2 flowid 10:2
¿Qué dice esto? Dice: asociar a eth0, nodo 10: un filtro u32 de prioridad 1 que coincide *exactamente* con el puerto IP de destino 22 y envíalo ala banda 10:1. Y luego repetimos lo mismo para el puerto de origen 80. La última orden dice que cualquier cosa que no coincida debería ir a la banda 10:2, la de siguiente prioridad.
Necesita añadir «eth0», o como sea que se llame la interfaz, porque cada interfaz tiene un espacio de controladores propio.
Para escoger sobre una dirección IP, use esto:
# tc filter add dev eth0 parent 10:0 protocol ip prio 1 u32 \ match ip dst 4.3.2.1/32 flowid 10:1 # tc filter add dev eth0 parent 10:0 protocol ip prio 1 u32 \ match ip src 1.2.3.4/32 flowid 10:1 # tc filter add dev eth0 protocol ip parent 10: prio 2 \ flowid 10:2
Esto asigna el tráfico hacia 4.3.2.1 y desde 1.2.3.4 a la cola de más alta prioridad, y el resto a la de siguiente prioridad.
Puede concatenar coincidencias, para capturar el tráfico desde 1.2.3.4, puerto 80. Se hace así:
# tc filter add dev eth0 parent 10:0 protocol ip prio 1 u32 match ip src 4.3.2.1/32 match ip sport 80 0xffff flowid 10:1
La mayoría de las órdenes de ajuste que se presentan aquí empiezan con éste preámbulo:
# tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 ..Estas son las coincidencias llamadas «u32», que pueden coincidir con CUALQUIER parte de un paquete.
Máscara de origen «match ip src 1.2.3.0/24», máscara de destino «match ip dst 4.3.2.0/24». Para coincidir con una única máquina, use /32 u omita la máscara.
Origen: «match ip sport 80 0xffff», destino: «match ip dport 0xffff»
Use los números de /etc/protocols. Por ejemplo, icmp es 1: «match ip protocol 1 0xff».
Puede marcar los paquetes con ipchains y hacer que la marca sobreviva al rutado a través de interfaces. Esto es realmente útil para por ejemplo ajustar el tráfico de eth1 sólo si viene de eth0. Sintaxis: # tc filter add dev eth1 protocol ip parent 1:0 prio 1 handle 6 fw flowid 1:1 ¡Fíjese que ésta no es una coincidencia u32!
Puede poner una marca así:
# iptables -A PREROUTING -t mangle -i eth0 -j MARK --set-mark 6El número 6 es arbitrario.
Si no desea entender toda la sintaxis de tc, limítese a usar iptables, y aprenda sólo a seleccionar sobre fwmark.
Para escoger el tráfico interactivo, de retraso mínimo:
# tc filter add dev ppp0 parent 1:0 protocol ip prio 10 u32 \
match ip tos 0x10 0xff \
flowid 1:4
Use 0x08 0xff para el tráfico masivo.Si desea ver más órdenes de filtrado, vea el capítulo de Filtros avanzados.