Здравствуйте!
У меня в сети раздается инет через роутер mikrotik где поднят обычный nat. На роутере включен NetFlow для сбора статистики и все это добро отправляется на сервер. Сервер же представляет собой обычную ubuntu 10.10 версии и на ней крутится nfdump принимая netflow трафик от mikrotik-a. Все вроде хорошо, netflow принимается, складывается, через nfsen смотрится, глюков нет.
Но потребовалось решить такую задачу:
1. Каждый день сохранять полную статистику за предыдущий день
2. В полученном файле должны быть ip и имена хостов
Я решил написать скрипт принимающий в качестве параметров год месяц и дату, далее он делает дамп, затем открывает построчно полученный файл, находит там ip, делает запрос к днс, получает хостнейм, дописывает к ip и уже редактированную строчку дописывает в новый файл.
Исходный файл дампа
Date flow start Duration Proto Src IP Addr:Port Dst IP Addr:Port Packets Bytes Flows
1970-01-12 13:37:15.181 0.000 UDP 192.168.173.22:4004 -> 192.168.170.11:4003 1 51 1
1970-01-12 13:37:04.071 11.570 TCP 192.168.170.203:445 -> 192.168.173.43:2411 14 1854 1
1970-01-12 13:37:04.071 11.570 TCP 192.168.173.43:2411 -> 192.168.170.203:445 18 4141 1
1970-01-12 13:36:58.191 17.610 TCP 192.168.170.29:4542 -> 81.19.88.88:80 4 160 1
1970-01-12 13:37:15.941 0.000 UDP 192.168.173.102:13643 -> 208.88.187.9:33033 1 61 1
Summary: total flows: 5, total bytes: 6267, total packets: 38, avg bps: 2824, avg pps: 2, avg bpp: 164
Time window: 1970-01-12 13:36:58 - 1970-01-12 13:37:15
Total flows processed: 756, Blocks skipped: 0, Bytes read: 39340
Sys: 0.000s flows/second: 0.0 Wall: 0.000s flows/second: 1225283.6
Получаемый новый файл дампа
1970-01-12 13:37:15.181 0.000 UDP 192.168.173.22 (kataev.sit.local.minint-k2q30pt.) -> 192.168.170.11 (oktell.sit.local.) 1 51 1
1970-01-12 13:37:04.071 11.570 TCP 192.168.170.203 (192.168.170.203) -> 192.168.173.43 (1-94b7061353914.lena.) 14 1854 1
1970-01-12 13:37:04.071 11.570 TCP 192.168.173.43 (lena.1-94b7061353914.) -> 192.168.170.203 (192.168.170.203) 18 4141 1
1970-01-12 13:36:58.191 17.610 TCP 192.168.170.29 (egorov_a.sit.local.) -> 81.19.88.88 (www.afisha.ru.) 4 160 1
1970-01-12 13:37:15.941 0.000 UDP 192.168.173.102 (uch-klass3.sit.local.) -> 208.88.187.9 (187-009.static.quiettouch.com.) 1 61 1
#!/bin/bash
year=$1
month=$2
day=$3
cd /var/www/billing/nfdata/
nfdump -R /data/nfsen/profiles-data/live/mikrotik/$year/$month/$day > a$year$month$day.txt
afile1=a$year$month$day.txt
cfile1=c$year$month$day
num=`cat ${afile1} | wc -l`
num=`expr $num - 4`
nxdomain="3(NXDOMAIN)"
for ((i=2;i<=${num};i++))
do
srcip=`head -n $i $afile1 | tail -n 1 | awk '{print $5}' | awk -F ':' '{print $1}'`
srcdns=`host $srcip | awk '{printf $5}'`
if [ "$srcdns" = "$nxdomain" ]; then
srcdns=$srcip
fi
dstip=`head -n $i $afile1 | tail -n 1 | awk '{print $7}' | awk -F ':' '{print $1}'`
dstdns=`host $dstip | awk '{printf $5}'`
if [ "$dstdns" = "$nxdomain" ]; then
dstdns=$dstip
fi
head -n "$i" "$afile1" | tail -n 1 | awk -v srcdns=" ($srcdns)" -v srcip="$srcip" -v dstdns=" ($dstdns)" -v dstip="$dstip" '{$5=srcip srcdns;$7=dstip dstdns;print}' >> $cfile1.txt
done
Подскажите пожалуйста что можно придумать в сложившейся ситуации =(