Jak zrobić dzielenie łącza pod Linux'em - shaperd (CBQ)

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:

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.


Zasada działania:

Po włączeniu się w sieć nowego użytkownika i rozpoczęciu transmisji z internetem (lokalne połączenia nie rezerwują łącza), daemon testuje czy użytkownik nie łączy się przypadkiem z jednym z adresów ip lub portów wpisanych w liście wyjątków (plik /etc/shaper/ignore). Jeśli nie znajdzie takiego wyjątku to 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 (np o 8000 czyli 1KBajt) - 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ą.
Ponadto program ogranicza również szybkość łącza internetowego w kiedunku wychodzącym. Szybkość ta zależy od sumy ograniczeń szybkości ściągania przydzielonych użytkownikom w kierunku download (czyli z internetu do sieci lokalnej) i można ją opisać prostym wzorem:

speed_upload = speed_max - speed_download
gdzie:
  • speed_upload - szybkość wysyłania danych do internetu
  • speed_max - maksymalna przepustowość łącza (w obu kierunkach)
  • speed_download - szybkość pobierania z internetu
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 tylko transfer przychodzący z internetu do użytkowników.
Shaperd jest programem napisanym w języku C funkcjonalnie odpowiadającym skryptowi shaper_cbq.


Uwaga

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ż 300 sekund).


OSTRZEŻENIE

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, firewall'ach na ipchains i iptables oraz na dystrybucji Mandrake 8.1 (Vitamin) i łączach: SDI oraz 1Mbit dzierżawione od ISP.



Ostatnia wersja:
shaperd_cbq.tar.gz (1.43.5-15.11.2002)

Starsze wersje:
shaperd_cbq_143.3.tar.gz (1.43.3-12.11.2002)
shaperd_cbq_143.tar.gz (1.43-02.11.2002)
shaperd_cbq_142.tar.gz (1.42-05.10.2002)
shaperd_cbq_141.tar.gz (1.41-27.09.2002)
shaperd_cbq_140.tar.gz (1.40-26.09.2002)
shaperd_cbq_138.tar.gz (1.38-22.09.2002)
shaperd_cbq_137.tar.gz (1.37-21.09.2002)
shaperd_cbq_136.tar.gz (1.36-21.09.2002)
shaperd_cbq_135.tar.gz (1.35-11.09.2002)
shaperd_cbq_134.tar.gz (1.34-07.09.2002)
shaperd_cbq_133.tar.gz (1.33-06.09.2002)
shaperd_cbq_132.tar.gz (1.32-05.09.2002)
shaperd_cbq_131.tar.gz (1.31-28.08.2002)
shaperd_cbq_130.tar.gz (1.30-19.08.2002)
shaperd_cbq_129.tar.gz (1.29-30.07.2002)
shaperd_cbq_128.tar.gz (1.28-29.07.2002)
shaperd_cbq_127.tar.gz (1.27-28.07.2002)
shaperd_cbq_126.tar.gz (1.26-01.07.2002)
shaperd_cbq_125.tar.gz (1.25-27.06.2002)
shaperd_cbq_124.tar.gz (1.24-27.06.2002)
shaperd_cbq_123.tar.gz (1.23-25.06.2002)
shaperd_cbq_122.tar.gz (1.22-19.06.2002)
shaperd_cbq_121.tar.gz (1.21-19.06.2002)
shaperd_cbq_120.tar.gz (1.20-19.06.2002)
shaperd_cbq_117.tar.gz (1.17-04.06.2002)
shaperd_cbq_116.tar.gz (1.16-03.06.2002)


