UWAGA
Dzielenie łącza to uproszczona nazwa określająca różne metody regulowania szybkości pobierania danych z internetu przez użytkowików. Dzielenie łącza nie ma nic wspólnego z udostępnianiem łącza czyli z umożliwieniem użytkownikom wewnątrz sieci łączenia się z internetem za pośrednictwem serwera. Udostępnianie jest osobnym zagadnieniem i nie jest omówione na tej stronie (szukaj na wyszukiwarkach hasła: maskarada, masquerade, nat, firewall)
historia:
read_config.c:72: error: array type has incomplete element type make: *** [read_config.o] Error 1Poprawke zgłosił Marek Chłopek
2005/10/29 16:12:55 Dodano indywidualne statyczne klasy (minus przy interfejsie) 2005/10/29 17:04:52 Aktualizacja kto-daemon dla wspolpracy z static_dnload i static_upload 2005/10/18 11:13:18 Aktualizacja kto.php dla static_dnload 2005/10/18 10:04:32 Dodano parametry: static_dnload_class i static_upload_class O co chodzi z tymi statycznymi klasami? Wpisy w pliku konfiguracyjnym shaper.0.cfg: static_dnload_class=yes static_upload_class=yes spowodują, że shaper nie będzie sprawdzał kto jest aktywny w sieci - tylko od razu zakłada klasy dla każdego numeru IP (rezerwując tym samym CIR) - user może być wyłączony i nie używać netu ale jego klasa cały czas istnieje. Parametry te włączają statyczne klasy dla wszystkich userów. Indywidualnie można każdemu utworzyć taką klasę stawiając znak minus przed interfejsem (dla lokalnego interfejsu minus oznacza statyczną klasę w kierunku ściagania z internetu a dla internetowego interfejsu statyczną klasę w kierunku wysyłania do internetu) Przykładowy plik iplist.0: 192.168.1.2=-eth1 -eth0 Poprawki: Paweł Panek (Panky) Dwie definicje inter_int w konfigu powodują, że shaperd przestaje funkcjonować tak jak powinien. Złe działanie objawiało się tym, że shaperd w ogóle nie kontrolował uploadu, co dla DSLi jest zabójstwem, a po dłuższych obserwacjach okazało się, że download też nie jest kontrolowany tak jak powinien. Problem pojawia się tylko wtedy, kiedy jest włączone continuous_control oraz kiedy jest wpisany adres ip w definicji inter_int. Wyłączyłem continuous_control, zmieniłem adres ip na słowo 'auto' i wszystko zaczęło działać normalnie, ale... ja chcę mieć włączone continuous_control! Dlaczego? Bo jest fajne ;) i działa o wiele szybciej niż skasowanie i utworzenie klasy (sprawdzałem, ale o tym później), nie szarpie transferem, a poza tym nie chcę ciągle widzieć napisu "kernel: HTB init, kernel part version 3.7" na konsoli i w logach. Jeżeli chodzi o ten adres ip w definicji inter_int, to tutaj też musi być coś sknocone, ale to jest mały problem, bo jak jest ustawione 'auto', to jest dobrze, więc nie będę się tym przejmował. Problem ten rozwiązałem przez zmianę sposobu w jaki shaperd kwalifikuje klasy do skasowania. Zamieniłem również wyliczanie czasu w ten sposób, iż shapred zwiększa delay do wartości czasu tworzenia klas + 1s w każdym cyklu aż nie wejdzie w stan równowagi. Jeżeli userów ubywa, to czas się zmniejsza o 1s na cykl. Moja uwaga - ta poprawka nie jest krytyczna do działania shaperda, więc można jej nie uwzględniać w konfiguracji. Na pewno spowoduje zwiększenie średniego obciążenia serwera jeżeli czas wykonania będzie notorycznie przekraczał czas delay. Przy moich założeniach shaperd przy dużej ilości adresów ip, będzie powtarzał swoje cykle najszybciej jak potrafi. (Co uważam, za prawidłowe, skoro czas wykonania przekracza delay). Dzięki tym eksperymentom z czasem okazało się, że przy włączonym continuous_control czasy tworzenia klas i pętli głównej są o wiele mniejsze niż przy wyłączonym continuous_control. Więc stąd wniosek, że z włączonym continuous_control shaperd działa szybciej. Dodano opcję alt_delay_handle, która po włączeniu powoduje włączenie alternatywnej obsługi czasu delay. # (EXPERIMENTAL) change incrementing of delay # if delay is too low it will be incremented to time of creating # classes + 1s. # no - keeps old handling of delay - 5*time of creating classes # default: # alt_delay_handle=no
"Od jakiegos czasu chodzil mi po glowie pomysl aby rozszerzyc funcjonalnosc ograniczania downloadu userow po przekroczeniu pewnego limitu sciagniecia. Chodzilo mi ogolnie o to aby po przekroczeniu okreslonego limitu, user nie byl przycinany do sztywnej wartosci bitrate'u, a jedynie by byl zakladany na niego jakis mniejszy priorytet, aby 'ustepowal' predkoscia innym. Ma to sens gdy na laczu siedzi jeden user, ciagnie na maxa lecz pozwalamy mu na to, dopoki nie pojawi sie ktos inny. W tym momencie jesli ten drugi user bedzie aktywnie korzystal z lacza, shaperd nie bedzie dzielil po rowno, lecz da priorytet sciagania temu uzytkownikowi bez limitow. Moja poprawka nie uwzglednia wogole nowych limitowanych CIRow i EIRow (poza globalnymi), chodzi tylko o oddawanie priorytetu sciagania innym userom. Narazie rozszerzone limity obsluguja download ale jesli uznasz ze poprawki sa ok to nie problem bedzie dorobic to dla uploadu. Funkcje wlacza nowy parametr extended_download_limits=yes. Jesli nie chcemy uzywac nowej funkcjonalnosci zostawiamy nastawione na 'no' (domyslnie jest ustawione na 'no')"Teraz opis moich modyfikacji:
Nowy shaper ma dodany parametr w pliku konfiguracyjnym: enable_eir_factor=yes włącza on inny rodzaj podziału łącza. Sytuacja hipotetyczna - mamy 10 userów - wszyscy ściągają na max w ramach swoich przydziałów szybkości (wykorzystują więcej niż 80% swoich przydziałów). Większość z userów ma ograniczoną max szybkość ściągania do 256kbit - ale 2 userów ma ustawione do 512kbit. W standardowym shaperze - w przypadku gdy łącze będzie zapchane, serwer będzie dążył do ustawienia wszystkim userom identycznych przydziałów (po równo) czyli dla łącza 2Mbit mamy taki stan końcowy: user1 ma EIR 256 -> przydział 204kbit user2 ma EIR 256 -> przydział 204kbit user3 ma EIR 256 -> przydział 204kbit user4 ma EIR 256 -> przydział 204kbit user5 ma EIR 512 -> przydział 204kbit user6 ma EIR 512 -> przydział 204kbit user7 ma EIR 256 -> przydział 204kbit user8 ma EIR 256 -> przydział 204kbit user9 ma EIR 256 -> przydział 204kbit user10 ma EIR 256 -> przydział 204kbit Jak widać - wszyscy mają po równo - ponieważ jednak dwóch userów ma max przydział do 512Kbit (bo płacą więcej) to oni są poszkodowani - powinni mieć lepiej niż reszta użytkowników. Teraz symulacja z włączoną opcją enable_eir_factor=yes user1 ma EIR 256 -> przydział 163Kbit user2 ma EIR 256 -> przydział 163Kbit user3 ma EIR 256 -> przydział 163Kbit user4 ma EIR 256 -> przydział 163Kbit user5 ma EIR 512 -> przydział 327Kbit user6 ma EIR 512 -> przydział 327Kbit user7 ma EIR 256 -> przydział 163Kbit user8 ma EIR 256 -> przydział 163Kbit user9 ma EIR 256 -> przydział 163Kbit user10 ma EIR 256 -> przydział 163Kbit I jak widać - userzy z wyższym EIR mają wiekszą szybkość od reszty. Należy pamiętać, że przy włączonej tej opcji - przyznanie jakiemukolwiek użytkownikowi max szybkości większej od innych spowoduje że w w przypadku zapchanego łącza ten użytkownik bedzie osiągał większe szybkości kosztem pozostałych użytkowników.
Na wstępie chciałbym zaznaczyć, że program ten jest w wersji beta a to znaczy, że jest niedostatecznie przetestowany i może sprawiać nijakie problemy. Należy się spodziewać, że będzie jeszcze nie raz uaktualniany.
Po włączeniu się w sieć nowego użytkownika i rozpoczęciu transmisji z internetem (lokalne połączenia nie rezerwują łącza),
daemon przydziela część łącza wynikającą z prostego podziału szybkości maksymalnej łącza przez ilość aktualnie przez nie
pracujących komputerów.
Po określonym czasie (zależnie od konfiguracji) - np. po 10 sekundach - shaperd sprawdza, czy użytkownik wykorzystał
co najmniej 50% z przydzielonego łącza. Jeśli nie wykorzystał to zostaje mu przydział zmniejszony o 25%.
Jeśli użytkownik wykorzystuje przydział w granicach 50%-75% to program niczego nie zmienia a jeśli wykorzystuje
więcej od 75% to shaperd zwiększa mu transfer o minimalny transfer - pod warunkiem, że coś jeszcze zostało do
przydzielenia. Zasada jest taka, że w pierwszej części daemon sprawdza, komu można obciąć a dopiero na samym końcu z tego
co zostanie z przydzielania szybkości dodaje tym co dużo ciągną.
Dzięki temu program zapobiega przejęciu całkowitej kontroli nad łączem przez jednego nawiedzonego maniaka programów P2P lub
idioty otwierającego kilkadziesiąt sesji WWW.
Program ten reguluje transfer przychodzący z internetu do użytkowników, transfer wychodzący od użytkowników do internetu
oraz transfer wychodzący z serwera do internetu.
Przy włączonej opcji extended_queue shaperd dodatkowo dla każdego użytkownika tworzy 4 podklasy z różnymi priorytetami.
Shaperd jest programem napisanym w języku C funkcjonalnie odpowiadającym skryptowi shaper_cbq.
Istnieje, jak na razie nie rozwiązany, bład w kernelach 2.4.x polegający na tym iż niektóre połącznia wiszą ma maskaradzie przez 5 dni pomimo tego, że komputer, dla którego je utworzono nie był od kilku dni włączony w sieć. W przypadku shaperd problem wiszących połączeń obszedłem ignorując połączenia z czasem wygaśnięcia większym niż 600 sekund).
Autor tego oprogramowania nie bierze odpowiedzialności za jakiekolwiek błedy, awarie i uszkodzenia wywołane przez działanie tego programu. Wszystko co robisz - robisz na własną odpowiedzialność.
Program ten testowany jest na systemach opartych na jądrzach: 2.4.8, 2.4.12 i 2.4.18-grsec, 2.4.20-grsec, 2.4.21, 2.4.24, 2.6.8, firewall'ach na ipchains i iptables (1.2.6a, 1.2.7a) oraz na dystrybucjach: Mandrake 8.1, Mandrake 9.1, Mandrake 10.1 - łączach: SDI, iDSL 512Kbit, iDSL 1Mbit, DSL 768Kbit, asynchroniczne 1Mbit, Polpak 1Mbit, Polpak 2Mbit.
Warunki działania
Aby wogóle dzielenie łącza pod Linuxem zaczęło działać to musi być spełnione wiele warunków:tc -d qdiscJeśli w wyniku jej działania pojawi się jakiś komunikat typu RTNETLINK error to jądro nie obsługuje CBQ (lub nie ma załadowanego modułu).
Konfiguracja
ipchains_path=/sbin/ipchains iptables_path=/sbin/iptables tc_path=/sbin/tc timeout_ipchains_22=3600 timeout_ipchains_24=7200 timeout_iptables_24=432000 timeout_global=300 start_speed=0 even_division=no continuous_control=yes squid_support=no squid_port=8080 divide_upload=yes extended_queue=no nomasq=yes check_sum_of_bandwidth=yes class_type=cbq upload_class_type=cbq check_download_factor_cnt=5 check_upload_factor_cnt=5 remove_dead_class=yes refresh_dead_fwrule=yes burst_type=maximum cburst_type=maximum htb_burst=8 htb_cburst=8 jump_type=5 nop_factor=60 add_factor=80 speed_ext=bit delay_mesg=yes mask_mesg=yes check_firewall_counters=12 debug=0 delay=10 write_delay=1 delay_pools_download=0/100,5000/75,20000/50 delay_pools_upload=0/100,5000/75,20000/50 inter_int=ppp0;8000;92000;1000;60000;auto;1 local_int=eth0;10485760;192.168.0.0/16;192.168.1.0/24;2Gdzie:
delay_pools_download=0/100,5000/75,20000/50oznaczać będzie, że po otrzymaniu przydziału user będzie miał normalny przydział szybkości (100%), po pobraniu 5MB w czasie sesji przydział zostanie zmniejszony do 75% normalnego przydziału, po pobraniu 20MB prędkość będzie zmniejszona do 50% oryginalnego przydziału szybkości.
[root@frodo root]# grep -E -v "^$|^#" /etc/shaper/iplist.0 | head -3 217.97.124.128=eth0 eth0 0 0 0 0 1 1 192.168.1.2=eth1 eth0 192.168.1.3=eth1 eth0
[root@frodo root]# iptables -L shaper0 -n --line-numbers | head -5 Chain shaper0 (1 references) num target prot opt source destination 1 RETURN all -- !192.168.1.0/24 192.168.1.2 2 RETURN all -- !192.168.1.0/24 192.168.1.3 3 RETURN all -- !192.168.1.0/24 192.168.1.4
[root@frodo root]# iptables -L shaout0 -n --line-numbers | head -5 Chain shaout0 (2 references) num target prot opt source destination 1 RETURN all -- 217.97.124.128 0.0.0.0/0 2 RETURN all -- 192.168.1.2 !192.168.1.0/24 3 RETURN all -- 192.168.1.3 !192.168.1.0/24
192.168.1.10=eth1 eth0 8 128 8 128 10485760 0 8 24 8 24Wpis ten oznacza, że użytkownik 192.168.1.10 ma szybkość 128/128Kbit i ustawiony limit ilości przesłanych danych 10GB a po jego przekroczeniu szybkość max 24/24Kbit.
192.168.1.2=-eth1 eth0
192.168.1.2=eth1 -eth0
user1 ma EIR 256 -> przydział 204kbit user2 ma EIR 256 -> przydział 204kbit user3 ma EIR 256 -> przydział 204kbit user4 ma EIR 256 -> przydział 204kbit user5 ma EIR 512 -> przydział 204kbit user6 ma EIR 512 -> przydział 204kbit user7 ma EIR 256 -> przydział 204kbit user8 ma EIR 256 -> przydział 204kbit user9 ma EIR 256 -> przydział 204kbit user10 ma EIR 256 -> przydział 204kbitJak widać - wszyscy mają po równo - ponieważ jednak dwóch userów ma max przydział do 512Kbit (bo płacą więcej) to oni są poszkodowani - powinni mieć lepiej niż reszta użytkowników.
user1 ma EIR 256 -> przydział 163Kbit user2 ma EIR 256 -> przydział 163Kbit user3 ma EIR 256 -> przydział 163Kbit user4 ma EIR 256 -> przydział 163Kbit user5 ma EIR 512 -> przydział 327Kbit user6 ma EIR 512 -> przydział 327Kbit user7 ma EIR 256 -> przydział 163Kbit user8 ma EIR 256 -> przydział 163Kbit user9 ma EIR 256 -> przydział 163Kbit user10 ma EIR 256 -> przydział 163KbitI jak widać - userzy z wyższym EIR mają wiekszą szybkość od reszty. Należy pamiętać, że przy włączonej tej opcji - przyznanie jakiemukolwiek użytkownikowi max szybkości większej od innych spowoduje że w w przypadku zapchanego łącza ten użytkownik bedzie osiągał większe szybkości kosztem pozostałych użytkowników.
divide_upload=yes class_type=cbq upload_class_type=cbq jump_type=5 speed_ext=Kbit delay=10 write_delay=0 inter_int=ppp0;16;900;1;300;auto;1 local_int=eth0;10240;192.168.0.0/16;192.168.1.0/24;2 local_int=eth1;102400;192.168.0.0/16;192.168.2.0/24;3
divide_upload=yes class_type=cbq upload_class_type=cbq jump_type=5 speed_ext=Kbit debug=0 delay=10 write_delay=0 inter_int=eth0;8;440;1;100;auto;1 inter_int=ppp0;8;92;1;60;auto;2 local_int=eth1;10240;192.168.0.0/16;192.168.1.0/24;3 local_int=eth2;102400;192.168.0.0/16;192.168.2.0/24;4 local_int=ppp2;768;192.168.3.0/24;192.168.3.0/24;5
imq_support=yesWspółpraca shapera z imq polega na podmianie interfejsów zdefiniowanych w konfiguracji w sekcji local_int i inter_int na interfejsy imq0 i imq1. Interfejsy wirtualne imq używane są tylko do tworzenia kolejek regulujących szybkość więc po włączeniu imq kontrolę działania shapera przeprowadzimy komendą:
tc -s class show dev imq0W pliku iplist.X nie wolno wpisywać interfejsów wirtualnych - muszą być tam wpisane rzeczywiste interfejsy!
class_type=hwrr upload_class_type=hwrrKlasa cwrr to połączenie CBQ i WRR.
tc -s class show dev eth1Zobaczymy coś mniej więcej takiego:
class htb 2:1 root prio 1 rate 102400Kbit ceil 102400Kbit burst 14387b cburst 14387b Sent 0 bytes 0 pkts (dropped 0, overlimits 0) lended: 0 borrowed: 0 giants: 0 tokens: 1152 ctokens: 1152 class htb 2:2 root prio 1 rate 102400Kbit ceil 102400Kbit burst 14387b cburst 14387b Sent 1403692 bytes 25081 pkts (dropped 0, overlimits 0) rate 24bit lended: 25081 borrowed: 0 giants: 0 tokens: 1146 ctokens: 1146 class htb 2:3 root leaf 2000: prio 1 rate 4096Kbit ceil 4096Kbit burst 2111b cburst 2111b Sent 2596247541 bytes 2888194 pkts (dropped 0, overlimits 0) rate 97384bit 136pps lended: 2888194 borrowed: 0 giants: 0 tokens: 1280 ctokens: 1280 class wrr 2000:1 parent 2000: (address: 192.168.1.223) (total weight: 0.0999998) (current position: 1) (counters: 5 2951496119 : 2147483648 2888188) Pars 1: (weight 0.999998) (decr: 4.48261e-10) (incr: 0.00133333) (min: 0.2) (max: 1) Pars 2: (weight 0.1) (decr: 0) (incr: 0) (min: 0.01) (max: 1) class wrr 2000:2 parent 2000: (address: 192.168.1.78) (total weight: 0.1) (current position: 0) (counters: 0 0 : 0 0) Pars 1: (weight 1) (decr: 4.48261e-10) (incr: 0.00133333) (min: 0.2) (max: 1) Pars 2: (weight 0.1) (decr: 0) (incr: 0) (min: 0.01) (max: 1) class wrr 2000:3 parent 2000: (unused) class wrr 2000:4 parent 2000: (unused) class wrr 2000:5 parent 2000: (unused)Jeśli nie zobaczymy ani jednej linijki zawierającej wrr to znaczy, że nasz system nie współpracuje z WRR i nic nam nie da używanie tej opcji.
check_download_factor=50 check_upload_factor=50 check_download_factor_cnt=2 check_upload_factor_cnt=2 ban_user=yes max_ban_download=12 max_ban_upload=12 remove_dead_class=yes refresh_dead_fwrule=yes pos_diff=1 divide_upload=yes # UWAGA! opcja extended_queue musi byc wylaczona dla imq extended_queue=no class_type=shtb upload_class_type=shtb # obowiazkowo musi byc wkompilowany w kernel i wlaczony imq imq_support=yes ceil_download=0 ceil_upload=0 speed_ext=Kbit jump_type=10 delay_mesg=no mask_mesg=yes write_delay=1 write_last_rate=1 last_rate_perm=644 write_type=0 inter_int=eth0;8;1024;8;128;auto;1 local_int=eth1;102400;192.168.1.0/24;192.168.1.0/24;2 local_int=ppp+;102400;10.1.1.0/24;10.1.1.0/24;3zalozenia:
192.168.1.2=eth1 eth0 192.168.1.3=eth1 eth0 8 128 8 32 10.1.1.2=ppp+ eth0 10.1.1.3=ppp+ eth0userzy 192.168.1.X sa podpieci standardowo bez pppoe (czyli np korzystaja z dhcp)
iptables -t mangle -I PREROUTING -i eth1 -j IMQ --todev 1 iptables -t mangle -I PREROUTING -i eth1 -j IMQ --todev 0 iptables -t mangle -I PREROUTING -i ppp+ -j IMQ --todev 1 iptables -t mangle -I PREROUTING -i ppp+ -j IMQ --todev 0 iptables -t mangle -I POSTROUTING -o eth1 -j IMQ --todev 0 iptables -t mangle -I POSTROUTING -o ppp+ -j IMQ --todev 0Mozna sobie te linijki dopisac do firewall'a.
0 0 1 * * root nice -n 19 killall -USR1 shaperdZgodnie z tym zapisem limity będą kasowane o godzinie 00:00 pierwszego dnia każdego miesiąca.
default_download_limit=0 default_upload_limit=0 default_download_hispeed=0 default_upload_hispeed=0
default_download_limit=102400 default_upload_limit=102400 default_download_hispeed=0 default_upload_hispeed=0
default_download_limit=102400 default_upload_limit=102400 default_download_hispeed=32 default_upload_hispeed=16
default_download_limit=0 default_upload_limit=51200 default_download_hispeed=0 default_upload_hispeed=8A ponieważ administrator nie może sobie ograniczać dostępu do internetu to robimy odpowiedni wpis w pliku /etc/shaper/iplist.X
192.168.1.2=eth1 eth0 0 0 0 0 1 1Wpis oznacza, że lospeed i hispeed dla ściągania i wysyłania bierzemy globalne (z definicji inter_int w pliku /etc/shaper/shaper.X.cfg) a limit ściągania i wysyłania wyłączamy (wartość 1 dla wielkości limitu ściągania i wysyłania oznacza wyłączenie, 0 oznacza wartość globalną braną z pliku /etc/shaper/shaper.X.cfg)
192.168.1.3=eth1 eth0 8 128 4 64Ponieważ mamy ustawione wartości globalne dla limitów to wpis ten można zastąpić w celach edukacyjnych wpisem równoważnym:
192.168.1.3=eth1 eth0 8 128 4 64 0 51200 0 0 4 8I jak widać - limit ściągania wynosi 0 - a wartość globalna tego limitu również wynosi 0 więc limit ściągania jest wyłączony. Limit wysyłania wynosi 50Mbajtów. Prędkość ściagania lospeed (CIR) jest domyślna jak również hispeed (EIR) ale w tym przypadku nie ma to znaczenia (ale wpisane cyfry musi być bo inaczej składnia pliku konfiguracyjnego będzie nieprawidłowa). Prędkość wysyłania lospeed po przekroczeniu limitu jest równa 4Kbit a hispeed po przekroczeniu limitu wynosi 8kbit
192.168.1.2=eth1 eth0 8 64 4 32 409600 102400 8 32 4 16
192.168.1.2=eth1 eth0 8 64 4 32 1 102400 0 0 4 16
default_download_limit=409600 default_upload_limit=102400 default_download_hispeed=0 default_upload_hispeed=0Po takim zapisie poniższy wpis w pliku /etc/shaper/iplist.0:
192.168.1.2=eth1 eth0 8 64 4 32oznacza, że user po przekroczeniu domyślnego limitu ściągania 400MB (brak wpisanej cyfry oznacza wpisanie zera) będzie miał limit szybkości 8 (CIR) i 32 (EIR) w kierunku ściagania (domyślny EIR po przekroczeniu limitu jest dzielony przez 2). Po przekroczeniu 100MB w kierunku wysyłania limit szybkości wysyłania wyniesie 4 (CIR) i 16 (EIR). Wpis taki jest więc równoważny pełnemu wpisowi:
192.168.1.2=eth1 eth0 8 64 4 32 409200 102400 8 32 4 16
cd /usr/src/shaper makelub dla wersji starszych niż 2.2.2
gcc /usr/src/shaperd/shaperd.c -o /sbin/shaperd
192.168.1.2=eth0 ppp0 192.168.1.3=eth0 ppp0 192.168.1.4=eth0 ppp0 8000 16000 1000 16000 192.168.1.5=eth0 ppp0 192.168.2.2=eth1 ppp0 192.168.2.3=eth1 ppp0 192.168.2.4=eth1 ppp1 192.168.2.5=eth1 ppp1Wprowadziłem dodatkowo możliwość ustawiania indywidualnych limitów dla poszczególnych numerów IP. W powyższym przykładzie dla numeru IP 192.168.1.4 ustawiłem następujące widełki dla ściągania (download): 8000 (1KB - minimum gwarantowane) i 16000 (2KB - maksymalna możliwa przydzielona szybkość) oraz dla wysyłania (upload): 8000 (1KB - minimum gwarantowane) i 16000 (2KB - maksymalna możliwa do osiągnięcia prędkość wysyłania). Pamiętaj, że wartości te są podawane w jednostce szybkości takiej samej jak ustawiona jednostka w pliku shaper.cfg w parametrze speed_ext. W przypadku braku wpisów shaperd przyjmuje dla każdego numeru IP wartości ustawione globalnie w pliku shaper.X.cfg.
192.168.1.2=eth0 ppp0 192.168.1.3=eth0 ppp0 # numery 192.168.1.4 i 192.168.1.5 mają jeden wspólny przydział łącza 192.168.1.4/31=eth0 ppp0 192.168.2.2=eth1 ppp0 192.168.2.3=eth1 ppp0 192.168.2.4=eth1 ppp1 192.168.2.5=eth1 ppp1Co spowoduje, że numery IP od 192.168.1.4-192.168.1.5 będą traktowane jako jeden i otrzymają wspólnie widełki.
192.168.1.0/24=eth0 ppp0 192.168.2.0/24=eth1 ppp0Jest to podział między dwoma interfejsami. Przy włączonej opcji even_division=1 możemy zaczynać działalność providerską :)
lospeed = hispeed / liczba_IPgdzie:
00 00 * * * root /etc/init.d/shaperd stop;sleep 5;/sbin/shaperd -config=0 00 15 * * * root /etc/init.d/shaperd stop;sleep 5;/sbin/shaperd -config=1Co spowoduje, że shaperd będzie używał konfiguracji 0 w godzinach od 00:00-15:00 a od 15:00-00:00 konfiguracji 1.
killall -USR1 shaperd
killall -USR2 shaperdFormat pliku /var/shaper/diff.X jest identyczny jak format pliku ze stanem liczników /var/shaper/last.X Po otrzymaniu sygnału SIGUSR2 shaperd odczytuje zawartość tego pliku i dla każdego numeru IP który będzie w tym pliku wprowadza poprawki odejmując od odpowiednich liczników w pliku /var/shaper/last.X wartości znajdujące się na tych samych pozycjach w pliku /var/shaper/diff.X Przykład - wyzerowanie liczników pojedyńczego użytkownika: Przykładowa zawartość pliku /var/shaper/last.0 (fragment):
192.168.1.17/32 0 0 19619239 376089797 2449730 38422314 192.168.1.18/32 0 0 522872 50936564 513868 6156332 192.168.1.10/32 0 0 4306649848 68952545 3879551339 14294842 192.168.1.13/32 0 0 0 0 0 0Chcemy wyzerować wszystkie liczniki użytkownika o IP 192.168.1.10 - tworzymy plik /var/shaper/diff.0 o zawartości
192.168.1.10/32 0 0 4306649848 68952545 3879551339 14294842Liczniki się wyzerują po otrzymaniu sygnału SIGUSR2 ponieważ od aktualnej wartości odpowiedniego licznika zostanie odjęta odpowiednia liczba z pliku /var/shaper/diff.0 Nic nie stoi na przeszkodzie również zwiększyć komuś stan licznika - wystarczy wpisać w pliku /var/shaper/diff.0 wartości ujemne:
192.168.1.10/32 0 0 -1000000 0 0 0Wyjątkiem jest tutaj ustawianie/kasowanie dwóch pierwszych cyfr po numerze IP (są to znaczniki przekroczenia limitu ilości ściągniętych danych i ilości wysłanych danych) - znaczniki te kasuje się wpisując wartość dla nich 0 a ustawia się wpisując wartość 1. Przykład: plik /var/shaper/last.0 (fragment):
192.168.1.17/32 0 0 19619239 376089797 2449730 38422314 192.168.1.18/32 0 0 522872 50936564 513868 6156332 192.168.1.10/32 1 1 4306649848 68952545 3879551339 14294842Aby skasować znaczniki przekroczenia limitu wystarczy wpisać w pliku /var/shaper/diff.0 wartości:
192.168.1.10/32 0 0 0 0 0 0Zwracam uwagę, że zostaną skasowane tylko znaczniki a liczniki nie - więc jeśli użytkownik nadal w konfiguracji ma wpisane te same limity ilości przesłanychdanych to ponownie za moment będzie miał te znaczniki ustawione (należy więc pamiętać przy zerowaniu znaczników przekroczenia limitów albo o zmniejszeniu liczników albo o zwiększeniu w pliku konfiguracyjnym limitów dla tego użytkownika (i przeładowaniu konfiguracji!))
killall -HUP shaperdJako eksperyment należy potraktować możliwość dodania do konfiguracji pracującego shapera nowo dopisanego użytkownika w pliku /etc/shaper/iplist.X. Po wysłaniu sygnału SIGHUP shaperd sprawdza w pliku /etc/shaper/iplist.X czy nie pojawił się jakiś nowy wpis. W optymistycznej wersji - wpis pojawi się na samym końcu pliku - wtedy shaper utworzy na firewallu regułki dla tego użytkownika i problemu nie będzie. W innym przypadku - dodania użytkownika ale gdzieś w środek pliku - shaper dopisze dla tego użytkownika regułki na firewallu na pozycji w jakiej ten użytkownik dopisany - a wszystkie wpisy znajdujące się "poniżej" tego wpisu będą kasowane z firewalla i tworzone od nowa z nowymi pozycjami (co zajmie już trochę czasu) - dlatego należy tego unikać. Najgorszym scenariuszem jest usunięcie jakiegoś wpisu z pliku /etc/shaper/iplist.X. Shaper jak na razie nieszczególnie sobie z tym radzi - dlatego po usunięciu jakiegoś użytkownika z konfiguracji shapera zalecam kompletny restart shapera.
tc -s class show dev eth0możemy zobaczyć miedzy innymi klasę dla tego numeru IP (w przykładzie używana klasa HTB):
class htb 2:5 parent 2:1 prio 3 rate 214Kbit ceil 214Kbit burst 27391b cburst 1872b Sent 27025335 bytes 34960 pkts (dropped 0, overlimits 0) rate 21702bps 28pps lended: 0 borrowed: 0 giants: 0 injects: 0 tokens: 778767 ctokens: 15581A dla upload:
tc -s class show dev eth0zobaczymy coś takiego (w przykładzie używana klasa CBQ):
class cbq 1:5 parent 1:1 rate 14Kbit (bounded) prio 5 Sent 554775 bytes 4674 pkts (dropped 0, overlimits 0) borrowed 30 overactions 0 avgidle 379301 undertime 0Dodatkowe 4 podklasy do kolejkowania mają numery tworzone zgodnie z zasadą X:Y gdzie X to identyfikator klasy, Y = (4*(A+4))+PRIO
# download # najwyzszy priorytet download - klasa 2:120 iptables -t mangle -A FORWARD -d 192.168.1.2 -m tos --tos 0x10 -j MARK --set-mark 2120 # sredni priorytet download - klasa 2:121 iptables -t mangle -A FORWARD -d 192.168.1.2 -m tos --tos 0x08 -j MARK --set-mark 2121 # niski priorytet download - 2:122 iptables -t mangle -A FORWARD -d 192.168.1.2 -m tos --tos 0x04 -j MARK --set-mark 2122 # Pozostały ruch z polem tos innym niż podane trafi do klasy 2:123.Teraz przykład skryptu do tworzenia regułek dla firewalla na podstawie wpisów w pliku /etc/shaper/queue_download_high.0, które ustawią odpowiednie TOS dla odpowiedniego ruchu. Analogicznie do tego przykładu należy sobie dorobić pętle dla pozostałych plików konfiguracyjnych.
#!/bin/sh extqueue=`grep extended_queue=yes /etc/shaper/shaper.0.cfg | wc -l` IFS=';' if [ $extqueue -eq 1 ];then grep -E -v "^#|^$" /etc/shaper/queue_download_high.0 | while read prot src sport dst dport do if [ "$prot" == "*" ];then prot="!icmp" fi if [ "$src" == "*" ];then src="0/0" fi if [ "$dst" == "*" ];then dst="0/0" fi if [ "$sport" == "*" ];then sport="0:65535" fi if [ "$dport" == "*" ];then dport="0:65535" fi if [ "$prot" != "icmp" ];then iptables -t mangle -I FORWARD -p $prot -s $src --sport $sport -d $dst --dport $dport -j TOS --set-tos 0x10 else iptables -t mangle -I FORWARD -p $prot -s $src -d $dst -j TOS --set-tos 0x10 fi done fiZnacznik (MARK) wyliczamy ze wzoru:
M = (1000 * X) + PRIO + (4 * (A + 4))gdzie: M - znacznik, X - identyfikator klasy (w tym przypadku 2 - dla local_int), A - pozycja numery IP w pliku iplist.X
tc -s filter show dev eth1 | grep 848i dostajemy w wyniku:
filter parent 2: protocol ip pref 10 fw handle 0x848 classid 2:120Czyli ruch zaznaczony przez tą regułkę trafi do klasy 2:120. Teraz możemy sobie obserwować ruch wpadający do tej klasy:
watch tc -s class show dev eth1i jeśli tylko połączymy się pod ssh lub telnetem z jakimś zewnętrznym serwerem to zobaczymy:
class htb 2:120 parent 2:5 leaf a688: prio 0 rate 273Kbit ceil 273Kbit burst 15Kb cburst 1948b Sent 10644 bytes 133 pkts (dropped 0, overlimits 0) rate 11bps lended: 133 borrowed: 0 giants: 0 injects: 0 tokens: 315623 ctokens: 39721I jak widać 10644 bajty przeszły przez klasę 2:120
# upload # najnizszy priorytet upload - klasa 1:123 iptables -t mangle -A FORWARD -s 192.168.1.2 -d ! 192.168.0.0/16 -j MARK --set-mark 1123 # najwyzszy priorytet upload - klasa 1:120 iptables -t mangle -A FORWARD -s 192.168.1.2 -d ! 192.168.0.0/16 -m tos --tos 0x10 -j MARK --set-mark 1120 # sredni priorytet upload - klasa 1:121 iptables -t mangle -A FORWARD -s 192.168.1.2 -d ! 192.168.0.0/16 -m tos --tos 0x08 -j MARK --set-mark 1121 # niski priorytet upload - klasa 1:122 iptables -t mangle -A FORWARD -s 192.168.1.2 -d ! 192.168.0.0/16 -m tos --tos 0x10 -j MARK --set-mark 1122Wzór do obliczenia znacznika jest identyczny jak powyżej - zwracam uwagę, że upload ograniczany jest na interfejsie internetowym a nie jak download na lokalnym więc w tym przypadku identyfikator klasy mamy taki jak dla inter_int czyli w tym przypadku 1. Teraz sprawdzamy:
tc -s filter show dev eth0 | grep 460i dostajemy w wyniku:
filter parent 1: protocol ip pref 10 fw handle 0x460 classid 1:120Czyli wszystko jest prawidłowo. Możemy teraz obserwować klasę 1:120:
watch tc -s class show dev eth0aby zobaczyć czy coś przez nią przechodzi. I widzimy:
class cbq 1:120 parent 1:5 leaf a69c: rate 18Kbit prio 3 Sent 12122 bytes 208 pkts (dropped 0, overlimits 0) borrowed 0 overactions 0 avgidle 8.07342e+06 undertime 0Czyli jak widać, przez klasę przeszły 12122 bajty.
iptables -t mangle -A POSTROUTING -p tcp -s 213.97.124.129/32 --sport 22:23 -d 0/0 -j MARK --set-mark 1164 iptables -t mangle -A POSTROUTING -p udp -s 213.97.124.129/32 --sport 22:23 -d 0/0 -j MARK --set-mark 1164numer IP serwera znajduje się w pliku iplist.X na pozycji 12 (wpis w iplist.X: 213.97.124.129=eth0 eth0).
tc -s filter show dev eth0 | grep 48ci wynik:
filter parent 1: protocol ip pref 10 fw handle 0x48c classid 1:164I cały ruch wychodzący z serwera z portu 22 lub 23 będzie miał najwyższy priorytet.
/etc/shaper/queue_download_default.X /etc/shaper/queue_download_high.X /etc/shaper/queue_download_med.X /etc/shaper/queue_download_low.X /etc/shaper/queue_upload_default.X /etc/shaper/queue_upload_high.X /etc/shaper/queue_upload_med.X /etc/shaper/queue_upload_low.X /etc/shaper/queue_upload_server_default.X /etc/shaper/queue_upload_server_high.X /etc/shaper/queue_upload_server_med.X /etc/shaper/queue_upload_server_low.XTrzy ostatnie pliki konfiguracyjne są używane przez shaperd do tworzenia regułek. Pozostałe 6 plików w chwili obecnej nie są używane przez shaperd i trzeba sobie napisać skrypt operujący na nich.
iptables -t mangle -vxL POSTROUTING -n | grep 8080pokazuje regułki do znakowania pakietów (MARK)
iptables -vxL squid0 -npokazuje rzeczywisty transfer ze squida.
iptables -vxL squid0 -n | grep -E -v "destination|squid" | awk '{print $9,"\t",$2}'Wynik prawidłowo działającego squida będzie wyglądał mniej więcej tak:
192.168.1.3 135967 0.0.0.0/0 2074683 192.168.1.7 2432944 192.168.1.6 18121074Oznacza to, że np user 192.168.1.3 ściągnął przez squida 135967 bajtów danych (nietrafionych czyli takich - które trzeba było ściągać z internetu i zrobione to zostało w ramach przydziału tego usera). Wpis 0.0.0.0/0 oznacza, że 2074683 zostało przesłanych w sumie do wszystkich userów, były to dane trafione (z cache) i nie było na nie nałożonego ograniczenia.
modprobe sch_cbq modprobe sch_tbf modprobe cls_u32Dla HTB trzeba załadować następujące moduły:
modprobe sch_htb modprobe sch_sfq modprobe cls_u32
/sbin/shaperd shownatW dostarczonym przykładowym pliku są zrobione wpisy dla popularnych komunikatorów np. GaduGady, Tlen oraz dla kilku czatów i MUD'ów.
192.168.1.2/32 40000 192.168.1.9/32 58000lub gdy speed_ext jest ustawiony inny niż bit (w tym przypadku Kbit):
192.168.1.2/32 40 Kbit 192.168.1.9/32 58 Kbit
tc -s qdisc show dev eth1gdzie: eth1 to nazwa interfejsu lokalnego jeśli sprawdzamy dzielenie download
tc -s class show dev eth1Wyniki jej działania mogą wyglądać tak:
qdisc tbf d09f: dev eth0 rate 5430bps burst 10Kb lat 1.2s Sent 108930 bytes 73 pkts (dropped 0, overlimits 0) qdisc tbf d09e: dev eth0 rate 5430bps burst 10Kb lat 1.2s Sent 126618 bytes 89 pkts (dropped 0, overlimits 0) qdisc tbf d09d: dev eth0 rate 1638bps burst 10Kb lat 3.8s Sent 54699 bytes 65 pkts (dropped 0, overlimits 321) backlog 6110b 5p qdisc tbf d09c: dev eth0 rate 10Mbit burst 10Kb lat 4.8ms Sent 0 bytes 0 pkts (dropped 0, overlimits 0) qdisc tbf d09b: dev eth0 rate 10Mbit burst 10Kb lat 4.8ms Sent 5690 bytes 53 pkts (dropped 0, overlimits 0) qdisc cbq 10: dev eth0 rate 10Mbit (bounded,isolated) prio no-transmit Sent 310829 bytes 302 pkts (dropped 0, overlimits 1555) backlog 5p borrowed 0 overactions 0 avgidle 624 undertime 0Nalezy zwrócić szczególną uwagę na linie z rate innym niż 10Mbit (lub innym w przypadku posiadania łącza lokalnego o innej szybkości maksymalnej). W tym przypadku trzy pierwsze klasy obrazują transfery trzech różnych komputerów w sieci lokalnej. Należy zwrócić uwagę, czy rejestrowane są wielkości wysłanych danych Sent. Jeśli tak to znaczy, że CBQ działa i obcina transfer przekraczający widełki.
/usr/local/lstat/bin/show_filters | grep shaper | awk '{print $1,$11}'a dla wychodzących (upload):
/usr/local/lstat/bin/show_filters | grep shaout | awk '{print $1,$10}'Dostaniemy listę z nazwami filtrów po lewej stronie i numerami ip im odpowiadającymi Kolejność jest taka sama jak wpisy w pliku iplist dlatego lepiej potem nie przestawiać linijek w iplist.
<p><a href="http://sp9wun.republika.pl/"> <img src="http://sp9wun.republika.pl/linux/pics/shaperd.gif" border="0" width="102" height="47" alt="Powered by Shaper CBQ"></a></p>
Znane błędy
Komunikaty w logu:shaperd0: BUG: download: x=2- Wpis miał służyć do czegoś innego ale obecnie świadczy o wykryciu przez shapera podwójnego wpisu jakiegoś numeru IP w pliku iplist.X
shaperd0: BUG: upload: x=2- Wpis miał służyć do czegoś innego ale obecnie świadczy o wykryciu przez shapera podwójnego wpisu jakiegoś numeru IP w pliku iplist.X
shaperd0: Can't find mask for IP v]ţ.Ň- Tak objawia się bug, którego jeszcze nie zlokalizowałem. Wygląda na to, że coś jeździ mi po pamięci ale nie mogę tego zlokalizować. Wpis pojawia się sporadycznie i jeśli kogoś denerwuje to może sobie wyłączyć wyrzucanie przez shapera komunikatu "Can't find mask for IP ..." ustawiając w konfiguracji mask_mesg=no
kernel: CBQ: class XXXXXXXX has bad quantum==0, repaired- Błąd pojawiający się na niektórych systemach i jak na razie przyczyny jego występowania nie znalazłem. Znana jest mi strona http://cbq.med.cz/ - niestety - nie pomogła.
kernel: CBQ: class XXXXXXXX has bad quantum==YYYYY, repaired- Błąd pojawiający się na niektórych systemach i jak na razie przyczyny jego występowania nie znalazłem.
kernel: HTB init, kernel part version 3.7- Wpis pojawia się przy inicjalizacji klasy HTB dla wersji 3.X. Nie oznacza on niczego złego jednak fakt, że przy każdym tworzeniu klasy HTB tworzony jest taki wpis powoduje, że nie ma sensu używać shapera z wyłączoną opcją continuous_control bo co parę sekund będzie ten komunikat w logu zapisywany.
Feb 27 23:52:43 frodo kernel: htb*g j=3799623 Feb 27 23:52:43 frodo kernel: htb*r7 m=0 Feb 27 23:52:43 frodo kernel: htb*r6 m=0 Feb 27 23:52:43 frodo kernel: htb*r5 m=0 Feb 27 23:52:43 frodo kernel: htb*r4 m=0 Feb 27 23:52:43 frodo kernel: htb*r3 m=0 Feb 27 23:52:43 frodo kernel: htb*r2 m=0 Feb 27 23:52:43 frodo kernel: htb*r1 m=0 Feb 27 23:52:43 frodo kernel: htb*r0 m=0pojawia się u mnie przy inicjalizacji klasy HTB 3.X. Uwagi jak wyżej.
kernel: HTB: need tc/htb version 3 (minor is 7), you have 10- uaktualnij sobie komendę tc - najlepiej pobierz ją ze strony autora HTB.
kernel: HTB: mindelay=500, report it please !- Błąd opisany na stronie HTB FAQ. Przyczyna jego może być taka, że jakiś user dostał przydział mniejszy niż zalecany przez autora HTB 4Kbit. Aby go uniknąć wystarczy wpisać lospeed nie mniejsze niż 4Kbit.
kernel: assertion (cl && cl->un.leaf.q->q.qlen) failed at sch_htb.c(959) htb: class 10159 isn't work conserving ?!- Błąd opisany na liście dyskusyjnej lartc - u mnie występuje przy inicjalizacji HTB - żadnych przykrych objawów nie zauważyłem.
Problemy
Aby ustrzec się pewnych problemów, które mogą wyniknąć w trakcie normalnej eksploatacji daemona należy przestrzegać kilku zasad (zasady te będą ulegać zmianom w trakcie wprowadzania zmian w kolejnych wersjach programu - na razie jednak mysząbyć ponieważ nie jestem wszechwiedzący i nie z każdym problemem potrafię sobie poradzić)
ipchains -L output -ntablica shaperX powinna być na najwyższej pozycji
Chain output (policy ACCEPT): target prot opt source destination ports shaout0 all ------ 0.0.0.0/0 0.0.0.0/0 n/a shaper0 all ------ 0.0.0.0/0 0.0.0.0/0 n/a ppp-out all ------ 0.0.0.0/0 0.0.0.0/0 n/a eth-out all ------ 0.0.0.0/0 0.0.0.0/0 n/a
ipchains -L shaper0 -nw tej tablicy powinny znajdować się reguły dla wszystkich numerów IP z pliku /etc/shaper/iplist.0. Przykład:
Chain shaper0 (1 references): target prot opt source destination ports RETURN tcp ------ !192.168.1.1 192.168.1.2 * -> * RETURN tcp ------ !192.168.1.1 192.168.1.3 * -> * RETURN tcp ------ !192.168.1.1 192.168.1.4 * -> * RETURN tcp ------ !192.168.1.1 192.168.1.5 * -> * RETURN tcp ------ !192.168.1.1 192.168.1.6 * -> * RETURN tcp ------ !192.168.1.1 192.168.1.7 * -> * RETURN tcp ------ !192.168.1.1 192.168.1.8 * -> *Analogicznie jest dla tablicy upload shaout, z tym, że w kolumnie source będą numery IP userów.
watch ipchains -vxL shaper0 -n watch ipchains -vxL shaout0 -npozwoli na obserwowanie, czy regułki liczą ilość pobranych danych przezd poszczególne numery IP. Generalnie - jeśli jakiś numer aktualnie coś ciągnie z internetu to jego regułka musi liczyć. Jeśli tego nie robi to należy próbować zrestartować shapera
iptables -L FORWARD -n --line-numbers | grep shatablica shaoutX powinna mieć pozycję 1 a shaperX pozycję numer 2:
1 shaout0 all -- 0.0.0.0/0 0.0.0.0/0 2 shaper0 all -- 0.0.0.0/0 0.0.0.0/0
iptables -L shaper0 -nw tej tablicy powinny znajdować się reguły dla wszystkich numerów IP z pliku /etc/shaper/iplist.0. Przykład:
Chain shaper0 (1 references) target prot opt source destination RETURN all -- !192.168.0.0/16 192.168.1.2 RETURN all -- !192.168.0.0/16 192.168.1.3 RETURN all -- !192.168.0.0/16 192.168.1.4 RETURN all -- !192.168.0.0/16 192.168.1.5 RETURN all -- !192.168.0.0/16 192.168.1.6 RETURN all -- !192.168.0.0/16 192.168.1.7 RETURN all -- !192.168.0.0/16 192.168.1.8 RETURN all -- !192.168.0.0/16 192.168.1.9 RETURN all -- !192.168.0.0/16 192.168.1.10Analogicznie jest dla tablicy upload shaout, z tym, że w kolumnie source są numery IP userów.
watch iptables -vxL shaper0 -n watch iptables -vxL shaout0 -npozwoli na obserwowanie, czy regułki liczą ilość pobranych danych przezd poszczególne numery IP. Generalnie - jeśli jakiś numer aktualnie coś ciągnie z internetu to jego regułka musi liczyć. Jeśli tego nie robi to należy próbować zrestartować shapera
class_type=htb upload_class_type=cbq
FAQ
inter_int=ppp0;0,5;92;0,5;60;auto;1i nie wiem czy mam prawidłowo ustawione?? Bo chciałbym żeby było download min 0,5kbit max 9kbit a upload min 0.5kbit max 6kbit
192.168.42.12/32=eth1 eth0
tc filter add dev eth1 parent 1:0 protocol ip prio 100 u32 match ip src 217.97.124.128/32 flowid 1:1Gdzie:
local_int=eth1;10240;192.168.1.1/32;192.168.1.0/24;2ustawiamy opcje:
nomasq=1i w iplist oprócz numerów IP lokalnych wpisujemy dodatkowo ten zewnetrzny IP.
Powrót | Linux |