background image

26

Maj 2004

www.linux-magazine.pl

Zabawa w Kopciuszka, 

czyli zliczanie pakietów

Żeby  móc  zacząć  robić  statystyki,  musia-
łem najpierw posortować ruch według ka-
tegorii, które chciałem później analizować.
Interesowały mnie tak naprawdę cztery ka-
tegorie ruchu:

całość ruchu wychodzącego z serwera

ruch wychodzący w kierunku TP S.A.

ruch wychodzący w kierunku GTS, w tym
wypadku głównego dostawcy łącza

ruch  wychodzący  ftp  generowany  przez
użytkownika,  z którego  prawami  działał
serwer ftp z dostępem anonimowym

Po przeszukaniu freshmeat.net i googlowa-
niu za odpowiednimi narzędziami, ostatecz-
nie okazało się, że poczciwe iptables jest do-
skonałym  narzędziem  do  zabawy  w Kop-
ciuszka.

Wykorzystałem łańcuch mangle, który po-

zwalał na znakowanie pakietów według kate-
gorii określonych powyżej. Poza możliwością
znakowania ruchu, mangle jest celem nieter-
minującym, czyli pakiety, które zostaną wysła-
ne do tego właśnie celu, są dalej przetwarzane
przez iptables. Do samego ograniczania ruchu
ftp z serwera skorzystałem z pomocy tc.

Poniżej krok po kroku przedstawiam konfi-

gurację iptables, która pozwoliła na pogrupo-
wanie ruchu, oznakowanie ruchu i okresowe
zbieranie statystyk.

Na początek dla porządku czyszczę cały łań-

cuch mangle:

iptables -t mangle -F

Żeby  móc  coś  powiedzieć  o ilości  danych

przesyłanych  w określonym  kierunku,  po-
trzebowałem informacji o sumie ruchu wy-
chodzącego z serwera. Aby oznakować cały
ruch, utworzyłem własny łańcuch i tam skie-
rowałem  wszystkie  pakiety  wychodzące.
W łańcuchu tym pakiety wpadające do niego
otrzymują znacznik 0x11.

iptables -t mangle -X all_data
iptables -t mangle -N all_data
iptables -t mangle -A OUTPUT -o 

U

$ETH -j all_data
iptables -t mangle -A all_data 

U

-j MARK --set-mark 0x11

Oczywiście można to zrobić w jednym łańcu-
chu, ale ponieważ zliczane będą jeszcze inne
grupy pakietów, zależało mi na jednakowym
sposobie sumowania ruchu wychodzącego.

Podobnie  znakowany  będzie  ruch  wycho-

dzący  w kierunku  operatora.  Warto  zwrócić
uwagę, że znaczniki nadane we wcześniejszych
liniach będą nadpisywane przez kolejne, jeśli
pakiety trafią do różnych łańcuchów. W tym
przypadku będzie tak zawsze, ponieważ każdy
pakiet wychodzący w kierunku GTS jest także
pakietem wychodzącym w ogóle.

iptables -t mangle -X gts
iptables -t mangle -N gts

iptables -t mangle -A OUTPUT -o 

U

$ETH -d 195.94.192.0/19 -j gts
iptables -t mangle -A OUTPUT -o 

U

$ETH -d 217.8.160.0/19 -j gts
iptables -t mangle -A OUTPUT -o 

U

$ETH -d 217.153.0.0/16 -j gts

iptables -t mangle -A gts -j 

U

MARK --set-mark 0x21

Pojawia się przy okazji pytanie – skąd brać
aktualne zakresy adresów IP przypisane do
danego operatora?. Te dane udostępniają ser-
wery whois. Jeśli chcę uzyskać spis sieci przy-
znanych TP S.A., wystarczy użyć polecenia:

rrd i iptables

COVER STORY

Prosty sposób monitorowania obciążenia łącza do Internetu za pomocą rrd i iptables.

Monitorowanie ruchu 

za pomocą rrd i iptables

W

trakcie tej dyskusji przerzuca-
no  się  statystykami  błędów,
obciążeń,  wielkością  styków

