Bandwidth Limiting HOWTO

Tomasz Chmielewski

tch@metalab.unc.edu 

Revision History
Revision 0.92001-11-20Revised by: tc

Dokument ten opisuje, jak skonfigurować serwer linuksowy ażeby ograniczyć pasmo dla ściągania plików i przychodzącego ruchu, oraz jak najefektywniej wykorzystać łącze internetowe.


Spis treści
1. Wstęp
1.1. Nowe wersje tego dokumentu
1.2. Disclaimer
1.3. Prawa autorskie i licencje
1.4. Informacje o błędach w dokumencie i poprawki
1.5. Podziękowania
2. Zanim rozpoczniemy
2.1. Czego potrzebujemy
2.2. Jak to działa ?
3. Instalacja i konfiguracja niezbędnego oprogramowania
3.1. Instalacja squida z opcją pul spowalniających (delay pools)
3.2. Konfiguracja squida umożliwiająca wykorzystanie pul spowalniających
3.3. Rozwiązywanie pozostałych problemów
4. Obsługa innych protokołów absorbujących pasmo przy użyciu CBQ
4.1. FTP
4.2. Napster, Realaudio, Windows Media i pozostałe protokoły
5. FAQ - Najczęściej zadawane pytania
5.1. Czy możliwe jest ograniczenie pasma dla pojedynczych użytkowników przy użyciu pul spowalniających ?
5.2. Jak zmusić wget-a do pracy ze squidem ?
5.3. Ustawiłem nasłuchiwanie serwera SOCKS na porcie 1080 i nie mogę połączyć się z żadnym serwerem irc
5.4. Nie podoba mi się, że Kazaa albo Audioalaxy zapychają mi całe pasmo uploadu.
5.5. Mój serwer poczty wychodzącej zapycha całe pasmo.
5.6. Czy mogę ograniczyć moje serwery FTP albo WWW w sposób pokazany w przykładzie powyżej ?
5.7. Czy jest możliwe ograniczenie pasma dla użytkownika przy użyciu skryptu cbq.init ?
5.8. Za każdym razem, kiedy startuję cbq.init, system zgłasza brakujące sch_cbq.
5.9. CBQ czasami z nieznanych przyczyn odmawia współpracy.
5.10. Pule spowalniające to głupi pomysł; dlaczego nie mogę ściągnąć czegoś z pełną szybkością, skoro sieć jest użytkowana tylko przeze mnie ?
5.11. Moje downloady są przerywane o 23:59 przy wpisie "acl day time 09:00-23:59" w squid.conf. Czy mogę coś z tym zrobić ?
5.12. SLogi squida robią się coraz dłuższe, co mogę z tym zrobić ?
5.13. CBQ to głupota; dlaczego nie mogę ściągnąć czegoś z pełną szybkością, skoro sieć jest użytkowana tylko przeze mnie ?
6. Różności
6.1. Użyteczne zasoby
7. Od tłumacza

1. Wstęp

Celem tego dokumentu jest dostarczenie łatwego rozwiązania do ograniczenia przychodzącego ruchu, jak również zapobieżenie zajęciu całego pasma przez użytkowników sieci lokalnej.

Przydaje się to w sytuacjach, kiedy nasze łącze internetowe jest wolne, a użytkownicy ściągają tony empetrójek albo najnowsze obrazy *.iso z Linuksem.


1.1. Nowe wersje tego dokumentu

Najnowszą wersję tego dokumentu można zawsze znaleźć na WWW pod adresem www.linuxdoc.org.

Nowe wersje tego dokumentu będą również umieszczane w różnych serwisach WWW i FTP poświęconych Linuksowi, ze szczególnym uwzględnieniem strony domowej projektu LDP www.linuxdoc.org.


1.2. Disclaimer

Ani autor, ani dystrybutorzy, ani tłumacz, ani żadna inna osoba mająca udział w powstawaniu i rozpowszechnianiu tego HOWTO nie są w żaden sposób odpowiedzialne za fizyczne, finansowe, moralne, ani żadne inne szkody powstałe w wyniku zastosowania się do porad zawartych w tym tekście.


1.3. Prawa autorskie i licencja

Dokument ten jest chroniony prawem autorskim 2001 przez Tomasza Chmielewskiego. Jest on udostępniony na warunkach Wolnej Licencji na Dokumentację GNU, do której można w niniejszym dokumencie znaleźć referencję.


1.4. Feedback and corrections

Jeśli masz jakieś pytania albo komentarze odnośnie tego dokumentu, skontaktuj się proszę pocztą elektroniczną z Tomaszem Chmielewskim pod adresem tch@metalab.unc.edu. Z chęcią przyjmę sugestie albo krytykę. Jeśli znajdziesz błąd rzeczowy albo typograficzny (a zapewne znajdziesz, angielski nie jest moim językiem ojczystym), daj mi znać, żebym mógł go poprawić w następnej wersji. Dzięki.


1.5. Podziękowania.

Chciałbym podziękować Ami M. Echeverri lula@pollywoog.com, która pomogła mi w konwersji tego HOWTO na format SGML oraz poprawiła kilka błędów. Dziękuję również Ryszardowi Prosowiczowi [prosowicz@poczta.fm] za cenne uwagi.


