/ Linux Reviews / Networking / Kształtowanie Ruchu i Zaawansowany Routing HOWTO - en - pl


9.7. Pośrednie urządzenie kolejkujące (ang. "The Intermediate queueing device", IMQ

Pośrednie urządzenie kolejkujące nie jest qdisc, ale jego użycie jest ściśle związane z dyscyplinami kolejkowania. W Linuksie, qdisc doczepiane są do urządzeń sieciowych i wszystko co ma zostać skolejkowane do urządzenia jest najpierw kolejkowane do qdisc. Po zapoznaniu się z tą koncepcją, widać dwa ograniczenia:

1. Możliwe jest kształtowanie tylko ruchu wychodzącego (istnieje qdisc dla ruchu przychodzącego ale jej możliwości są bardzo ograniczone w porównaniu do zwykłych dyscyplin kolejkowania z klasami).

2. Dana qdisc widzi ruch tylko na pojedyńczym interfejsie, nie można nakładać globalnych ograniczeń.

IMQ umożliwia rozwiązanie tych dwóch problemów. Krótko mówiąc, możesz włożyć cokolwiek tylko chcesz do qdisc. Specjalnie oznaczone pakiety są przechwytywane w wywołaniach netfiltera NF_IP_PRE_ROUTING oraz NF_IP_POST_ROUTING i przechodzą przez qdisc doczepioną do urządzenia IMQ. Do oznaczania pakietów używa się celu (ang. "target") w iptables.

Umożliwia to kształtowanie wchodzącego ruchu, ponieważ możesz kolejno oznaczać nadchodzące pakiety i/lub traktować interfejsy jak klasy by ustalać limity globalne. Można również robić wiele innych rzeczy, takich jak wkładanie tylko ruchu HTTP do qdisc, tylko nowych połączeń itp.

9.7.1. Przykładowa konfiguracja

Pierwszą rzeczą która może przyjść do głowy jest użycie kształtowania ruchu wchodzącego by dać sobie gwarantowane pasmo ;) Konfiguracja odbywa się dokładnie tak jak dowolnego innego interfejsu:

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:10
W tym przykładzie u32 został użyty do sklasyfikowania ruchu. Inne klasyfikatory powinny również działać tak jak je opisano. Następnie musimy wybrać i oznaczyć ruch, który ma trafić do urządzenia `imq0'.
iptables -t mangle -A PREROUTING -i eth0 -j IMQ --todev 0

ip link set imq0 up

Cel IMQ w iptables jest prawidłowy tylko w łańcuchach PREROUTING i POSTROUTING tabeli przekształceń (ang. "mangle"). Jego składnia wygląda następująco:

IMQ [ --todev n ]       n : numer urządzenia IMQ
Dostępny jest również cel dla wersji iptables dla IPv6 (ip6tables).

Zwróć uwagę na to, że ruch nie jest kolejkowany gdy cel zostaje trafiony, ale dopiero później. Dokładne miejsce, w którym ruch wchodzi do urządzenia IMQ zależy od kierunku ruchu (wejściowy/wyjściowy). Poniżej predefiniowane stałe używane przez 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,
};

Dla ruchu przychodzącego, IMQ rejestruje się z priorytetem NF_IP_PRI_MANGLE + 1, co oznacza że pakiety trafiają do niej zaraz po przejściu łańcucha PREROUTING w tablicy przekształceń.

Dla ruchu wychodzącego, IMQ używa NF_IP_PRI_LAST, który bierze pod uwagę fakt, że pakiety odrzucone przez tablice filtrowania nie zajmują dostępnego pasma.

Łaty i trochę informacji znaleźć można pod tym adresem.


/ Linux Reviews / Networking / Kształtowanie Ruchu i Zaawansowany Routing HOWTO