z danym operatorem, itp. Dodatkowo po-
jawiło się wiele głosów omawiających kie-
runki,  w których  idzie  większość  ruchu
internetowego od większych i mniejszych
operatorów,  pomiędzy  jakimi  sieciami
wymiana  ruchu  jest  zbliżona,  gdzie  jest
asymetryczna  itd.  Ponieważ  sam  byłem
ciekaw, jak to jest naprawdę i kto w rze-
czywistości korzysta z danych zgromadzo-
nych na moim serwerze, postanowiłem się
temu przyjrzeć.

Sytuacja była o tyle skomplikowana, że cho-

dzi o jeden serwer z Linuksem na pokładzie,
a nie o router z oprogramowaniem gotowym
do  generowania  takich  statystyk  za  pomocą
NetFlow. Ostatecznie okazało się to prostsze
niż się spodziewałem i już wiadomo, od kogo
można żądać peeringu.

Celem było potwierdzenie lub zaprzeczenie

tezie, jakoby gros ruchu z większości sieci szło
w kierunku TP S.A., przy okazji dodatkowym
zadaniem  było  ograniczenie  ruchu  FTP  do
określonego poziomu. Całość musiała się roz-
strzygnąć  przy  pomocy  narzędzi  ogólnie  do-
stępnych w oparciu o dane zgromadzone z nie-
dużego serwera z Linuksem, z serwerem ftp
z popularną zawartością i kilkoma mniejszymi
rzeczami (WWW, SMTP, POP3). 

Ostatnio przez Internet przetoczyła się dyskusja spowodowana problema-

mi z transmisją na styku sieci akademickich – Pol-34 i siecią TP S.A. 

Oczywiście, jak zwykle poszło o pieniądze i dodatkowo można było od-

nieść wrażenie, że poza pieniędzmi chodziło o ambicje dwóch, bardzo du-

żych jak na polskie warunki sieci. 

MARCIN MAZUREK

Marcin Mazurek. Użytkow-
nik i entuzjasta Linuxa.
Obecnie pracownik GTS
Polska.

AUTOR

background image

COVER STORY

rrd i iptables

27

www.linux-magazine.pl 

Maj 2004

-n -v -x
Chain ftp (1 references)

pkts bytes target prot opt in 

U

out source destination

1002842 1356515158 MARK all -- 

U

* * 0.0.0.0/0 0.0.0.0/0 MARK 

U

set 0x41

Połowa zadania jest wykonana: pakiety zo-
stały poznakowane i są już zliczane. Ruch ftp
mogę następnie w dogodny dla siebie sposób
ograniczyć za pomocą tc.

tc qdisc del dev $ETH root
tc qdisc add dev $ETH root 

U

handle 1: htb default 10

tc class add dev $ETH parent 1: 

U

classid 1:1 htb rate 2mbit ceil 

U

2mbit

tc class add dev $ETH parent 1:1 

U

classid 1:10 htb rate 2mbit prio 1
tc class add dev $ETH parent 1:1 

U

classid 1:20 htb rate 1024kbit 

U

prio 2

tc qdisc add dev $ETH parent 

U

1:10 handle 10: sfq perturb 10
tc qdisc add dev $ETH parent 

U

1:20 handle 20: sfq perturb 10

tc filter add dev $ETH protocol 

U

ip parent 1: prio 2 handle 0x41 \

fw flowid 1:20

Wykresy

Teraz przydałoby się pokazać zebrane dane
w jakiejś rozsądnej postaci. Zdecydowałem
się  na  rrd,  które  jest  następcą  zasłużonego
i wysłużonego mrtg. rrd daje znacznie więk-
sze  możliwości,  jeśli  chodzi  o manipulację
danymi  gromadzonymi  w bazach.rrd,  jak
i o prezentację wyników w formie wykresów.

Na początku trzeba stworzyć plik.rrd, w któ-

rym będą zbierane informacje:

rrdtool create stats.rrd -s 60 \

DS:all_data:COUNTER:600:0:U \
DS:gts:COUNTER:600:0:U \
DS:tpnet:COUNTER:600:0:U \
DS:ftp:COUNTER:600:0:U \
RRA:AVERAGE:0.5:1:10080 \
RRA:AVERAGE:0.5:2:5040 \
RRA:AVERAGE:0.5:4:2520 \
RRA:AVERAGE:0.5:6:1680 \
RRA:AVERAGE:0.5:180:56 \
RRA:AVERAGE:0.5:360:28 

Polecenie to tworzy plik stats.rrd, inicjując

