PQ, czyli Priority Queueing (kolejki z priorytetami) używa czterech kolejek i klasyfikowania ruchu do jednej z nich. Kolejki te nazywają się od posiadającej największy priorytet high, przez medium, normal do low.
Cechą charakterystyczną PQ jest fakt, że dopóki jakiekolwiek pakiety znajdują się w kolejce o wyższym priorytecie, router nie wyśle pakietów oczekujących w kolejkach o priorytecie niższym. Łatwo doprowadzić w ten sposób do "umierania" transmisji, klasyfikowanych do kolejek o niższych priorytetach.
Załóżmy, że chcemy prioretyzować cały ruch SSH, ICMP oraz Telnet. W kolejnej, mniej ważnej kolejce powinien znaleźć się ruch DNS, ISAKMP (500/udp) oraz ESP (protokół 50). Do trzeciej kolejki wrzucimy ruch WWW, SMTP, POP3, IMAP4 a cała reszta ruchu trafi do domyślnej, czwartej, najmniej uprzywilejowanej kolejki:
! interface serial 0.99 priority-group 10 ! do interfejsu szeregowego przypisujemy grupę priorytetów o ! identyfikatorze 10 ! ! konfigurujemy wspomnianą grupę priorytetów: priority-list 10 protocol ip high list 100 priority-list 10 protocol ip medium list 110 priority-list 10 protocol ip normal list 120 priority-list 10 default low ! ! access lista 100 - wybiera ruch SSH, ICMP oraz Telnet: ip access-list extended 100 permit tcp any any eq 22 permit tcp any any eq 23 permit icmp any any ! ! access lista 110 - wybiera ruch DNS, ISAKMP i ESP: ip access-list extended 110 permit udp any any eq 53 permit udp any any eq 500 permit esp any any ! ! access lista 120 - wybiera ruch WWW, SMTP, POP3, IMAP4: ip access-list extended 120 permit tcp any any eq 25 permit tcp any any eq 80 permit tcp any any eq 110 permit tcp any any eq 143
CQ, czyli Custom Queueing (kolejkowanie konfigurowalne) jest mechanizmem podobnym do PQ, ale możemy po pierwsze używać do 16 kolejek, a po drugie opróżniane one są na zasadzie round-robin: najpierw X bajtów z kolejki pierwszej, później Y bajtów z kolejki drugiej i tak dla wszystkich kolejek i od początku. Taka konstrukcja zapobiega wymieraniu potoków mniej uprzywilejowanych.
Poniżej analogiczna konfiguracja, jak w przykładzie z PQ:
! interface serial 0.99 custom-queue-list 10 ! ! konfigurujemy kolejkowanie, tworząc cztery kolejki: 1, 2, 3 i 4 queue-list 10 protocol ip 1 list 100 queue-list 10 protocol ip 2 list 110 queue-list 10 protocol ip 3 list 120 queue-list 10 default 4 ! ! dla każdej z kolejek, określamy limity ruchowe w bajtach: queue-list 1 queue 1 byte-count 3000 queue-list 1 queue 2 byte-count 2000 queue-list 1 queue 3 byte-count 1000 queue-list 1 queue 4 byte-count 500 ! ! access lista 100 - wybiera ruch SSH, ICMP oraz Telnet: ip access-list extended 100 permit tcp any any eq 22 permit tcp any any eq 23 permit icmp any any ! ! access lista 110 - wybiera ruch DNS, ISAKMP i ESP: ip access-list extended 110 permit udp any any eq 53 permit udp any any eq 500 permit esp any any ! ! access lista 120 - wybiera ruch WWW, SMTP, POP3, IMAP4: ip access-list extended 120 permit tcp any any eq 25 permit tcp any any eq 80 permit tcp any any eq 110 permit tcp any any eq 143
WFQ, czyli Weighted Fair Queueing (ważone, sprawiedliwe kolejkowanie) jest domyślnym mechanizmem kolejkowania, włączonym na interfejsach szeregowych o przepływności do 2Mbit/s. WFQ klasyfikuje ruch w potoki, przy czym do jednego potoku należą pakiety o takim samym źródłowym i docelowym adresie IP, portach TCP/UDP, należące do tego samego protokołu i posiadające tą samą wartość pola ToS (Type of Service).
Jeśli na interfejsie wyłączono WFQ, można je włączyć wydając polecenie `fair-queue'.
Cisco oferuje mechanizm CAR (Commited Access Rate) oraz GTS (Generic Traffic Shape). O ile CAR po prostu odrzuca pakiety przekraczające zadane wartości (i może działać zarówno dla ruchu wchodzącego jak i wychodzącego), GTS stara się delikatniej wpływać na przebieg transmisji, manewrując opóźnieniami pakietów, gdy pasmo zajmowane przez wskazany typ ruchu zbliża się do założonych ograniczeń. GTS działa tylko dla ruchu wychodzącego z routera.
Przycięcie ruchu FTP do 256kbit/s przez CAR:
interface Ethernet0 rate-limit input access-group 100 256000 8192 8192 conform-action transmit exceed-action drop rate-limit output access-group 100 256000 8192 8192 conform-action transmit exceed-action drop ! access-list 100 permit tcp any any eq ftp access-list 100 permit tcp any eq ftp any access-list 100 permit tcp any any eq ftp-data access-list 100 permit tcp any eq ftp-data any
Przycięcie ruchu FTP do 256kbit/s przez GTS:
interface Ethernet0 traffic-shape group 100 256000 8192 8192 ! access-list 100 permit tcp any any eq ftp access-list 100 permit tcp any any eq ftp-data
CBWFQ, czyli Class-Based WFQ (WFQ oparte o klasy), jest potężnym mechanizmem, umożliwiającym łączenie wielu różnych innych mechanizmów w jedną całość na interfejsie routera.
Aby wykorzystać CBWFQ, należy najpierw wskazać, czyli inaczej sklasyfikować ruch, który będzie traktowany w różny sposób - innymi słowy, podzielić go na klasy. Cisco IOS daje wiele metod klasyfikacji - możemy wskazywać ogólnie protokoły (np. IP, EIGRP, ESP), dowolny ruch pasujący do jakiegoś rodzaju ACLek (np. tylko ruch do konkretnego hosta na port 80/tcp itp.), a także z wykorzystaniem mechanizmu NBAR, zagłębiać się w konstrukcję pakietu i np. wykrywać sieci P2P.
W poniższym przykładzie wyjdziemy z następujących założeń:
Posiadamy symetryczne łącze 2Mbit/s
Przede wszystkim interesuje nas ruch z wewnętrznych serwerów poczty i WWW - chcemy, by miały w ruchu wychodzącym gwarantowane do 1Mbit/s ruchu, przy czym jeśli "rozpędzą" się powyżej 1,2Mbit/s zaczynamy ten ruch shape'ować by nie wysycił nam zupełnie pasma w ruchu wychodzącym;
Aplikacjom typu SSH czy Telnet dajemy osobne 256kbit/s starając się, by pakiety należące do tego ruchu utrzymywały możliwie małe opóźnienia. Podobnie jak dla powyższego ruchu, powyżej 384kbit/s zaczynamy ten ruch shape'ować.
Statycznie przycinamy cały ruch UDP i ICMP do po 64kbit/s zarówno przychodzący jak i wychodzący. Nie spodziewamy się otrzymywać więcej ruchu tego typu w jednostce czasu, a na pewno nie będziemy również więcej generować (to w ograniczonym stopniu powstrzyma też trojany, które mogą zainstalować się na stacjach naszych użytkowników i próbować przeprowadzać ataki DDoS na innych użytkowników Internetu)
Przycinamy wszelakie protokoły P2P które jesteśmy w stanie rozpoznać do minimalnej wartości - 16kbit/s. To nie zablokuje w całości ruchu i nie zagwarantuje, że ruch P2P nie wysyci naszego pasma od ISP do naszego routera (pojedyńczy request z aplikacji P2P potrafi wygenerować wiele jednoczesnych strumieni które są w stanie zapchać naprawdę wielkie łącza), ale będzie naszym sposobem na kontrolę tego, co kontrolować trudno.
Całą resztę ruchu kolejkujemy wg WFQ w 64 osobne potoki.
class-map match-any cm_serwery match access-group name acl_serwery ! klasa cm_serwery wybiera tylko ruch pasujący do ACL acl_serwery class-map match-any cm_ruch_gwarantowany match access-group name acl_ruch_gwarantowany ! klasa cm_ruch_gwarantowany wybiera tylko ruch pasujący do ACL ! acl_ruch_gwarantowany class-map match-any cm_udp_icmp match access-group name acl_udp_icmp ! klasa cm_udp_icmp wybiera tylko ruch pasujący do ACL acl_udp_icmp class-map match-any P2Ptraffic match protocol kazaa2 match protocol http url "\.hash=*" match protocol gnutella match protocol napster match protocol fasttrack match protocol bittorrent ! wykorzystujemy tutaj funkcjonalność NBAR; umożliwia ona routerowi ! zaglądanie do wnętrza przesyłanych danych i analizę ich ! przynależności do różnego rodzaju aplikacji ! policy-map pm_lan2internet class cm_serwery bandwidth 1016 ! ruch zaliczony do klasy cm_serwery ma gwarantowane ! pasmo do 1Mbit/s, przy czym shape average 1256000 32768 32768 ! jeśli zajmie 1,25Mbit/s zaczyna być shape'owany class cm_ruch_gwarantowany bandwidth 256 ! ruch zaliczony do klasy cm_ruch_gwarantowany ma gwarantowane ! pasmo do 256kbit/s, przy czym shape average 384000 32768 32768 ! jeśli zajmie 384kbit/s zaczyna być shape'owany class cm_udp_icmp police 256000 conform-action transmit exceed-action drop ! ruch zaliczony do klasy cm_udp_icmp jest odrzucany jeśli ! przekracza 256kbit/s class P2Ptraffic police 16384 conform-action transmit exceed-action drop ! ruch zaliczony do klasy P2Ptraffic powinien zostać ! przycięty do 16kbit/s, z uwagi na mechanizmy działania ! aplikacji tego typu trudno spodziewać się jednak że ! to ograniczenie będzie działało zawsze idealnie do ! zadanej przepustowości class class-default fair-queue 64 ! pozostały ruch, który nie trafił do żadnej z klas powyżej ! rozkładany jest do 64 niezależnych kolejek ! ip access-list extended acl_serwery permit tcp host 192.168.10.10 eq 25 any permit udp host 192.168.10.10 eq 53 any permit tcp host 192.168.10.11 eq 80 any permit tcp host 192.168.10.10 eq 110 any permit tcp host 192.168.10.10 eq 143 any ! ip access-list extended acl_ruch_gwarantowany permit tcp any any eq 22 permit tcp any any eq 23 ! ip access-list extended acl_udp_icmp permit icmp any any permit udp any any
Oczywiście, tak stworzoną konfigurację należy przypisać jeszcze do interfejsu:
! interface Serial 0.99 description Polaczenie WAN service-policy output pm_lan2internet ! interface FastEthernet 0 description Polaczenie LAN ip nbar protocol-discovery