2. Zanim rozpoczniemy

Rozważmy następującą sytuację:


2.1. Czego potrzebujemy

Uwierz lub nie, zarządzanie przychodzącym z sieci ruchem jest łatwym zadaniem i nie potrzeba do tego czytania ton dokumentacji o routingu czy algorytmach kolejkowania.

Ażeby całość zmusić do pracy, potrzebujemy co najmniej pakietu proxy o nazwie squid; jeśli chcemy dodatkowo doszlifować konfigurację, należy ponadto zaznajomić się z progamami ipchains/iptables oraz CBQ.

W celu przetestowania efektów naszych wysiłków można zainstalować IPTraf..


2.2. Jak to działa ?

Squid jest prawdopodobnie najbardziej zaawansowanym serwerem proxy dostępnym na Linuksa. Pomoże on nam w zarządzaniu pasmem na dwa sposoby:

  • Pierwszy sposób wynika z podstawowej funkcjonalności serwerów proxy -- przechowują one już ściągnięte strony WWW, obrazki i inne obiekty na dysku albo w pamięci. Jeśli więc dwie osoby pobierają tą samą stronę internetową, nie jest ona ściągana z Internetu, ale z lokalnego serwera proxy.

  • Poza normalną funkcjonalnością cache'a, Squid udostępnia specjalną opcję zwaną pulami spowalniającymi (ang. delay pools). Dzięki nim możliwe jest w racjonalny sposób ograniczenie ruchu w sieci poprzez tzw. 'magiczne słowa' istniejące w zadanym URLu. Przykładowo, 'magicznym słowem' może być '.mp3', '.exe' czy '.avi'. Jako 'magiczne słowo' możemy zdefiniować każdą wyróżniającą się część URLa (taką, jak np. '.avi').

Z taką konfiguracją można nakazać squidowi ściąganie zadeklarowanych rodzajów plików z określoną prędkością (w naszym przykładzie będzie to ok. 5 kB/s). Jeśli użytkownicy w sieci lokalnej ściągają pliki w tym samym czasie, pliki te będą ściągane z transferem 5 kB/s łącznie, pozostawiając resztę pasma na strony WWW, pocztę, Usenet, irc, itd.

Oczywiście Internet nie jest używany wyłącznie do ściągania plików poprzez strony WWW (http albo ftp). W dalszej części dokumentu pokażemy, jak radzić sobie z ograniczeniem pasma dla Napstera, RealAudio i innymi przypadkami.


3. Instalacja i konfiguracja potrzebnego oprogramowania.

Niżej wyjaśnię, w jaki sposób zainstalować niezbędne oprogramowanie, ażeby ograniczyć i przetestować przepustowość pasma.


3.1. Instalacja squida z opcją pul spowalniających.

Jak wspomniałem powyżej, squid posiada opcję pul spowalniających (delay pools), która pozwala na kontrolę przepustowości pasma downloadu. Niestety w większości dystrybucji squid dostarczany jest bez tej opcji.

Jeśli więc posiadasz zainstalowanego squida, muszę Cię rozczarować -- musisz odinstalować go i zainstalować ponownie z opcją pul spowalniających aktywowanych w sposób opisany poniżej.

  1. W celu osiągnięcia maksymalnej wydajności z naszego proxy, najlepszym wyjściem jest stworzenie oddzielnej partycji dla jego cache'a, nazwanej /cache/. Jej rozmiar powinieneś ustawić na ok. 300 MB, w zależności od potrzeb.
    Jeśli nie wiesz, jak stworzyć oddzielną partycję, możesz stworzyć katalog /cache/ na głównej partycji, ale spowolni to nieco pracę squida.
  2. Dodajemy bezpiecznego użytkownika 'squid':

    # useradd -d /cache/ -r -s /dev/null squid >/dev/null 2>&1

    Nikt, nawet root, nie może zalogować się jako squid.
  3. Ściągamy źródła squida z http://www.squid-cache.org

    Podczas pisania tego dokumentu najnowszą wersją squida była wersja Squid 2.4 stable 1:

    http://www.squid-cache.org/Versions/v2/2.4/squid-2.4.STABLE1-src.tar.gz

  4. Rozpakowujemy całość do /var/tmp:

    # tar xzpf squid-2.4.STABLE1-src.tar.gz

  5. Kompilujemy i instalujemy squida (całość musi być w jednej linii):

    # ./configure --prefix=/opt/squid --exec-prefix=/opt/squid --enable-delay-pools --enable-cache-digests --enable-poll --disable-ident-lookups --enable-truncate --enable-removal-policies

    # make all

    # make install


