| Made possible by PowerDNS | ||
|---|---|---|
| Anterior | Capítulo 9. Disciplinas de colas (qdiscs) para gestión del ancho de banda | Siguiente |
El dispositivo intermedio de encolado (Intermediate queueing device) no es una qdisc pero su uso está muy unido a las qdisc. Dentro de Linux, las qdisc se asocian a dispositivos de red y todo lo que se encola en el dispositivo se encola antes en la qdisc. Partiendo de este concepto, surgen dos limitaciones:
1. Sólo se pueden hacer ajustes de salida (existe una qdisc de entrada, pero sus posibilidades son muy limitadas comparadas a las qdisc con clases).
2. Una qdisc sólo puede ver el tráfico de una interfaz, de manera que no se pueden imponer limitaciones globales.
IMQ está aquí para resolver ambas limitaciones. En breve, se puede poner todo lo que se quiera en una qdisc. Los paquetes marcados de forma especial los interceptan las ranuras NF_IP_PRE_ROUTING y NF_IP_POST_ROUTING de netfilter y pasan por una qdisc asociada a un dispositivo imq. Se usa un objetivo de iptables para marcar los paquetes.
Esto permite que haga ajustes de entrada ya que puede marcar los paquetes que vienen de cualquier sitio o tratar las interfaces como clases para imponer límites globales. También puede hacer muchas otras cosas como poner el tráfico http en una qdisc, poner las peticiones de conexiones nuevas en una qdisc, ...
La primera cosa que me viene a la mente es usar el ajuste de entrada para darnos a nosotros mismos un ancho de banda garantizado. ;) La configuración es igual que la de cualquier otra interfaz:
tc qdisc add dev imq0 root handle 1: htb default 20 tc class add dev imq0 parent 1: classid 1:1 htb rate 2mbit burst 15k tc class add dev imq0 parent 1:1 classid 1:10 htb rate 1mbit tc class add dev imq0 parent 1:1 classid 1:20 htb rate 1mbit tc qdisc add dev imq0 parent 1:10 handle 10: pfifo tc qdisc add dev imq0 parent 1:20 handle 20: sfq tc filter add dev imq0 parent 10:0 protocol ip prio 1 u32 match \ ip dst 10.0.0.230/32 flowid 1:10En este ejemplo, se usa u32 para la clasificación. Otros clasificadores podrían funcionar como queremos. Lo siguiente es escoger y marcar el tráfico para encolarlo en imq0.
iptables -t mangle -A PREROUTING -i eth0 -j IMQ --todev 0 ip link set imq0 up
Los objetivos IMQ de iptables son válidos en las cadenas PREROUTING y POSTROUTING de la tabla mangle. Su sintaxis es
IMQ [ --todev n ] n : número del dispositivo imqTambién se proporciona un objetivo para ip6tables.
Tenga en cuenta que el tráfico no se encola cuando coincide con el objetivo, sino después. La localización exacta del punto donde el tráfico entra en el dispositivo imq depende de la dirección del tráfico (entrada/salida). Estas son las ranuras predefinidas de netfilter que usa iptables:
enum nf_ip_hook_priorities {
NF_IP_PRI_FIRST = INT_MIN,
NF_IP_PRI_CONNTRACK = -200,
NF_IP_PRI_MANGLE = -150,
NF_IP_PRI_NAT_DST = -100,
NF_IP_PRI_FILTER = 0,
NF_IP_PRI_NAT_SRC = 100,
NF_IP_PRI_LAST = INT_MAX,
};
Para el tráfico de entrada, imp se registra con prioridad NF_IP_PRI_MANGLE + 1, lo que significa que los paquetes entran en el dispositivo imq justo después de que se haya pasado de la cadena PREROUTING de mangle.
Para la salida imq usa NF_IP_PRI_LAST, que obedece al hecho de que los paquetes eliminados por la tabla filter no deben ocupar ancho de banda.
Encontrará parches e información en el sitio de imq.