kolejno cztery źródła danych – DS. Każde ze
źródeł  będzie  przechowywać  informacje
o określonym typie ruchu. Minimalna wartość
została ustalona na 0, maksymalna jest niezde-
finiowana U. Dane będą pobierane co 60 se-
kund, a przechowywane próbki określane są
przez rekordy RRA.

RRA:AVERAGE:0.5:1:10080

Średnia z jednej próbki, czyli z 60 sekund;
przechowywanych będzie 10080 próbek, co
daje ostatecznie: 10080 min / 60 minut / 24
godziny = 7 dni.

RRA:AVERAGE:0.5:180:56

Średnia ze 180 próbek, czyli z trzech godzin;
przechowywanych  będzie  56  próbek.  Osta-
tecznie daje to:

3 godziny * 56 próbek 
= 174 godziny = 7 dni.

Po  szczegółowy  opis  parametrów  rrd  odsy-
łam do stron rrd. Warto tylko dodać, że jako
typ danych został wybrany COUNTER, po-
nieważ pozwala on zliczać stale rosnące dane
i dobrze radzi sobie z przewijającymi się licz-
nikami.

Następnie  będę  wypełniać  plik  stats.rrd

danymi oczytywanymi w odstępach jednomi-
nutowych.  Do  tego  wykorzystam  prosty
skrypcik uruchamiany poprzez cron w nastę-
pujący sposób:

* * * * * /home/mazek/bin/update.sh

Sam skrypt ma za zadanie odczytać stan licz-
ników dla podanych łańcuchów oraz wpro-
wadzić te dane do bazy rrd.

#!/bin/bash

ITM='/sbin/iptables -t mangle'

# Pobieramy liczbę bajtów z

U

podanego łańcucha.
ALL_DATA=`$ITM -L all_data -n -x 

U

-v | tail -n 1 | awk -F ' ' 

U

{'print $2;'}`

GTS=`$ITM -L gts -n -x -v | tail 

U

-n 1 | awk -F „ ' {'print $2; '}`

