>[оверквотинг удален]
>
> Озадачили вопросом - нужно считать траффик на интерфейсе сервера.
>Кол-во ОЗУ там ограничено, поэтому очень не хочется, чтобы SNMPd постоянно в
>памяти висел.
>
>Кто-нибудь сталкивался с подобной проблемой? Если да - как решалось?
> Подумывал я брать данные скриптом из netstat -ib, но думаю, что
>погрешность "измерений" будет очень большая. Существуют ли консольные программки, которые просто
>бы выводили данные значения? (как тот нетстат, к примеру - кол-во
>бит К/ОТ)? Здаров.
Скажу, что сам очень долго искал метод подсчета траффика, который был бы точным и с мин. потреблением системных ресурсов.
Остановился на следующем: ng_ntflow + flow-tools.
Для этого в ядро нада вкомпилить потдержку netgraph.
Реализация:
1. Снимаем флоу-поток с интерфейса.
#!/bin/sh
# PROVIDE: ngnetflow
# REQUIRE: DAEMON
# KEYWORD: shutdown
. /etc/rc.subr
name="ngnetflow"
rcvar=`set_rcvar`
command="/usr/sbin/ngctl"
load_rc_config $name
: ${ngnetflow_enable="NO"}
: ${ngnetflow_iface=""}
: ${ngnetflow_dst=""}
start_cmd="${name}_start"
stop_cmd="${name}_stop"
ngnetflow_start() {
/usr/sbin/ngctl -f- <<-SEQ
mkpeer ${ngnetflow_iface}: netflow lower iface0
name ${ngnetflow_iface}:lower netflow
connect netflow: ${ngnetflow_iface}: iface1 upper
connect netflow: netflow: out0 out1
mkpeer netflow: ksocket export inet/dgram/udp
name netflow:export ksocket
msg ksocket: connect inet/${ngnetflow_dst}
SEQ
}
ngnetflow_stop() {
/usr/sbin/ngctl -f- <<-SEQ
shutdown netflow:
SEQ
}
run_rc_command "$1"
естественно, прописываем в /etc/rc.conf параметры
ngnetflow_enable=""
ngnetflow_iface=""
ngnetflow_dst=""
думаю, тут все понятно.
2. С помощью flow-tools захватываем и обрабатываем данные.
#!/bin/sh
RPT_Y=`/bin/date -v-1d +%Y`
RPT_M=`/bin/date -v-1d +%m`
RPT_D=`/bin/date -v-1d +%d`
RPT_DIR="/usr/local/www/data"
RPT_DATE=${RPT_Y}-${RPT_M}-${RPT_D}
RPT_NAME=${RPT_DIR}/${RPT_DATE}.html
FLOW_DIR="/var/db/flows"
INDEX="/usr/local/www/data/index.html"
## WEB index.html
#echo -e "<HTML>\n<HEAD>\n<TITLE> Traffic statistics for LAN #Users</TITLE>\n</HEAD>\n<BODY>\n \
#<h2 align="center"><font color="blue">Traffic statistics for LAN Users</font></h2>" > #$INDEX
#echo -e "</BODY>\n</HTML>\n" >> ${INDEX}
echo -e "<p align="left"><a href="${RPT_DATE}.html"> Pere-IP statistics for LAN during \
<strong>${RPT_DATE}</strong></a></p>" >> ${INDEX}
Поясню вышенаписанное. Сначала надо раскоментировать первые 5 строк, что бы скрипт сгенерировал Индекс-страничку для страницы отчетов. Перед вторым запуском их надо закоментирвать, и тогда будут добавляться только ссылки на страницы с отчетами за определенный день.
## DOWNLOADED
echo -e "<HTML>\n<HEAD>\n<TITLE>${RPT_DATE}</TITLE>\n</HEAD>\n<BODY>\n<H2>${RPT_DATE} DOWNLOADED</H2>\n" > ${RPT_NAME}
/usr/local/bin/flow-cat ${FLOW_DIR}/${RPT_Y}/${RPT_Y}-${RPT_M}/${RPT_Y}-${RPT_M}-${RPT_D} \
|/usr/local/bin/flow-filter -f /usr/local/etc/flow-tools/flow.acl -Sinternet -Dlocalnet \
|/usr/local/bin/flow-report -s /usr/local/etc/flow-tools/report_down.conf -S localnet \
|/usr/local/bin/flow-rptfmt -f html -H -s -octets >> ${RPT_NAME}
echo -e "</BODY>\n" >> ${RPT_NAME}
### UPLOADED
echo -e "<BODY>\n<H2>${RPT_DATE} UPLOADED</H2>\n" >> ${RPT_NAME}
/usr/local/bin/flow-cat ${FLOW_DIR}/${RPT_Y}/${RPT_Y}-${RPT_M}/${RPT_Y}-${RPT_M}-${RPT_D} \
|/usr/local/bin/flow-filter -f /usr/local/etc/flow-tools/flow.acl -Slocalnet -Dinternet \
|/usr/local/bin/flow-report -s /usr/local/etc/flow-tools/report_up.conf -S localnet \
|/usr/local/bin/flow-rptfmt -f html -H -s -octets >> ${RPT_NAME}
echo -e "</BODY>\n</HTML>\n" >> ${RPT_NAME}
### REMOVE OLD
RM_Y=`/bin/date -v-4d +%Y`
RM_M=`/bin/date -v-4d +%m`
RM_D=`/bin/date -v-4d +%d`
rm -Rf ${FLOW_DIR}/${RM_Y}/${RM_Y}-${RM_M}/${RM_Y}-${RM_M}-${RM_D}
-----
flow.acl
ip access-list standard localnet permit 10.0.100.0 0.0.0.255
ip access-list standard localnet deny any
ip access-list standard internet deny 10.0.100.0 0.0.0.255
ip access-list standard internet permit any
-----
report_down.conf
stat-report localnet
type ip-destination-address
output
format ascii
options +header,+xheader,+totals
fields -flows,-packets,-duration
stat-definition localnet
report localnet
----
report_up.conf
stat-report localnet
type ip-source-address
output
format ascii
options +header,+xheader,+totals
fields -flows,-packets,-duration
stat-definition localnet
report localnet
-------
3. В крон записываем, что бы генерировался отчет:
5 2 * * * root /usr/local/etc/flow-tools/stat_daily.sh
4. Устанавливаем Apache, заходим на страничку и смотрим статистику.
Чего пока здесь нету? Хотелось бы выводить статистику за день не только по IP, но и суммарную по всей подсети. Но пока до этого руки не дошли, так что если кто допишет, киньте плиз.
Что бы это все реализовать мне помогли 2 статьи:
http://ylsoftware.com/news/492
http://tmp.barev.net/htmlart/unix/pres-ngnetflow.xml#1
Вобщем разьяснять каждую строчку мне влом, так что если кому чего непонятно - пишите.