Aby wogóle dzielenie łącza pod Linuxem zaczęło działać to musi być spełnione wiele warunków:
  1. zainstalowany pakiet iproute2

  2. przekompilowane jądro aby obsługiwało CBQ (nie wiem jak jest z innymi dystrybucjami ale w Mandrake 8.1 CBQ (QoS) było wkompilowane standardowo przez dystrybutora więc nic nie musiałem kompilować.
    Jeśli nie wiesz, co ustawić do kompilacji to zaglądnij tutaj.

  3. Daemon współpracuje zarówno z ipchains jak i iptables (rodzaj firewalla jest rozpoznawany automatycznie).

  4. Nie jest potrzebne robienie jakichkolwiek wpisów na firewall'u specjalnie dla shaperd. Daemon robi wszystkie potrzebne wpisy sam przy starcie.

  5. Aby przetestować jądro pod kątem zgodności z CBQ trzeba zainstalować iproute2 (na Mandrake 8.1 iproute2 jest instalowane domyślnie) i wpisać komendę:
    tc -d qdisc
    Jeś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).
    Jeśli jest gotowe to ta komenda nic nie wyświetli (lub wyświetli przydzielone widełki).

  6. shaperd działa przy pewnych założeniach:
  7. Daemon musi działać na prawach root i mieć możliwość zapisu do katalogu /var/shaper. Katalog taki trzeba założyć z właścicielem root i prawami 755

  8. W /etc/shaper sa wpisane wyjątki dla których shaper nie rezerwuje łącza. Mogą to być przykładowo:
    217.96.55.5 411 - numer ip i port 411
    213.180.130.190 - numer ip i kazdy port
    22$ - każdy numer ip i port 22 (telnet)
    Zrobione jest to po to, żeby skrypt nie rezerwował łącza na transmisje nie generujące praktycznie ruchu (np. GaduGadu, IRC, telnet, Chaty itp). Aktualną listę branych pod uwagę przy podziale numerów ip i portów na maskaradzie można podglądnąć pisząc:
    /sbin/shaperd shownat
  9. W katalogu /var/shaper generowany jest plik bitrate_user_sh.old - zawiera numery ip oraz przydzielone widełki. Można to wykorzystać do wizualizacji na stronie www - przykład użycia. Zawartość tego pliku może wyglądać mniej-więcej tak:
    192.168.1.2 40000
    192.168.1.9 58000
    
    lub gdy speed_ext jest ustawiony inny niż bit (w tym przypadku Kbit):
    192.168.1.2 40 Kbit
    192.168.1.9 58 Kbit
    
  10. Warto sprawdzić jak program działa wydając komendę:
    tc -s qdisc
    
    Wyniki 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 0
    
    Nalezy 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.

  11. W razie wystąpienia problemów przy uruchomieniu tego daemona, zanim do mnie napiszesz - postaraj się przeczytać ten opis jeszcze raz i sprawdź, czy nie popełniłeś gdzieś błedu. Potem dopiero możesz pisać do mnie. Ze względu na brak czasu moja pomoc może być trochę opóźniona więc polecam zaglądnięcie do Księgi gości. Może ktoś z wpisanych tam adminów zechce pomóc wcześniej niż ja będę w stanie to zrobić.

  12. Poniżej można zobaczyć jak zachowuje się w praktyce shaperd (łącze DSL).


    Statystyki wygenerowano programem lstat 2.2


  13. Jeśli przebrniesz przez instalację i uda Ci się skonfigurować ten program na swoim serwerze, może zechcesz się wpisać do Księgi gości. Proszę, podaj w niej:
    • Wersja shaper'a
    • Opis systemu na serwerze (dystrybucja, wersja kernela, inne uwagi)
    • swój e-mail kontaktowy (możesz go zakończyć jakimś "ściemniaczem anyspamowym" ;) typu .NOSPAM)
    • url strony www (jesli isnieje) serwera
    Może pomożesz innym w instalacji tego daemona a mnie trochę odciążysz. Będę bardzo wdzięczny.

  14. Będzie mi miło, jeśli jakiś szczęśliwy administrator wrzuci gdzieś na swoją stronę sieciową ten mały banerek:

    Powered by Shaper CBQ

    A tutaj jest kod html do wklejenia:
    <p><a href="http://sp9wun.republika.pl/">
    <img src="http://sp9wun.republika.pl/linux/pics/shaper.png" border="0" 
    width="89" height="32" alt="Powered by Shaper CBQ"></a></p>