TPNET=`$ITM -L tpnet -n -x -v | 

U

tail -n 1 | awk -F ' ' {'print 

U

vix:~# whois -h 

U

filtergen.level3.net RIPE::AS5617

vix:~# whois -h 

U

filtergen.level3.net RIPE::AS5617
Prefix list for policy 

U

RIPE::AS5617 = RIPE::AS5617

80.48.0.0/13
83.0.0.0/11
194.204.128.0/18
...

Podobnie jak powyżej oznaczałem pakiety
skierowane do sieci GTS, oznaczam pakie-
ty wychodzące do sieci TP S.A. Należy tyl-
ko  zmienić  zakresy  sieci  docelowych
(opcja  -d)  oraz  znacznik,  którego  użyję
(opcja -set-mark).

iptables -t mangle -X tpnet
iptables -t mangle -N tpnet
iptables -t mangle -A OUTPUT -o 

U

$ETH -d 80.48.0.0/13 -j tpnet
iptables -t mangle -A OUTPUT -o 

U

$ETH -d 83.0.0.0/11 -j tpnet
iptables -t mangle -A OUTPUT -o 

U

$ETH -d 194.204.128.0/18 -j tpnet
...
...
iptables -t mangle -A tpnet -j 

U

MARK --set-mark 0x31

Pozostaje  mi  policzyć  pakiety  wysyłane  do
użytkowników mojego serwera ftp. Tę regułę
zostawiam na koniec po to, aby żadne inne
nie nadpisały znacznika w przypadku ściąga-
nia danych z serwera ftp przez użytkowni-
ków GTS. Gdyby znakowanie według adre-
sów GTS następowało po znakowaniu ruchu
ftp, nie mógłbym później ograniczać ruchu
z serwera FTP, bo część znaczników została-
by nadpisana.

iptables -t mangle -X ftp
iptables -t mangle -N ftp

iptables -t mangle -A OUTPUT 

U

-o $ETH \
-m owner --uid-owner anonftp -j ftp

iptables -t mangle -A ftp -j 

U

MARK --set-mark 0x41

Następnie sprawdzam, czy ruch jest rzeczy-
wiście zliczany:

vix:~# iptables -t mangle -L ftp 

U

background image

LINE2:tpnet#fff000:'Ruch 

U

do TPNET'\

LINE2:ftp#00ffff:'Ruch ftp 

U

z serwera'\

LINE2:www#888282:'Ruch www 

U

z serwera'\

COMMENT:' '\

COMMENT:'$COMMENT' \
--vertical-label 'bits/sek'

To polecenie wykonuję za każdym
razem, kiedy chcę obejrzeć najnow-

sze dane z pliku stats.rrd. Można je

także  wrzucić  do  crona  i wykony-
wać  w wybranych  okresach  czasu.
Wykres wygenerowany za pomocą
tego polecenia będzie prezentował
dane  z ostatnich  trzydziestu  sze-

ściu godzin (129600 sekund). Para-
metr  DEF  określa  źródło  danych

i sposób ich interpretowania. Mnie intere-
suje wartość średnia z przedziału czasowe-
go, czyli AVERAGE. Ponieważ chcę poka-
zać  całość  na  jednym  wykresie,  definiuję
cztery  źródła  danych.  Linię  wykreślającą
całość  ruchu  z serwera  rysuję  najgrubszą
linią – LINE3, kolorem czerwonym – war-
tość rgb: ff0000, pozostałe będą kreślone li-
nią średniej grubości – LINE2 w różnych
kolorach. Na dole wygenerowanego obraz-
ka dodana zostanie legenda łącząca kolory
z określonym typem ruchu pokazywanego
oraz komentarz. 

Rysunek 1 pokazuje wszystkie typy ruchu

monitorowanego na jednym wykresie. Każdy
rodzaj ruchu pokazywany jest za pomocą linii.
Użyteczność  tego  typu  wykresów  jest  więc
ograniczona. 

Żeby nie mieszać rzeczy niepowiązanych ze

sobą, czyli statystyk typu ruchu (FTP, WWW)
i celu  danych  (TP  S.A.,  GTS),  rozbijam  po-
przedni wykres na dwa oraz próbuję sprawić,
żeby stał się bardziej czytelny.

rrdtool graph stats2.gif 

U

--title='Ruch z eth vix, 

U

z podzialem na sieci' \

-w 700 --start -129600 \
DEF:all_data=

U

stats.rrd:all_data:AVERAGE \

DEF:gts= stats.rrd:gts:AVERAGE \
DEF:tpnet=

U

stats.rrd:tpnet:AVERAGE \

AREA:all_data#0000ff:

U

'Cały ruch z vix'\

AREA:tpnet#fff000:'Ruch do TPNET'\
STACK:gts#ff0000:'Ruch do GTS'\
--vertical-label 'bits/sek'

Rysunek 2 pokazuje zestakowane dane o ru-
chu wychodzącym według celu pakietów wy-
chodzących. 

rrdtool graph stats3.gif 

U

--title='Ruch z eth vix, 

U

z podzialem na usługi' \

-w 700 --start -129600 \
DEF:all_data= 

U

stats.rrd:all_data:AVERAGE \

DEF:ftp= stats.rrd:ftp:AVERAGE \
DEF:www= stats.rrd:www:AVERAGE \
AREA:all_data#0000ff:'Cały ruch 

U

z vix'\

AREA:ftp#00ffff:'Ruch FTP'\
STACK:www#888282:'Ruch WWW'\
--vertical-label 'bits/sek'

Rysunek 3 pokazuje zestakowane dane o ru-
chu  wychodzącym  według  usług.  W tym
przypadku badamy jedynie FTP i WWW.

W obydwu przypadkach utworzone zostały

wykresy pokazujące dane z ostatnich sześciu
godzin. Źródła danych (DEF) zostały ograni-
czone tylko do tych, które mnie interesują. Co
najważniejsze, zmienił się także sposób prezen-
tacji. Zamiast linii wykreślających poziom ru-
chu danego typu, pokazuję wypełnione obsza-
ry. W obydwu przypadkach całość ruchu jest
pokazywana kolorem granatowym. Na Rysun-
ku 2 na obszarze granatowym pokazywane są
dane o ruchu do sieci GTS i TP S.A. Ruch do
sieci TP S.A. pokazany jest za pomocą koloru
żółtego, do sieci GTS za pomocą koloru czer-
wonego. Jak widać, można spokojnie rozpoczy-
nać negocjacje z TP S.A. w kwestii darmowej
wymiany ruchu.  Co ważne, ruch do różnych
sieci pokazywany jest w formie zestakowanych,
a nie nakładających się obrazów, dzięki użyciu
słowa  kluczowego  STACK.  Podobnie  jest  na
Rysunku 3, który pokazuje różne typy ruchu.
Granatowy kolor oznacza całość ruchu wycho-
dzącego, jasnoniebieski obszar to wychodzący
ruch FTP, a szary obszar to ruch WWW.

Jak  widać,  za  pomocą  prostych  i po-

wszechnie dostępnych narzędzi można uzy-
skać bardzo ciekawe informacje. Oczywiście
rozwiązania te nie zastąpią zintegrowanych
narzędzi  do  analizy  ruchu,  ale  w dużym
stopniu  mogą  ułatwić  zarządzanie  siecią
i dostępnym pasmem.

$2; '}`