3.2. Konfigurujemy squida do wykorzystania opcji pul spowalniających

  1. Konfigurujemy nasz plik squid.conf (znajdujący się w /opt/squid/etc/squid.conf):

    #squid.conf
    # Kazda opcja w tym pliku jest dobrze udokumentowana w oryg. pliku squid.conf
    # i na http://www.visolve.com/squidman/Configuration%20Guide.html
    
    #
    #Porty, na ktorych nasluchuje squid.
    http_port 8080
    icp_port 3130
    #zawartosc kat. cgi-bin nie bedzie cache'owana
    acl QUERY urlpath_regex cgi-bin \?
    no_cache deny QUERY
    #Dolne ograniczenie pamieci dla squida. Oczywiscie squid uzyje jej o wiele wiecej.
    cache_mem 16 MB
    #250 oznacza ze squid uzyje 250 MB przestrzeni dyskowej.
    cache_dir ufs /cache 250 16 256
    
    #Umiejscowienie logow squida.
    cache_log /var/log/squid/cache.log
    cache_access_log /var/log/squid/access.log
    cache_store_log /var/log/squid/store.log
    cache_swap_log /var/log/squid/swap.log
    #Ile razy rotowac logi przed usunieciem (wiecej szczegolow w FAQ)
    logfile_rotate 10
    
    redirect_rewrites_host_header off
    cache_replacement_policy GDSF
    acl localnet src 192.168.1.0/255.255.255.0
    acl localhost src 127.0.0.1/255.255.255.255
    acl Safe_ports port 80 443 210 119 70 20 21 1025-65535
    acl CONNECT method CONNECT
    acl all src 0.0.0.0/0.0.0.0
    http_access allow localnet
    http_access allow localhost
    http_access deny !Safe_ports
    http_access deny CONNECT
    http_access deny all
    maximum_object_size 3000 KB
    store_avg_object_size 50 KB
    
    #Ustaw te opcje, jesli chcesz skonfigurowac proxy w trybie transparentnym.
    #Transparentne proxy oznacza, ze nie musisz konfigurowac wszystkich
    #przegladarek klienckich, ale ma rowniez pewne wady.
    #Pozostawienie tej opcji odkomentowanej nie wyrzadzi zadnej szkody.
    
    httpd_accel_host virtual
    httpd_accel_port 80
    httpd_accel_with_proxy on
    httpd_accel_uses_host_header on
     
    #Wszyscy uzytkownicy sieci lokalnej beda widziani przez zewnetrzne serwery www,
    #jak gdyby uzywali Mozilli na Linuksie :)
    anonymize_headers deny User-Agent
    fake_user_agent Mozilla/5.0 (X11; U; Linux i686; en-US; rv:0.9.6+) Gecko/20011122
     
    #Azeby przyspieszyc nasze polaczenie, nalezy wpisac dwie linie
    #podobne do tych ponizej. Pokazuja one na nadrzedny serwer proxy, z ktorego bedzie
    #korzystal nasz squid. Nie zapomnij ustawic serwera na ten,
    #ktory bedzie dla Ciebie najszybszy!
    #Zmierz pingi, tracerouty itd.
    #Upewnij sie, ze porty http i icp sa poprawne.
    
    #Odkomentuj, jesli trzeba, linie zaczynajace sie od "cache-peer".
    #To jest proxy, ktorego zamierzasz uzyc do wszystkich polaczen
    #cache_peer w3cache.icm.edu.pl parent 8080 3130 no-digest default
    
    #... poza polaczeniami i adresami IP rozpoczynajacymi sie od "!"
    #cache_peer_domain w3cache.icm.edu.pl !.pl !7thguard.net !192.168.1.1
    
    #Ponizsza opcja przydaje sie, jesli chcemy korzystac z Cache Managera.
    #Skopiuj cachemgr.cgi do katalogu cgi-bin swojego serwera WWW.
    #Plik dostepny jest pod adresem:
    #http://your-web-server/cgi-bin/cachemgr.cgi
    cache_mgr your@email
    cachemgr_passwd secret_password all
     
    #To jest nazwa uzytkownika, pod ktora bedzie dzialal squid.
    cache_effective_user squid
    cache_effective_group squid
     
    log_icp_queries off
    buffered_logs on
     
     
    #####DELAY POOLS - PULE SPOWALNIAJACE
    #To jest najwazniejsza czesc dla zarzadzania ruchem przychodzacym przez squida.
    #Szczegoly znajdziesz w pliku squid.conf albo w dokumentach na http://www.squid-cache.org
     
    #Nie chcemy ograniczac downloadow z naszej sieci lokalnej.
    acl magic_words1 url_regex -i 192.168
     
    #Chcemy ograniczyc sciaganie ponizszych typow plikow
    #Wszystkie nazwy nalezy umiescic w jednej linii
    acl magic_words2 url_regex -i ftp .exe .mp3 .vqf .tar.gz .gz .rpm .zip .rar .avi .mpeg .mpe .mpg .qt
    .ram .rm .iso .raw .wav .mov
    #Nie blokujemy plikow .html, .gif., .jpg ani podobnych, poniewaz na ogol
    #nie pochlaniaja one duzej czesci pasma.
    
    #WChcemy ograniczyc pasmo podczas dnia, oraz nie ograniczac go przez noc.
    #Uwaga! Z acl-em ustawionym tak, jak ponizej, sciaganie plikow
    #moze zostac przerwane o 23:59. Jesli chesz tego uniknac, przeczytaj sekcje 'FAQ'.
    acl day time 09:00-23:59
     
    #Ustawiamy 2 pule spowalniajace
    #Zajrzyj do dokumentacji squida, zeby zaznajomic sie z pojeciami
    #delay_pools and delay_class.
    delay_pools 2
     
    #Pierwsza pula spowalniajaca
    #Nie chcemy spowalniac naszego ruchu lokalnego
    #Z trzech zadeklarowanych klas spowalniania zajmiemy sie tylko druga.
    #Pierwsza (1) i druga (2) klasa spowalniania
    delay_class 1 2
     
    #-1/-1 oznacza, ze nie ustawiamy ograniczen
    delay_parameters 1 -1/-1 -1/-1
     
    #magic_words1: 192.168 ktore ustawilismy wczesniej
    delay_access 1 allow magic_words1
     
    
    #Druga pula spowalniajaca.
    #Chcemy spowolnic sciaganie plikow opisanych jako magic_words2.
    #Druga (2) klasa spowalniajaca drugiego typu (2)
    delay_class 2 2
     
    #Numery tutaj to wartosci w bajtach;
    #nalezy pamietac, ze squid nie bierze pod uwage bitow startu/stopu
    #5000/150000 to wartosci dla calej sieci
    #5000/120000 to wartosci dla pojedynczego IP
    #kiedy sciagane pliki przekrocza okolo 150000 bajtow
    #(albo nawet dwa albo trzy razy tyle)
    #beda one dalej sciagane z predkoscia ok. 5000 bajtow/s.
     
    delay_parameters 2 5000/150000 5000/120000
    #'day' (dzien) zostal ustawiony wczesniej jako 09:00-23:59.
    delay_access 2 allow day
    delay_access 2 deny !day
    delay_access 2 allow magic_words2
    
    
    #EOF

    Teraz, kiedy wszystko jest już skonfigurowane, upewniamy sie, ze wszystko w katalogach /opt/squid oraz /cache należy do użytkownika 'squid'.

    # mkdir /var/log/squid/

    # chown squid:squid /var/log/squid/

    # chmod 770 /var/log/squid/

    # chown -R squid:squid /opt/squid/

    # chown -R squid:squid /cache/

    Teraz można juz uruchomić squida. Przed pierwszym uruchomieniem musimy stworzyć jego katalogi cache:

    # /opt/squid/bin/squid -z

    Uruchamiamy squida i sprawdzamy, czy wszystko działa. Dobrym narzędziem do tego celu jest IPTraf; mozna go znaleźć na  http://freshmeat.net. Upewnij się wcześniej, że ustawiłeś odpowiednio proxy w swojej przeglądarce (w naszym przykładzie 192.168.1.1, port 8080):

    # /opt/squid/bin/squid

    Jeśli wszystko działa poprawnie, dodajemy linię /opt/squid/bin/squid na koncu naszych plikow inicjalizujacych. Na ogół jest to /etc/rc.d/rc.local.

    Inne użyteczne opcje w squidzie to:

    # /opt/squid/bin/squid -k reconfigure (it reconfigures Squid if we made any changes in its squid.conf file)

    # /opt/squid/bin/squid -help :) self-explanatory

    Możesz skopiować również cachemgr.cgi do katalogu cgi-bin swojego serwera WWW, ażeby skorzystać z pożytecznego Cache Managera.