Zobacz skrypt PHP kto.php (dodatkowy skrypt ckwintalk do kontroli wintalka - u mnie w sieci wintalk jest obowiązkowy) do generowania listy aktywnych komputerów wraz z przydzielonymi im widełkami przez shaper'a. Skrypt trzeba wyedytować i powpisywać dane ze swojej sieci. Wywołuje się go odwołując się do kto.php.
Skrypt wymaga skonfigurowania DNSa dla lokalnych numerów ip. Ponadto mogą wystąpić błędy z niektórymi wersjami binda. Trzeba się pobawić w przerabianie.

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ć)

  1. Jeśli shaperd wiesza się lub nie chce się uruchomić - zacznij od skompilowania na swoim systemie kodów źródłowych. Plik wykonywalny dostarczany w archiwum jest skompilowany na dość świerzym systemie i mogą być problemy z uruchomieniem na bardziej wiekowych dystrybucjach.


  2. Przy starcie systemu skrypt startowy /etc/init.d/shaperd uruchamiaj możliwie na końcu a w szczególności zawsze uruchamiaj go po jakichkolwiek skryptach, które mogą modyfikować firewall (np. wszelkie skrypty do konfiguracji maskarady, firewalla itp.).


  3. Jeśli wykonywałeś jakiekolwiek operacjie na firewallu (wyczyściłeś liczniki regułek, dopisałeś lub skasowałeś jakieś regułki, przeładowałeś firewall itp.) obowiązkowo zrestartuj shaperd. Zaniechanie tego może skutkować zdławieniem całego transferu przychodzącego, ponieważ shaperd przy starcie tworzy własne regułki na firewall'u i muszą być one sprawdzane w pierwszej kolejności. Zmiana kolejności reguł na firewallu może (choć nie musi) skutkować tym, że reguły rejestrujące ruch przychodzący dla shaper'a niczego nie będą rejestrować i daemon stwierdzi, że nikt nie wykorzystuje przydzielonych widełek więc zacznie obniżać przydziały (aż do minimum gwarantowanego). Aby sprawdzić czy reguły dla shapera znajdują się na właściwym miejscu i pracują prawidłowo wystarczy zrobić następującą operację:
    • dla ipchains:
      • ipchains -L output -n
        tablica shaper powinna być na najwyższej pozycji
        Chain output (policy ACCEPT):                                            
        target     prot opt     source                destination           ports
        shaper     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 shaper -n
        w tej tablicy powinny znajdować się reguły dla wszystkich numerów IP z pliku /etc/shaper/iplist. Przykład:
        Chain shaper (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           * ->   *
        
      • watch ipchains -vxL shaper -n
        pozwoli 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

    • dla iptables:
      • iptables -L FORWARD -n --line-numbers | grep shaper
        tablica shaper powinna mieć pozycję numer 1:
        1    shaper     all  --  0.0.0.0/0            0.0.0.0/0
      • iptables -L shaper -n
        w tej tablicy powinny znajdować się reguły dla wszystkich numerów IP z pliku /etc/shaper/iplist. Przykład:
        Chain shaper (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.10
        
      • watch iptables -vxL shaper -n
        pozwoli 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

  4. Nie wolno samodzielnie ustawiać czasów utrzymywania połączeń na maskaradzie (np. komendą ipchains -M -S) - dotyczy posiadaczy kerneli 2.2.x (ponieważ w 2.4.x komenda ta nie działa ;). Czasy te ustawia shaperd i na ich podstawie kontroluje, który numer IP jest aktywny na łączu. Ustawienie tych czasów przy pracującym shaperze może spowodować, że shaperd nie będzie widział niektórych połączeń przez maskaradę a co za tym idzie - nie przydzieli dla nich widełek.


  5. Generalnie odradzam niewpisywania wybranych (uprzywilejowanych?) numerów IP do pliku /etc/shaper/iplist w celu uniknięcia przydzielenia im widełek. Skutek takiego działania wcale nie jest oczywisty i może być daleki od zamierzonego. W zależności od systemu i wersji zainstalowanego na nim oprogramowania, na jednych systemach coś takiego może zadziałać i wybrany numer IP będzie mógł przejąć całe łącze dla siebie. Na innych systemach może być problem z dopchaniem się do łącza bez przydzielonych widełek. Niemniej skutek zawsze będzie jeden - shaperd będzie bardzo gwałtownie zmieniał przydziały innym użytkownikom "szarpiąc" im szybkościami. Prowadzi to niewątpliwie do nierównomiernego obciążenia łącza i wypacza ideę stosowania shapera.


  6. Kolega Grzegorz Cichowski stwierdził, że w przypadku wpisywania w pliku /etc/shaper/shaper.cfg parametrów dla łącza lokalnego 100Mbit należy podać szybkość 8Gbit co po przeliczeniu na bity dałoby w wyniku liczbę 8589934592, która jest z kolei liczbą 33 bitową i przekracza wielkość rejestrów procesora. Aby wpisać taką liczbę należy przeliczyć ją na kbit a nie podawać w bit. Po przeliczeniu liczba ta wynosi 8388608 i jednostka kbit. Proszę pamiętać o przeliczeniu na tą jednostkę wszystkich szybkości podawanych w konfiguracji jak i w lini poleceń!


  7. Proszę nie używać do edytowania plików konfiguracyjnych programów pracujących pod Dosem/Windowsem z powodu niestandardowego formatu końca linii (CR+LF).


  8. Nie należy wstawiać pustych linii do plików konfiguracyjnych.




Powrót Linux
@
Webmaster Grzegorz Fitrzyk