FTP=`$ITM -L ftp -n -x -v | tail 

U

-n 1 | awk -F ' ' {'print $2; '}`

# Wprowadzamy dane pobrane do 

U

pliku.rrd
rrdtool update stats.rrd 

U

N:$ALL_DATA:$GTS:$TPNET:$FTP

Tu zaczyna się najlepsze, czyli rysowanie te-
go,  co  zgromadziłem.  rrd  daje  pod  tym
względem ogromne możliwości w porówna-
niu do swojego poprzednika – mrtg. Możli-
wości prezentacji danych przez rrd w różno-
raki  sposób  są  naprawdę  imponujące  i dla
kogoś, kto wcześniej korzystał z mrtg – wręcz
przytłaczające.

Na początek zgromadzę wszystkie dane na

jednym wykresie:

COMMENT='Ostatnia aktualizacja: 

U

'` date +'%d/%m/%Y %T'`

rrdtool graph stats1.gif 

U

--title='Ruch wychodzący z vix' \

-w 700 --start -129600 \
DEF:all_data=

U

stats.rrd:all_data:AVERAGE \

DEF:gts= stats.rrd:gts:AVERAGE \
DEF:tpnet=

U

stats.rrd:tpnet:AVERAGE \

DEF:ftp= stats.rrd:ftp:AVERAGE \
DEF:www= stats.rrd:www:AVERAGE \
HRULE:100000#000000:'MAX limit” \
LINE3:all_data#0000ff:

U

'Cały ruch z vix'\

LINE2:gts#ff0000:'Ruch do GTS'\

rrd i iptables

COVER STORY

28

Maj 2004

www.linux-magazine.pl

[1] Strona domowa projektu RRD

http://www.rrdtool.com

[2] Strona domowa projektu NetFilter

http://www.netfilter.org

INFO

Rysunek 1: Wykres pokazujący ws0zystkie typy zlicza-

nego ruchu.

Rysunek 2: Ruch pogrupowany według celu danych.

Rysunek 3: Ruch pogrupowany według typu danych.

background image

W W W . L I N U X - M A G A Z I N E . P L

MAGAZYN O ZAAWANSOWANYCH ZASTOSOWANIACH LINUKSA

Linux Magazine w Internecie:

OBSŁUGA PRENUMERATY

Wszystkie sprawy związane z prenumeratą możesz zała-
twić sam na naszych stronach WWW. Można tutaj uak-
tualnić dane adresowe, przedłużyć przenumeratę lub
zmienić jej parametry.

POMOC DLA CZYTELNIKÓW

Chcemy pomagać naszym Czytelnikom w poznawaniu
Linuksa. Na naszych stronach WWW znajdziesz kompe-
tentne informacje. Zaprawszamy również do korzysta-
nia z naszej listę mailingowej.

CO W NASTĘPNYM NUMERZE?

Dowiedz się pierwszy, co będzie w następnym numerze
Linux Magazine. Każdego miesiąca publikujemy pełny
spis treści oraz kilka wybranych artykułów z numeru Li-
nux Magazine wchodzącego właśnie do sprzedaży.

ARCHIWUM ONLINE

Pełna zawartość numerów archiwalnych dostępna bez-
płatnie (dla osób prywatnych) w postaci plików PDF.
Funkcja pełnotekstowego wyszukiwania pozwoli łatwo
znaleźć potrzebne informacje.

WWW.LINUX-MAGAZINE.PL

WIADOMOŚCI

Na stronach WWW Linux Magazine znajdziesz najnowsze wiadomości ze świata Linuksa.