3.3. Rozwiązywanie pozostałych problemów.

OK, zainstalowaliśmy squida i skonfigurowaliśmy pule spowalniające. Założę się, że nikt nie chce być ograniczany, a już na pewno nie nasi cwani użytkownicy sieci lokalnej. Z pewnością będą próbowali ominąć nasze ograniczenia, ściągając swoje ulubione empetrójki nieco szybciej (doprowadzając Cię w ten sposób do bólu głowy).

Zakładam, że na swojej sieci używasz maskowania IP tak, żeby użytkownicy mogli korzystać z IRC, ICQ, e-maila, itd. To dobrze, ale musimy się upewnić, że nasi użytkownicy będą używać spowalnianego squida, żeby korzystać z WWW albo FTP.

Większość z tych problemów można rozwiązać przy użyciu ipchains (jądra Linuksa serii 2.2.x) bądź też iptables (jądra serii 2.4.x). 


3.3.1. Jądra serii 2.2.x (ipchains)

Na początku należy się upewnić, że nikt nie będzie nas chciał oszukać, korzystając z innego serwera proxy niż nasz. Publiczne serwery proxy operują zazwyczaj na portach 3128 oraz 8080:

/sbin/ipchains -A input -s 192.168.1.1/24 -d ! 192.168.1.1 3128 -p TCP -j REJECT

/sbin/ipchains -A input -s 192.168.1.1/24 -d ! 192.168.1.1 8080 -p TCP -j REJECT

Musimy również upewnić się, że nikt nie będzie próbował nas oszukać poprzez bezpośrednie przyłączenie się do Internetu (IP-Masquerade) w celu ściągania stron WWW:

/sbin/ipchains -A input -s 192.168.1.1/24 -d ! 192.168.1.1 80 -p TCP -j REDIRECT 8080

Jeśli wszystko działa, dodajemy te linie na końcu naszych skryptów inicjalizujących. Zazwyczaj jest to /etc/rc.d/rc.local.

