
Доброго Утра, Дня, Вечера, Ночи!
В этой статье я расскажу как быстро сделать систему мониторинга загрузки каналов по VLAN'ам с помощью iptables,rrdtool и cgi.
Мне надо было в срочном порядке промониторить и предоставить начальству графики нагрузки интернет канала с World трафиком и канала с UA-IX трафиком. Для не знающих:
UA-IX — Украинская Сеть обмена трафиком, дочернее предприятие ИнАУ, созданное на основе работающей с августа 2000 года одноимённой сети обмена трафиком. Цель создания UA-IX — обеспечение максимальной связности сетей украинских провайдеров и организация эффективного обмена трафиком между ними по кратчайшим маршрутам, без выхода в зарубежные сети. По своему объему, значимости и сфере деятельности Сеть — уникальное предприятие Украины.
Но с помощью данного способа можно строить графики для любых VLAN'ов и не только.
Допустим, что World vlan->555, UA-IX vlan->777, xxx->Ваша нумерация правил iptables.
add_ipt.sh:
#!/bin/sh
/sbin/ipfw add 00xxx count ip from any to any in via vlan555
/sbin/ipfw add 00xxx count ip from any to any out via vlan555
/sbin/ipfw add 00xxx count ip from any to any in via vlan777
/sbin/ipfw add 00xxx count ip from any to any out via vlan777
Всё, трафик считается, осталось дело за малым, первое это создать rrd базу с данными, второе это заполнить нашу базу данными счётчиков и вывести на web-страничку. Приступим.
Несколько значений для следующего скрипта:
RRDPATH — каталог в, котором будем хранить базу rrd для наших VLAN'ов и графиков.
inW — входящий World трафик.
outW — исходящий World трафик.
inUA — входящий UA-IX трафик.
outUA — исходящий UA-IX трафик.
myvlans.rrd — имя Вашей базы rrd.
create_db.sh:
#!/bin/sh
RRDPATH=/var/rrd/db
rrdtool create $RRDPATH/myvlans.rrd --step 60 \
DS:inW:COUNTER:600:0:999999999 \
DS:outW:COUNTER:600:0:999999999 \
DS:inUA:COUNTER:600:0:999999999 \
DS:outUA:COUNTER:600:0:999999999 \
RRA:AVERAGE:0.5:1:525600
Теперь скрипт апдейта нашей базы rrd, чтобы графики были актуальны :)
update_db.sh:
#!/bin/sh
RRDPARH=/var/rrd/db
inW=`/sbin/ipfw show xxx | /usr/bin/awk '{print $3}'`
outW=`/sbin/ipfw show xxx | /usr/bin/awk '{print $3}'`
inUA=`/sbin/ipfw show xxx | /usr/bin/awk '{print $3}'`
outUA=`/sbin/ipfw show xxx | /usr/bin/awk '{print $3}'`
`/usr/local/bin/rrdtool update $RRDPATH/myvlans.rrd N:$inW:$outW:$inUA:$outUA`
inW,outW,inUA,outUA,RRDPATH — эти значения Вам уже знакомы. Обратите внимание на 'xxx' — это номера Ваших правил iptables.
Не забудем добавить в cron обновление нашей базы:
* * * * * /path_to_scripts/update_db.sh
И затем сделаем небольшую страничку для отображения наших «картинок»:
your_script.cgi
#!/usr/local/bin/rrdcgi
<html>
<head>
<title>MYVLANS TRAFFIC</title>
</head>
<body>
<p>
<RRD::GRAPH world_1d.png --width 600 --height 200 --start -1d --end now --title "WORLD TRAFFIC" --imginfo '<img src=%s width=%lu height=%lu>' DEF:inoctets=/var/rrd/db/myvlans.rrd:inW:AVERAGE DEF:outoctets=/var/rrd/db/myvlans.rrd:outW:AVERAGE "CDEF:inbits=inoctets,8,*" "CDEF:outbits=outoctets,8,*" AREA :inbits#00FF00:"In traffic" LINE1:outbits#0000FF:"Out traffic">
</p><p>
<RRD::GRAPH uaix_1d.png --width 600 --height 200 --start -1d --end now --title "UA-IX TRAFFIC" --imginfo '<img src=%s width=%lu height=%lu>' DEF:inoctets=/var/rrd/db/myvlans.rrd:inUA:AVERAGE DEF:outoctets=/var/rrd/db/myvlans.rrd:outUA:AVERAGE "CDEF:inbits=inoctets,8,*" "CDEF:outbits=outoctets,8,*" AREA :inbits#00FF00:"In traffic" LINE1:outbits#0000FF:"Out traffic">
</p>
</body>
</html>
Кладём данную страничку куда-нибудь в /var/www, это уже по желанию и теперь смотрим на наши графики, заходим на 'http://server_address/path_to_graph/your_script.cgi':


Всё проделывалось на OS FreeBSD 8.2, RRDtool 1.4.7.
Спасибо за внимание!