UWAGA
Projekt ten jest już od dawna nie rozwijany. Obecnie pracuję nad bardziej uniwersalnym shaperem (nazywa się shaperd), pracującym zarówno na ipchains jak i na iptables. Dlatego zalecam instalowanie daemona shaperd.
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)
Uwaga
Jeśli nie potrafisz się posługiwać iptables, o samodzielnym pisaniu skryptów w shellu nawet nie wspomnę - to nie masz tu czego szukać. Nie będę pomagał instalować ten skrypt ludziom, którzy nie mają pojęcia o podstawach. Jak ktoś się nie czuje na siłach a mieszka w Krakowie to nie ma problemu - zainstaluję mu to osobiście (pewnie nie za darmo ;-) Reszta musi sobie radzić sama. Jeśli komuś nie pasuje ten skrypt z powodu założeń to wolna droga - proszę sobie go przerobić. Nie mam czasu na pisanie ludziom skryptów pod kątem ich potrzeb - przykro mi bardzo.
historia:
iptables -N ppp0-in iptables -A INPUT -i ppp0 -j ppp0-in iptables -A FORWARD -i ppp0 -s ! 192.168.1.1 -d 192.168.1.2 -j RETURN iptables -A FORWARD -i ppp0 -s ! 192.168.1.1 -d 192.168.1.3 -j RETURN iptables -A FORWARD -i ppp0 -s ! 192.168.1.1 -d 192.168.1.4 -j RETURNGdzie:
iptables -vxL FORWARD -n | awk '{print $9,$2}'Co powinno wyświetlić mniej wiecej coś takiego:
FORWARD destination bytes 192.168.1.2 299202 192.168.1.3 4929737 192.168.1.4 2467405 192.168.1.5 208488 192.168.1.6 4215400 192.168.1.7 1439977 192.168.1.8 139236Jeśli regułki nie rejestrują żadnego ruchu przychodzącego (są same zera) to poczytaj sobie man do iptables. Pewnie wcześniej w regułkach masz wpisane coś, co spełnia wszystkie warunki dla każdego numeru ip np.:
iptables -A FORWARD -i ppp0 -j ACCEPTJeśli masz kilka interfejsów i dużo userów to może być troche kłopotliwe wpisywanie ręczne tylu regułek. Dlatego do archiwum shaper_cbq_iptables dołączyłem skrypt ipallow w wersji dla iptables obsługującej wiele lokalnych interfejsów i korzystającego częściowo z konfiguracji shapera_cbq. Jedyne co w skrypcie ipallow trzeba skonfigurować to zmienić nazwę interfejsu który jest dołączony do internetu w linijce:
internet_iface="ppp0"Na stronie Maskarada jest opis skryptu ipallow - niestety - jak na razie tylko do wersji na ipchains - zasady działania są jednak podobne.
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 high_start_speed=1 local_int=eth0;10485760;192.168.0.0/16;192.168.1.0/24;10Gdzie:
mainip=212.17.14.118 high_start_speed=1 local_int=eth0;10485760;192.168.0.0/16;192.168.1.0/24;10 local_int=eth1;104857600;192.168.0.0/16;192.168.2.0/24;11
mainip=212.17.14.118 high_start_speed=1 local_int=eth0;10485760;192.168.0.0/16;192.168.1.0/24;10 local_int=eth1;104857600;192.168.0.0/16;192.168.2.0/24;11 local_int=ppp1;786432;192.168.3.1/32;192.168.3.0/24;12
masq=`/root/natstat | \i dopisać numery ip podsieci i bramki:
masq=`/root/natstat 10. 10.1.1.1 | \Gdzie:
$natstat_exec= "/root/natstat";i dopisz numery ip jak w przykładzie powyżej np:
$natstat_exec= "/root/natstat 10. 10.1.1.1";
gcc /root/natstat.c -o /root/natstat
192.168.1.2=eth0 192.168.1.3=eth0 192.168.1.4=eth0 192.168.1.5=eth0 192.168.2.2=eth1 192.168.2.3=eth1 192.168.2.4=eth1 192.168.2.5=eth1
/sbin/shaper 115200 8000lub dla wersji PHP
/usr/bin/php -q /sbin/shaper.php 100000 8000gdzie 115200 to maksymalnie 115kbit a 8000 to 8kbit czyli minimalny przydział dla użytkownika (podzielić sobie szybkość na ilość użytkowników sieci). Dobrze 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.
modprobe sch_cbq modprobe sch_tbf modprobe cls_u32
*/1 * * * * root /sbin/shaper 115200 8000UWAGA Dla wersji PHP uruchamiam go tak:
*/1 * * * * root /usr/bin/php -q /sbin/shaper.php 100000 8000 > /dev/nullale można i tak:
*/1 * * * * root /sbin/shaper.php 100000 8000 > /dev/null
shaper_test
192.168.1.2 441127061 1008227523 192.168.1.3 0 1008227523 192.168.1.4 0 1008227523 192.168.1.5 93120766 1008227523 192.168.1.6 304302374 1008227523 192.168.1.7 51299622 1008227523 192.168.1.9 373967723 1008227523
192.168.1.2 40000 192.168.1.9 58000
192.168.1.5 192.168.1.9
ckbitrate_user 192.168.1.2
ckbitrate_user_last 192.168.1.2
shaper_test
shaper_test
shaper_test_dns 192.168.1.2
shaper_off
/root/natstat 192.168. 192.168.1.1wyświetli coś mniejwięcej takiego (dotyczy sieci pracujących z numerami IP klasy C):
192.168.1.24 64.245.59.88 21 192.168.1.24 65.33.78.195 41007 192.168.1.24 150.254.29.66 4444 192.168.1.24 208.185.211.71 80 192.168.1.24 217.17.41.83 8074
/sbin/shaper 100000 8000W wyniku działania tej komendy nie powinien pojawić się na ekranie żaden komunikat (wszystkie wyniki są generowane do plików i robione są widełki).
/usr/bin/php -q /sbin/shaper.php 100000 8000wynik działania może wyglądać tak:
IP=192.168.1.2, band_new=16000, usage=148, rate=11866, band_old=8000 IP=192.168.1.6, band_new=8000, usage=-100, rate=5319, band_old=-1 Total band used=24000Po uruchomieniu sprawdzić pliki bitrate_user_sh.old, bitrate_user.tmp, masq.tmp pod kątem prawidłowej zawartości.
tc -s qdiscWyniki jej działania mogą wygladac 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 i czy pojawiają się jakieś wartości przy dropped i overlimits. 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>
Powrót | Linux |