Moglibyśmy również zablokować ruch ftp na portach 20 i 21, żeby wymusić użytkowanie squida, ale nie jest to dobry pomysł co najmniej z dwóch powodów:

  • Squid został zaprojektowany jako proxy http ze wsparciem dla ftp, a nie jako proxy ftp. Może on ściągać pliki z ftp, jak również ładować pliki na ftp, ale nie potrafi usuwać/zmieniać nazw plików na zdalnych serwerach ftp.

    Kiedy zablokujemy porty 20 i 21, nie będziemy w stanie usuwać / zmieniać nazw plików na zdalnych serwerach ftp.

  • IE 5.5 zawiera błąd -- przy ściąganiu katalogu ftp nie korzysta on z proxy, a zamiast tego łączy się bezpośrednio przez IP-masquerade.

    Kiedy zablokujemy porty 20 i 21, nie będziemy w stanie przeglądać katalogów ftp przy użyciu IE5.5.

Nadmierny ruch poprzez ftp można blokować innymi metodami. Omówimy to w rozdziale 4.


3.3.2. Jądra serii 2.4.x (iptables)

Na początku należy się upewnić, że nikt nie będzie nas chciał oszukać, korzystając z innego serwera proxy niż nasz. Publiczne serwery proxy operują zazwyczaj na portach 3128 oraz 8080:

/sbin/iptables -A FORWARD -s 192.168.1.1/24 -d ! 192.168.1.1 --dport 3128 -p TCP -j DROP

/sbin/iptables -A FORWARD -s 192.168.1.1/24 -d ! 192.168.1.1 --dport 8080 -p TCP -j DROP

Musimy również upewnić się, że nikt nie będzie próbował nas oszukać poprzez bezpośrednie przyłączenie się do Internetu (IP-Masquerade) w celu ściągania stron WWW:

/sbin/iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 80 -j REDIRECT --to-port 8080

Jeśli wszystko działa, dodajemy te linie na końcu naszych skryptów inicjalizujących. Zazwyczaj jest to /etc/rc.d/rc.local.

Moglibyśmy również zablokować ruch ftp na portach 20 i 21, żeby wymusić użytkowanie squida, ale nie jest to dobry pomysł co najmniej z dwóch powodów:

  • Squid został zaprojektowany jako proxy http ze wsparciem dla ftp, a nie jako proxy ftp. Może on ściągać pliki z ftp, jak również ładować pliki na ftp, ale nie potrafi usuwać/zmieniać nazw plików na zdalnych serwerach ftp.

    Kiedy zablokujemy porty 20 i 21, nie będziemy w stanie usuwać / zmieniać nazw plików na zdalnych serwerach ftp.

  • IE 5.5 zawiera błąd -- przy ściąganiu katalogu ftp nie korzysta on z proxy, a zamiast tego łączy się bezpośrednio przez IP-masquerade.

    Kiedy zablokujemy porty 20 i 21, nie będziemy w stanie przeglądać katalogów ftp przy użyciu IE5.5.

Nadmierny ruch poprzez ftp można blokować innymi metodami. Omówimy to w rozdziale 4.


4. Obsługa innych protokołów zabierających dużo pasma przy użyciu CBQ.

Musimy pamiętać, że nasi użytkownicy LAN mogą zniweczyć nasze wysiłki z rozdziału 3, jeśli będą używali Napstera, Kazaa albo Realaudio. Musimy rownież pamiętać, że nie zablokowaliśmy ruchu ftp z rozdziału 3.3.

Osiągniemy to w inny sposób -- nie przez bezpośrednie, ale pośrednie ograniczanie dowloadów. Jeśli Twój interfejs internetowy to ppp0, a połączenie intranetowe to eth0, ograniczymy ruch wychodzący z interfejsu eth0, ograniczając przez to ruch przychodzący na ppp0.

W tym celu zaznajomimy się z CBQ u skryptem cbq.init. Możesz ściągnąć go z ftp://ftp.equinox.gu.net/pub/linux/cbq/.
Ściągnij cbq-init-v0.6.2 i umieść go w /etc/rc.d/.

Potrzebujemy również zainstalowanego iproute2. Narzędzie to jest dostarczane z każdą dystrybucją Linuksa.

Spójrzmy teraz do katalogu /etc/sysconfig/cbq. Umieszczony tam przykładowy plik powinien współpracować z cbq.init. Jeśli go tam nie ma, prawdopodobnie nie wkompilowałeś tego do jądra albo nie jest ono skompilowane jako moduł. Tak czy inaczej, stwórz po prostu taki katalog, skopiuj tam przykładowe pliki pokazane poniżej i sprawdź, czy to działa.


4.1. FTP

W rozdziale 3, nie blokowaliśmy ftp z dwóch przyczyn -- tak, ażebyśmy mogli dokonywać uploadów i żeby użytkownicy z zapluskwionym IE5.5 mogli przeglądać katalogi ftp. Naszym celem jest sprawienie, ażeby nasze przeglądarki i klienty ftp ściągały pliki poprzez squida, a także żeby uploady/zmiany nazw/usuwanie plików mogło być dokonywane poprzez IP-masquerade.

Tworzymy plik o nazwie cbq-10.ftp-network w katalogu /etc/sysconfig/cbq:

# touch /etc/sysconfig/cbq/cbq-10.ftp-network

Wstawiamy do niego następujące linie:

DEVICE=eth0,10Mbit,1Mbit
RATE=15Kbit
WEIGHT=1Kbit
PRIO=5
RULE=:20,192.168.1.0/24
RULE=:21,192.168.1.0/24

