sobota, 20 marca 2010 
Start arrow FreeBSD arrow FIREWALL arrow Dummynet - dzielenie ??cza
Menu BSD4u
FreeBSD
OpenBSD
NetBSD
Dla *BSD
FAQ BSD4u
Forum BSDGuru.org
Security Advisory
Licencje
Images BSD
Menu ogólne
Start
Aktualności
Download
Sondy
Szukaj
Linki
Książki
About BSD4u
Info
Team BSD4u
Regulamin
Kanał #BSD4u
Kontakt
Sondy
Co sądzisz o naszym nowym Projekcie, i jak oceniasz zmianę koncepcji Projektu?
 
Popularne
SQUID - najpopularni...
Kompilacja i konfigu...
Samba - serwer plikó...
Neostrada+ i modem ...
NATowanie czyli jak ...
Upgrade systemu
Apache (konfiguracja...
Praktyczne IPFW
MRTG - statystyki ru...
CVSup - pomocny podc...
Neostrada na modemie...
Postfix - bezpieczny...
Postfix z autoryzacj...
System Portów (Kolek...
Postfix oparty na ba...
Top Download
File icon Postfix - "Krok po kroku" v1.17872
File icon Postfix - "Krok po kroku" v1.06767
File icon PPTPd - "Prosty i szybki VPN" v1.0b6329
File icon sdi.sh3878
File icon uEagle 1.0p12972
File icon named.sh2940
File icon uEagle 0.99b2868
File icon cs.sh2825
File icon uEagle 1.02757
File icon uEagle 1.12567
Ostatnie komentarze
JAK NIE DZIALA opti...
Dodał: wierzba86
Dnia: 2010-02-25 21:37:29
JAK NIE DZIALA opti...
Dodał: wierzba86
Dnia: 2010-02-25 21:36:09
RE: transparent a v...
Dodał: Trash
Dnia: 2009-10-06 15:45:18
transparent a virus...
Dodał: grzywka18
Dnia: 2008-05-13 11:19:58
hmm
Dodał: dzibi
Dnia: 2007-12-12 10:01:14
Bez tytułu
Dodał: grzywka18
Dnia: 2007-12-11 17:46:06
Dummynet - dzielenie ??cza Drukuj E-mail
Oceny: / 34
KiepskiBardzo dobry 
piątek, 08 sierpnia 2003 - Napisał: Artur Kulda (33983 odsłon)

Dummynet to wspaniałe narzędzie pozwalające nam, na kształtowanie ruchu w systemie FreeBSD. Jeśli zajmujesz się badaniami w dziedzinie sieci komputerowych, na pewno ten pakiet przypadnie ci do gustu. Również, jeśli posiadasz niedużą sieć i chcesz aby każdy zużywał tyle samo pasma, na pewno też ten pakiet będzie pomocny.

0.1 Instalacja

Aby zainstalować dummynet należy stosownie skonfigurować jądro. Zazwyczaj w pliku konfiguracyjnym jądra wystarczy dodać te trzy opcje:

options IPFIREWALL
options IPFIREWALL_DEFAULT_TO_ACCEPT
options DUMMYNET

Druga opcja nie jest konieczna, ale gdy posiadamy inny pakiet, który odpowiada za firewall (na przykład ipfilter), to opcja ta jest pomocna, ponieważ domyślnie nie blokuje nam żadnych pakietów. Nic nie stoi na przeszkodzie, aby blokowaniem pakietów zajmował się ipfilter, a profilowaniem ruchu, ipfw/dummynet.

Aby system po starcie automatycznie ładował regułki, należy dodać poniższą linijkę do /etc/rc.conf. Należy pamiętać, że plik /etc/ipfw.rules różni się nieco składnią, od składni poleceń użytych w tym dokumencie, mianowicie, nie posiada polecenia ipfw na początku każdej linijki.

firewall_enable="YES"
firewall_rules="/etc/ipfw.rules"

0.2 Elementy sterujące ruchem

Na elementy sterujące ruchem składają się tzw. rury i kolejki, lub jeśli ktoś woli, potoki. Każdy z tych elementów składowych może być skonfigurowany tak, aby automatycznie wrzucał do takiej kolejki lub rury ruch, który zostanie mu przydzielony. Ponadto, można wprowadzić dodatkowy element losowego wyboru danej rury/kolejki. Aby zacząć profilować ruch, należy najpierw dodać kolejkę lub rurę, a potem ją skonfigurować. Wszystkiego dokonujemy komendą ipfw.

0.3 Rury

Rura, to kanał wydzielonego ruchu, który ma z góry zadaną przepustowość (bw), długość kolejki (queue), opóźnienie (delay) oraz losową utratę pakietów (plr). Ograniczanie ruchu jest realizowane poprzez kolejkowanie pakietów, i odkolejkowywanie ich z określoną szerokością pasma. Gdy kolejka przepełnia się, pakiety zostają odrzucone. Aby dodać i skonfigurować przykładową rurę, wydajemy polecenie:

ipfw add pipe 1 ip from any to any
ipfw pipe 1 config bw 1Mbit/s plr 0.9 delay 100ms

Rura, którą skonfigurowaliśmy, ma szerokość 1 megabita, losową utratę pakietów 90%, oraz opóźnienie 100 milisekund1. Przydatność takiej rury jest raczej wątpliwa, chyba że symulujemy jakąś wyjątkowo oporną sieć. Aby usunąć tą rurę, należy wydać polecenie:

ipfw pipe 1 delete

lub

ipfw flush

Druga komenda czyści wszystkie reguły ipfw. Wracając do naszej rury: czasami zachodzi potrzeba zasymulowania różnych warunków transmisji na drodze od- i do- hosta. Sytuację taką można łatwo zaimplementować stosując następujące polecenia definiujące dwie rury, jedną dla ruchu przychodzącego i jedną dla wychodzącego:

ipfw add pipe 1 ip from any to 10.0.0.1 in
ipfw add pipe 2 ip from any to 10.0.0.1 out
ipfw pipe 1 config bw 640Kbit/s
ipfw pipe 2 config bw 128Kbit/s

W tym wypadku słowo kluczowe in aplikuje się do adresu 10.0.0.1, tak więc, parametr bw 640Kbit/s aplikuje się do ruchu wchodzącego do tego adresu. Druga rura obsługuje ruch wychodzący. Jeśli mamy potrzebę zasymulować wielościeżkowość, wystarczy skorzystać ze słowa kluczowego prob. Przykład poniżej:

ipfw add prob 0.2 pipe 1 ip from any to any 
ipfw add prob 0.5 pipe 2 ip from any to any
ipfw pipe 1 config delay 10ms
ipfw pipe 2 config delay 200ms

W tym wypadku, pierwsza rura jest wybierana w 20% przypadków, podczas gdy druga, w 0.5×0.8 czyli 40% przypadków. Rury lub kolejki można również przypisywać po protokole lub po porcie. Robimy to w następujący sposób:

ipfw add pipe 1 tcp from any to any 80 
ipfw add pipe 2 udp from any to any 53
ipfw add pipe 3 icmp from any to any
ipfw pipe 1 config bw 1Mbit/s 
ipfw pipe 2 config bw 50Kbit/s 
ipfw pipe 3 config bw 50Kbit/s

Powyższy zestaw reguł pozwala nam na zagwarantowanie obustronnego pasma w protokole TCP na porcie 80 (www) o szerokości jednego megabita, oraz po 50 kilobitów na DNS (UDP,53), oraz ICMP (ping, traceroute, wiadomości o błędach niedostępności, etc.). Przedostatnim słowem kluczowym, które chciałbym omówić jest queue. Domyślna wartość tego parametru to 50. Parametr ten określa porcję danych (w pakietach lub kilobajtach), które mają zostać urzymane w kolejce do przetworzenia w danej rurze. Jeśli ta ilość zostanie przekroczona, pakiet zostaje odrzucony. Ma to znaczenie przy połączeniach na których pasmo jest bardzo wąskie. Gdy na takim połączeniu ustawimy ten parametr przesadnie wysoko, będziemy się musieli liczyć z dużym opóźnieniem (system musi przetworzyć na takim wąskim łączu wszystkie pakiety oczekujące w kolejce). Ustawianie tego parametru zbyt nisko, będzie miało swoje konsekwencje w postaci utraconych pakietów (szczególnie, gdy z danym hostem wymianę informacji prowadzi kilka innych hostów).

Ostatni parametr to mask. Pozwala on nam na tworzenie kilku identycznych rur, z których każda będzie obsługiwać ruch tego samego rodzaju. Opcja ta jest szczególnie użyteczna, gdy chcemy kilku komputerom przydzielić taki sam ruch w sieci LAN. Tworzy ona dynamicznie kilka rur o identycznych parametrach.

ipfw add pipe 1 ip from any to 10.0.0.0/24
ipfw pipe 1 config bw 56Kbit/s queue 10 mask dst-ip 0x000000ff

Powyższa konfiguracja ogranicza ruch w obie strony do każdego komputera do 56 kilobitów, zmniejsza kolejkę do 10 pakietów. Słowo kluczowe dst-ip pokazuje nam która część adresu IP ma być ,,zamaskowana'' aby wydzielić ruchy należące do innych dynamicznie tworzonych rur. Ruch można dzielić według adresu źródłowego i docelowego, źródłowego i docelowego portu, oraz protokołu. Składnia wygląda następująco:

ipfw add pipe 1 ip from any to 10.0.0.0/24
ipfw pipe 1 config bw 100Kbit/s proto PROTO src-ip 
ŹRÓDŁOIP dst-ip CELIP src-port ŹRÓDŁOPORT dst-port CELPORT

0.4 Kolejki

Kolejka to inny element sterujący ruchem. W znacznym uproszczeniu, kolejka pozwala nam na przydzielenie odpowiedniej szerokości pasma użytkownikowi, stosownie do jego potrzeb. Zazwyczaj kolejka jest podłączana do rury w następujący sposób:

ipfw add pipe 2 ip from any to any 
ipfw add queue 1 ip from 10.0.0.2 to 10.0.0.1
ipfw queue 1 config weight 5 pipe 2
ipfw pipe 2 config bw 300Kbit/s

Tak zdefiniowany zestaw reguł, określa kolejkę wewnątrz rury numer 2, która posiada wagę 5 (Im wyższa waga, tym kolejka ma wyższy priorytet). Kolejki służą zazwyczaj do dynamicznego dzielenia pasma pomiędzy kilka połączeń. Parametry kolejek to pipe czyli rura, do której podpięta jest kolejka, weight, czyli ,,priorytet'' obsługi ruchu, queue, czyli rozmiar kolejki, plr, czyli losowa utrata pakietów w kolejce, oraz mask, czyli opcja służąca do dynamicznego definiowania kolejek w zależności od klasyfikacji ruchu.

Jak działają ,,wagi'' kolejek? Aby łatwiej zilustrować to zagadnienie, posłużę się przykładem. Załóżmy, że w sieci mamy trzy hosty, z czego na 10.0.0.1 zainstalowany jest dummynet i jego konfiguracja wygląda następująco:

ipfw add pipe 1 ip from any to any
ipfw add queue 1 ip from 10.0.0.2 to 10.0.0.1
ipfw add queue 2 ip from 10.0.0.3 to 10.0.0.1
ipfw queue 1 config weight 1 pipe 1
ipfw queue 1 config weight 99 pipe 1
ipfw pipe 1 config bw 1Mbit/s

Przy drobnej zmianie opóźnień oraz długości kolejki, osiąg przesyłu przy kolejce pierwszej będzie się wahał w okolicach 50 kbit, podczas gdy w przypadku drugiej kolejki, będzie to około 950 kbit. Kolejki o różnych wagach przepuszczają dane w różnych porcjach, tj. na każdy pakiet przesłany kolejką pierwszą może przypadać 30 pakietów wysyłanych kolejką drugą.

Aby dynamicznie podzielić dane nam pasmo przez liczbę użytkowników, należy skorzystać z opcji mask.

ipfw add queue 1 all from any to 10.0.0.0/24 
ipfw queue 1 config weight 5 pipe 2 buckets 253 mask dst-ip 0x000000ff

Taka konfiguracja dynamicznie stworzy nam tyle kolejek ile jest różnych, aktywnych adresów IP w tej podsieci. Opcja buckets mówi ile takich kolejek może być maksymalnie stworzonych. Nie należy przesadzać przy podawaniu tej wielkości, ponieważ zbyt duża wartość może niepotrzebnie zapełnić bufory sieciowe.

0.5 Ciekawe przykłady zastosowań

Scenariusz 1 Symulacja połączenia satelitarnego.

ipfw add pipe 1 all from any to any in
ipfw add pipe 2 all from any to any out
ipfw pipe 1 config delay 440ms bw 64Kbit/s queue 10
ipfw pipe 2 config delay 440ms bw 1Mbit/s queue 5

Przy wysokich opóźnieniach będziemy obserwować stopniowe ,,przyspieszanie'' połączenia2. Zmiana wielkości kolejki nie powinna mieć znaczenia, chyba że mamy do czynienia z transmisją do kilku komputerów. Jest to uwarunkowane tym, jak skonstruowany jest protokół TCP: na każdy pakiet wysłany, musi zostać odebrany pakiet potwierdzający odbiór.

Scenariusz 2 Bardzo zajęty serwer WWW.

ipfw add queue 1 tcp from any to 10.0.0.1 80
ipfw queue 1 config weight 5 pipe 1 mask src-ip 0xffffffff

Przy takiej konfiguracji, każdy numer IP ma wydzielone identyczne pasmo do serwera www. Zwróć uwagę na maskę src-ip. Zwróćmy też uwagę na to, że chcąc ustalić numer portu musimy określić protokół jako TCP.

ipfw add queue 1 tcp from 10.1.0.0/8 to 10.0.0.1 80
ipfw add queue 2 tcp from any to 10.0.0.1 80
ipfw queue 1 config weight 90 pipe 1 mask src-ip 0x00ffffff
ipfw queue 2 config weight 5 pipe 1 mask src-ip 0xffffffff

Przy takiej konfiguracji, serwer WWW będzie obsługiwał pewną grupę użytkowników z wyższym priorytetem niż resztę. Każdemu klientowi zostanie przydzielone to samo pasmo.

ipfw add pipe 1 tcp from 10.1.0.0/8 to 10.0.0.1 80
ipfw add pipe 2 tcp fron any to 10.0.0.1 80
ipfw queue 1 config weight 5 pipe 1 mask src-ip 0x00ffffff
ipfw queue 2 config weight 5 pipe 2 mask src-ip 0xffffffff
ipfw pipe 1 config 7Mbit/s
ipfw pipe 2 config 3Mbit/s

Przy powyższej konfiguracji, łącze najpierw jest podzielone dwoma rurami, odpowiednio po 7 i 3 Megabity, a potem dzielone pomiędzy klientów w poszczególnych rurach tak, aby klient należący do każdej z rur dzielił ruch z innymi klientami z tej samej rury dostając równą ilość pasma.

Scenariusz 3 Sieć osiedlowa.

ipfw add queue 50 tcp from 10.0.0.0/24 to any 80
ipfw add queue 60 tcp from 10.0.0.0/24 to any 22,23,25
ipfw add queue 70 tcp from 10.0.0.0/24 to any 110
ipfw add queue 80 tcp from 10.0.0.0/24 to any
ipfw add queue 90 all from 10.0.0.0/24 to any
ipfw queue config 50 weight 5 pipe 50 buckets 255 mask src-ip 0x000000ff
ipfw queue config 60 weight 5 pipe 60 buckets 255 mask src-ip 0x000000ff
ipfw queue config 70 weight 5 pipe 70 buckets 255 mask src-ip 0x000000ff
ipfw queue config 80 weight 5 pipe 80 buckets 255 mask src-ip 0x000000ff
ipfw pipe 50 config bw 1Mbit/s
ipfw pipe 60 config bw 128Kbit/s
ipfw pipe 70 config bw 128Kbit/s
ipfw pipe 80 config bw 1Mbit/s delay 30ms queue 10
ipfw pipe 90 config bw 384Kbit/s

Pierwsze pięć linijek, dzieli nam ruch wychodzący na pięć kategorii; przedostatnia to ruch p2p3, ostatnia to ruch UDP/ICMP. Kolejne cztery linijki określają nam zasady dynamicznego tworzenia kolejek ruchu, i ostatnie pięć linijek określa nam maksymalne szerokości pasma, które chcemy zaalokować na poszczególne klasy ruchu.

0.6 Na zakończenie

Mam nadzieję, że ten dokument pomógł ci zrozumieć zasadę działania pakietu DUMMYNET pod systemem FreeBSD. Jednocześnie, chciałbym podkreślić, że dokument ten został przygotowany w oparciu o doświadczenia własne autora i może zawierać błędy. Autor nie odpowiada za konsekwencje wynikłe z użytkowania tego dokumentu.

Jeżeli masz jakieś sugestie lub chcesz mnie poinformować o błędzie, zawsze jestem otwarty na słowa konstruktywnej krytyki. Mój e-mail to jps(at)zero.iti.pk.edu.pl.

Jeżeli nadal czujesz niedosyt informacji, przeczytaj ten dokument:
http://info.iet.unipi.it/~luigi/ip_dummynet/ 

Footnotes:

1. opóźnienie narzucane przez dummynet, należy powiększyć o jakiekolwiek opóźnienie propagacji, aby otrzymać efektywne opóźnienie dla dwóch maszyn pracujących w sieci. Co więcej, należy wziąć pod uwagę podwójną propagację, ponieważ w tym konkretnym wypadku, zarówno ruch wchodzący jak i wychodzący jest przepuszczany przez tą samą regułę.

2. Okazuje się, że opoźnienia całkowite poniżej 19 milisekund, nie mają znacznego wpływu na transmisję danych na pełnodupleksowym ethernecie, po protokole TCP. Od 20 milisekund, opóźnienia zaczynają mieć wpływ na transmisję, a prędkość transmisji (w kilobajtach na sekundę) można uzyskać z następującego wzoru: transferTCP = [ 32000 /( delayms )]

3. na przykład Kazaa lub Gnutella


Autor: Jan Szumiec
jps(at)zero.iti.pk.edu.pl

(C) 2002 Jan Szumiec. Dokument ten może być rozprowadzany i powielany pod warunkiem, że jego treść nie ulegnie modyfikacji, oraz że wiadomość o autorze pozostanie w dokumencie. Najnowsza wersja zawsze dostępna z http://ftyczka.org/dummynet.pdf 

Komentarze:

Tylko zarejestrowani użytkownicy mogą pisać komentarze.
Prosze zaloguj się i dodaj komentarz.

Powered by AkoComment!

Ostatnio aktualizowany ( wtorek, 08 listopada 2005 )

« wstecz   dalej »
Ciekawostki
Chcesz szybko znaleźć program? Użyj "locate nazwa_programu".
Pobierz
FreeBSD
OpenBSD
NetBSD
DragonFlyBSD
PC-BSD
FreeSBIE LiveCD
4.4BSD Lite
Domeny
Google

Google


Newsletter
Zapisz się na nasz newsletter, jeżeli chcesz być na bieżąco informowany o aktualnościach..




Licznik odwiedzin
Odwiedziło już nas
3086995
Internautów od lutego 2003

Korzystamy ze statysyk