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.
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_downloadgdzie:
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).
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.
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).
mainip=212.17.14.118 internet_iface=ppp0 high_start_speed=1 even_division=0 check_always=1 squid_support=0 nomasq=0 lospeed=8000 hispeed=92000 internet_iface_speed=60000 speed_ext=bit debug=0 delay=10 write_delay=0 local_int=eth0;10485760;192.168.0.0/16;192.168.1.0/24;1Gdzie:
mainip=212.17.14.118 internet_iface=ppp0 high_start_speed=1 even_division=0 check_always=1 squid_support=0 nomasq=0 lospeed=16 hispeed=900 internet_iface_speed=400 speed_ext=Kbit debug=0 delay=10 write_delay=0 local_int=eth0;10240;192.168.0.0/16;192.168.1.0/24;1 local_int=eth1;102400;192.168.0.0/16;192.168.2.0/24;2
mainip=212.17.14.118 internet_iface=ppp0 high_start_speed=1 even_division=0 check_always=1 squid_support=0 nomasq=0 lospeed=8000 hispeed=100000 internet_iface_speed=70000 speed_ext=bit debug=0 delay=10 write_delay=0 local_int=eth0;10485760;192.168.0.0/16;192.168.1.0/24;1 local_int=eth1;104857600;192.168.0.0/16;192.168.2.0/24;2 local_int=ppp1;786432;192.168.3.1/32;192.168.3.0/24;3
mainip=`ifconfig ppp0 | grep "inet addr" | cut -d ':' -f2 | cut -d ' ' -f1`;shaperd -mainip=$mainipgdzie ppp0 to przykładowa nazwa interfejsu z internetem
gcc /usr/src/shaperd/shaperd.c -o /sbin/shaperd
192.168.1.2=eth0 192.168.1.3=eth0 192.168.1.4=eth0 8000 16000 192.168.1.5=eth0 192.168.2.2=eth1 192.168.2.3=eth1 192.168.2.4=eth1 192.168.2.5=eth1Wprowadził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: 8000 (1KB - minimum gwarantowane) i 16000 (2KB - maksymalna przydzielona szybkość). 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.cfg.
192.168.1.2=eth0 192.168.1.3=eth0 192.168.1.4/30=eth0 192.168.2.2=eth1 192.168.2.3=eth1 192.168.2.4=eth1 192.168.2.5=eth1Co spowoduje, że numery IP od 192.168.1.4-192.168.1.7 będą traktowane jako jeden i otrzymają wspólnie widełki.
192.168.1.0/24=eth0 192.168.2.0/24=eth1Jest to podział między dwoma interfejsami. Przy włączonej opcji even_division=1 możemy zaczynać działalność providerską :)
/sbin/shaperd -hispeed=100000 -lospeed=8000Dobrze jest podawać szybkość nie deklarowaną a rzeczywistą, jaką udaje się uzyskać ciągnąc coś przez dłuższy czas przez to łącze w kierunku z internetu do sieci. Inaczej dzielenie wirtualnej szybkości mija się z celem. Łącze SDI nie pracuje z szybkością 115kbit tylko 96kbit (w jedną stronę) więc wpisywanie większych wartości powoduje tylko tyle, że ktoś dostanie w sieci przydział szybkości, którego nigdy nie uda mu się osiągnąć. Po co więc kogoś oszukiwać. Ja dla SDI daję 100000
iptables -t mangle -vxL OUTPUT -n | grep 8192
modprobe sch_cbq modprobe sch_tbf modprobe cls_u32
/sbin/shaperd shownat
192.168.1.2 40000 192.168.1.9 58000lub gdy speed_ext jest ustawiony inny niż bit (w tym przypadku Kbit):
192.168.1.2 40 Kbit 192.168.1.9 58 Kbit
tc -s qdiscWyniki 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.
<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>
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 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 -nw 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 -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 shapertablica shaper powinna mieć pozycję numer 1:
1 shaper all -- 0.0.0.0/0 0.0.0.0/0
iptables -L shaper -nw 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 -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
Powrót | Linux |