Opis tych linii można znaleźć w pliku cbq.init-v0.6.2.

Kiedy startuje skrypt /etc/rc.d/cbq-init-v0.6.2, czyta on Twoje opcje konfiguracyjne umieszczone w /etc/sysconfig/cbq:

# /etc/rc.d/cbq.init-v0.6.2 start

Jeśli wszystko działa, dodajemy /etc/rc.d/cbq-init-v0.6.2 start na końcu skryptów inicjalizujących. Zazwyczaj jest to /etc/rc.d/rc.local.

Dzięki tej komendzie Twój serwer nie prześle żadnych danych ftp poprzez eth0 szybciej niż ok. 15 kb/s, a przez to nie ściągnie żadnych danych ftp z Internetu szybciej niż 15 kb/s. Użytkownicy Twojej sieci zobaczą, że lepiej do ściągania poprzez ftp lepiej będzie użyć squida. Będą oni również mogli przeglądać katalogi ftp przy użyciu zapluskwionego IE5.5.

IE5.5 zawiera również jeszcze jeden błąd -- kiedy klikniesz prawym przyciskiem myszy na katalogu ftp, a następnie wybierzesz opcję 'Kopiuj do folderu', plik zostanie ściągnięty nie poprzez proxy, ale bezpośrednio poprzez IP-masquerade, a przez to omijając squida z ustawionymi pulami spowalniającymi.


4.2. Napster, Realaudio, Windows Media i inne zagadnienia.

W takich przypadkach idea jest taka sama, jak przy ftp; dodajemy po prostu kolejny port i ustawiamy dedykowaną prędkość.

Tworzymy plik cbq-50.napster-network w katalogu /etc/sysconfig/cbq/:

# touch /etc/sysconfig/cbq/cbq-50.napsterandlive

W pliku powinny się znaleźć poniższe linie:

DEVICE=eth0,10Mbit,1Mbit
RATE=35Kbit
WEIGHT=3Kbit
PRIO=5
#Windows Media Player.
RULE=:1755,192.168.1.0/24
#Real Player uzywa portu TCP 554, przy UDP sa to rozne porty,
#ale na ogol RealAudio w UDP nie pochlania wiele pasma.
RULE=:554,192.168.1.0/24
RULE=:7070,192.169.1.0/24
#Napster uzywa portow 6699 i 6700, moze jeszcze jakiegos?
RULE=:6699,192.168.1.0/24
RULE=:6700,192.168.1.0/24
#Audiogalaxy uzywa portow od 41000 do prawdopodobnie 41900,
#jest ich wiele, wiec zapamietaj, ze nie wymienie tutaj ich wszystkich;
#powtarzanie 900 prawie takich samych linii byloby bezcelowe;
#Wycinamy po prostu porty 410031-41900 przy uzyciu ipchains / iptables.
RULE=:41000,192.168.1.0/24
RULE=:41001,192.168.1.0/24
#kontynuuj od 41001 do 41030
RULE=:41030,192.168.1.0/24
#Niektorzy chytrzy uzytkownicy podczas uzywania Napstera czy Audiogalaxy
#moga laczyc sie do serwisow SOCKS; dobrym pomyslem jest rowniez identyczna
#blokada w razie uzywania przez Ciebie wlasnych serwerow SOCKS
RULE=:1080,192.168.1.0/24
#Tutaj dodaj inne porty, jakie chcesz; porty uzywane przez programy mozna latwo
#wysledzic programem IPTraf
#RULE=:port,192.168.1.0/24

Nie zapomnij wyciąć pozostałych portów Audiogalaxy (41031-41900) przy użyciu ipchains (jądra 2.2.x) albo iptables (jądra 2.4.x).

Jądra 2.2.x.

/sbin/ipchains -A input -s 192.168.1.1/24 -d ! 192.168.1.1 41031:41900 -p TCP -j REJECT

Jądra 2.4.x

/sbin/iptables -A FORWARD -s 192.168.1.1/24 -d ! 192.168.1.1 --dport 41031:41900 -p TCP -j REJECT

Nie zapomnij dodać odpowiedniej linii do Twoich skryptów inicjalizujących.


5. FAQ - Najczęściej zadawane pytania.


5.2. Jak zmusić wgeta do pracy ze squidem ?

To proste. Stwórz plik o nazwie .wgetrc i umieść do w swoim katalogu domowym. Wstaw do niego poniższe linie i gotowe!

HTTP_PROXY=192.168.1.1:8080
FTP_PROXY=192.168.1.1:8080

Tę metodę możesz również zastosować globalnie dla wszystkich użytkowników, wpisz man wget, a dowiesz się, jak.


5.3. Ustawiłem nasłuchiwanie serwera SOCKS na porcie 1080 i nie mogę połączyć się z serwerem irc.

Przyczyny tego problemu mogą być dwie.

Pierwsza to działanie proxy SOCKS jako open relay co oznacza, że może go używać każdy w dowolnym miejscu na świecie. To zagadnienie związane jest z bezpieczeństwem i powinieneś powtórnie sprawdzić konfigurację serwera SOCKS - na ogół serwery irc nie zezwalają serwerom SOCKS pracującym jako open relaye na połączenia z nimi.

Jeśli jesteś pewien, że serwer SOCKS nie pracuje jako open relay, a nadal nie możesz połączyć się z jakimś serwerem irc - zazwyczaj pomaga sprawdzenie, czy serwer SOCKS nie pracuje na porcie 1080 podłączonego klienta. W takim wypadku po prostu zrekonfiguruj SOCKS tak, żeby pracował na innym porcie. Zrekonfiguruj również oprogramowanie w sieci, żeby używały poprawnego serwera i portu SOCKS.


5.4. Nie podoba mi się, że Kazaa albo Audioalaxy zapychają mi całe pasmo uploadu.

To rzeczywiście boli, ale można to łatwo ustawić.

Stwórz plik o nazwie np. /etc/sysconfig/cbq/cbq-15.ppp.

Wstaw do niego linie, jak poniżej, a Kazaa ani Audiogalaxy nie będą mogły uploadować plików z prędkością większą, niż 15 kb/s. Zakładam, że Twój wychodzący interfejs internetowy to ppp0.

DEVICE=ppp0,115Kbit,11Kbit
RATE=15Kbit
WEIGHT=2Kbit
PRIO=5
TIME=01:00-07:59;110Kbit/11Kbit
RULE=,:21
RULE=,213.25.25.101
RULE=,:1214
RULE=,:41000
RULE=,:41001
#I tak dalej, az do :41030
RULE=,:41030

5.5. Mój serwer poczty wychodzącej zapycha całe pasmo.

Możesz ograniczyć Twojego SMTP, Postfixa, senmaila albo cokolwiek w sposób podobny do podanego powyżej. Wystarczy, że zmienisz albo dodasz poniższą regułkę:

RULE=,:25

Co więcej, jeśli masz serwer SMTP, możesz wymusić na użytkownikach korzystanie z niego nawet, jeśli mają oni ustawiony jakis.inny.smtp! Zrobimy to w sposób przezroczysty tak, jak zrobiliśmy to ze squidem.


5.6. Czy mogę ograniczyć moje serwery FTP albo WWW w sposób pokazany w przykładzie powyżej ?

Na ogół tak, ale zazwyczaj takie serwery mają własne konfiguracje ograniczające pasmo, więc na ogół zechcesz rzucić okiem na ich dokumentację.

Jądra serii 2.2.x.

/sbin/ipchains -A input -s 192.168.1.1/24 -d ! 192.168.1.1 25 -p TCP -j REDIRECT 25

Jądra serii 2.4.x.

/sbin/iptables -t nat -A PREROUTING -i eth0 -p tcp --dport 25 -j REDIRECT --to-port 25

Nie zapomnij dodać odpowiedniej linii do skryptów inicjalizujących.


5.8. Za każdym razem, kiedy startuję cbq.init, system zgłasza brakujące sch_cbq.

Prawdopodobnie nie dysponujesz w swoim systemie CBQ zainstalowanym jako moduł. Jeśli wkompilowałeś CBQ w jądro, odkomentuj poniższe linie w swoim skrypcie cbq.init-v0.6.2.

### Jesli wkompilowales w jadro cbq, tbf i u32, odkomentuj to
#for module in sch_cbq sch_tbf sch_sfq sch_prio cls_u32; do
#        if ! modprobe $module; then
#               echo "**CBQ: nie moge zaladowac modulu $module"
#               exit
#        fi
#done

5.9. CBQ czasami z nieznanych przyczyn odmawia współpracy.

Zasadniczo coś takiego nie powinno mieć miejsca. Czasem można zaobserwować masowe downloady mimo, że zablokowałeś wszystkie porty, których używa Napster czy Audiogalaxy. Zawsze bowiem otwarty do downloadów pozostaje jakiś dodatkowy port. Chcąc go namierzyć, możesz użyć programu IPTraf. Może okazać się to trudne, ponieważ takich portów mogą być tysiące. Jeśli chcesz ułatwić sobie zadanie, możesz rozważyć użycie własnego serwera SOCKS - Napster, Audiogalaxy i wiele programów moze używać proxy SOCKS i łatwiej jest poradzić sobie z jednym portem, niż z tysiącami (standardowy port SOCKS to 1080, jeśli uruchamiasz własny serwer SOCKS, port może być ustawiony inaczej; możesz też ustawić wiele SOCKS nasłuchujących na różnych portach). Nie zapomnij zamknąć dla ruchu wszystkich portów, a pozostawić otwarte porty takie, jak 25 czy 110 (SMTP i POP3) czy inne, potencjalnie użyteczne. Odnośnik do serwera proxy socks Nylon znajdziesz na końcu tego HOWTO.


5.10. Pule spowalniające to głupi pomysł; dlaczego nie mogę ściągnąć czegoś z pełną szybkością, skoro sieć jest użytkowana tylko przeze mnie ?

Niestety, tutaj możesz zrobić niewiele.

Jedyne, co możesz zrobić, to użyć i zrekonfigurować crona na godz. 1.00 w nocy tak, żeby squid nie używał pul spowalniających, i zrekonfigurować go ponownie o 7.30, kiedy chcesz przywrócić pule spowalniające.

W tym celu stwórz dwa oddzielne pliki konfiguracyjne, nazwane np. suid.conf-day oraz squid.conf-night, i umieść je w /opt/squid/etc/.

squid.conf-day będzie dokładną kopią pliku stworzonego wcześniej.

squid-conf-night dla odmiany nie będzie miał żadnych linii definiujących pule spowalniające, więc wszystko, co musisz zrobić, to je wykomentować.

Następna rzecz, którą musisz zrobić, to dobrze ustawić wpisy w /etc/crontab.

Do /etc/crontab wpisz następujące linie:

#SQUID - nocna i dzienna zmiana konfiguracji
01 9 * * * root /bin/cp -f /opt/squid/etc/squid.conf-day /opt/squid/etc/squid.conf; /opt/squid/bin/squid -k reconfigure
59 23 * * * root /bin/cp -f /opt/squid/etc/squid.conf-night /opt/squid/etc/squid.conf; /opt/squid/bin/squid -k reconfigure

5.11. Moje downloady są przerywane o 23:59 przy wpisie "acl day time 09:00-23:59" w squid.conf. Czy mogę coś z tym zrobić ?

Możesz to osiągnąć poprzez usunięcie tego acl, jak również "delay_access 2 allow dzien delay_access 2 deny !dzien" z pliku squid.conf.

Spróbuj tego samego z cronem tak, jak w przykładzie powyżej.


5.12. Logi squida robią się coraz dłuższe, co mogę z tym zrobić ?

Rzeczywiście, im więcej masz użytkowników, tym wiecej informacji - czasem nawet użytecznej 0 będzie logowanej.

Najlepszym sposobem na poradzenie sobie z tym byłoby użycie logrotate, ale musiałbyś użyć małego tricku, żeby zadziałało to ze squidem - właściwych wpisów w cron-ie i logrotate.

wpis w /etc/crontab

#SQUID - logrotate
01 4 * * * root /opt/squid/bin/squid -k rotate; /usr/sbin/logrotate /etc/logrotate.conf; /bin/rm -f /var/log/squid/*.log.0

Tutaj spowodowaliśmy, że logrotate startuje codziennie o 04:01, usuń więc pozostałe punkty, skąd startuje logrotate, np. z /etc/cron.daily.

Wpis w /etc/logrotate.d/syslog:

#SQUID logrotate - zachowa logi przez 40 dni
/var/log/squid/*.log.0 {
rotate 40
compress
daily
postrotate
/usr/bin/killall -HUP syslogd
endscript
}

5.13. CBQ to głupota; dlaczego nie mogę ściągnąć czegoś z pełną szybkością, skoro sieć jest użytkowana tylko przeze mnie ?

Szczęściarzu, to jest możliwe!

Są na to 2 sposoby:

Pierwszy podobny jest do tego zastosowanego ze squidem. Wstaw linię podobną do poniższej do pliku konfiguracyjnego CBQ umieszczonego w /etc/sysconfig/cbq:

TIME=00:00-07:59;110Kbit/11Kbit

Możesz mieć wiele paramatrów TIME w swoim pliku konfiguracyjnym CBQ.

Musisz jednak uważać, skrypt cbq.init-v.0.6.2 zawiera błąd - nie pozwoli Ci ustawić pewnych czasów, jak np. 00:00-08:00. Chcąc upewnić się, że wszystko działa poprawnie, uruchom cbq.init-0.6.2, a następnie wewnątrz ustawionego czasu wpisz

/etc/rc.d/cbq.init-v0.6.2 timecheck

Poniżej przykład pokazujący prawdidłowe wyjście:

[root@mangoo rc.d]# ./cbq.init start; ./cbq.init timecheck **CBQ: 3:44: class 10 on eth0 changed rate (20Kbit -> 110Kbit) **CBQ: 3:44: class 40 on ppp0 changed rate (15Kbit -> 110Kbit) **CBQ: 3:44: class 50 on eth0 changed rate (35Kbit -> 110Kbit)

W tym przykładzie coś poszło nie tak, prawdopodobnie w drugim pliku konfiguracyjnym umieszczonym w /etc/sysconfig/cbq (drugi plik konfiguracyjny licząc od najniższego numeru w swojej nazwie:

[root@mangoo rc.d]# ./cbq.init start; ./cbq.init timecheck **CBQ: 3:54: class 10 on eth0 changed rate (20Kbit -> 110Kbit) ./cbq.init: 08: value too great for base (error token is "08")

Drugi sposób na nauczenie CBQ inteligencji jest trudniejszy - nie jest on uzależniony od czasu. Możesz o tym poczytać w dokumentcie 'Linux 2.4 Advanced Routing HOWTO', ze wskazaniem na komendę tc.


6. Różności

7. Od tłumacza

Niniejsze HOWTO zostało przetłumaczone na język polski przez Łukasza Karcza torero@poczta.onet.pl i do niego należą prawa autorskie do tłumaczenia. Jeśli znajdziesz w nim jakieś błędy, proszę o kontakt, żebym mógł je poprawić.

Przeniesienie niniejszego dokumentu na format HTML, poprawa drobnych literówek i aktualizacja linków - Leszek Żur. Oryginał tego dokumentu (w jęz. angielskim) można znaleźć na http://www.tldp.org/HOWTO/Bandwidth-Limiting-HOWTO/index.html