По просьбам пишу полное описание настройки скрипта статистики.
Для работи скрипта нужно сконфигурировать lighttpd и cron.
Не забываем при настройке lighttpd в файл lighttpd.conf добавить строчку
Code:
index-file.names = ( "index.php", "index.html")
server.event-handler = "poll" # needed on OS X
mimetype.assign
Настраиваем подсчет трафика:
Для удобства настройки и работы еще можно настроить mc.
1.Создаем директории
Code:
mkdir /opt/Billing
mkdir /opt/Billing/logs
mkdir /opt/Billing/users
touch /opt/Billing/all
touch /opt/Billing/cnt
touch /opt/etc/cron.5mins/end
chmod +x /opt/Billing/cnt
chmod +x /opt/Billing/all
chmod +x /opt/etc/cron.5mins/end
2.Создаем таблицу юзеров какую нам нада (пример)
nano /opt/etc/users
Code:
00:00:11:11:11:00 192.168.1.11
00:00:1a:1a:1a:00 192.168.1.15
00:00:1c:1c:1a:00 192.168.1.2
где (00:00:11:11:11:00) mac адрес сетевой и (192.168.1.1) ip юзера или своей сетевой.
Ctrl O
Enter
Ctrl X
2.Сам скрипт счетчика
nano /opt/Billing/cnt
Code:
#!/bin/sh
LOG="/opt/Billing/logs/`date +%d-%m-%Y`"
ULOG="/opt/Billing/users/`date +%d-%m-%Y`"
DATE="`date +%d-%m-%Y`"
echo "$1 `cat $LOG | grep \"0.0.0.0/0 $1\" | awk '
BEGIN{a=0;x=0;b=0;x=0}
{
if (index($1,\"d\") == 0) a=(a+$1)
x=a/1024/1024
}
END{if((a) != 0){printf(\"%.2f\",x)}else{print 0}}'` `cat $LOG | grep \"$1 0.0.0.0/0\" | awk '
BEGIN{a=0;b=0;y=0}
{
if (index($1,\"d\") == 0) b=(b+$1)
y=b/1024/1024
}
END{if((b) != 0){printf(\"%.2f\",y)}else{print 0}}'` `sh /opt/Billing/all $1`" | awk '
BEGIN{a=0;b=0}
{
a=($2+$3)
b=($4+a)
}
END{print($1,$2,$3,a,b)}' >> $ULOG
Ctrl O
Enter
Ctrl X
3. Создаем еще скрипт
nano /opt/Billing/all
Code:
#!/bin/sh
ULOG="/opt/Billing/users/"
cd $ULOG
cat * | grep $1 | awk '
BEGIN {a=0}
{if (($4) != 0){a=a+$4}}
END {print a}'
Ctrl O
Enter
Ctrl X
4.И еще один
nano /opt/etc/cron.5mins/end
Code:
#!/bin/sh
ULOG="/opt/Billing/total"
DATE="/opt/Billing/logs/`date +%d-%m-%Y`"
LOG="/opt/Billing/users/`date +%d-%m-%Y`"
WEB="/opt/share/www/user.html"
rm $LOG
rm $ULOG
iptables -nvxL FORWARD | grep 192.168 | grep 0.0.0.0/0 | awk '{
if (($2) != 0){print($2,$8,$9)}}'>> $DATE
iptables -Z
cat /opt/etc/users | awk '{if(($2) != ""){system("/opt/Billing/cnt "$2)}}'
sleep 5s
ls -l /opt/Billing/users/ | awk '{system("cat /opt/Billing/users/"$9)}' | awk '
BEGIN{a=0;b=0,c=" "}
{
if(($3) != 0 && ($2) != 0)
{
if (index($2,"d") == 0){a=(a+$2)}
if (index($3,"d") == 0){b=(b+$3)}
}
}
END
{
if((a) != 0){printf("%.2f",a);printf(c)}else{print 0}
if((b) != 0){printf("%.2f",b)}else{print 0}
}' >> $ULOG
echo "<html><link rel=stylesheet type=text/css href=vnstat_blue.css><body>" >> $WEB
echo "<body><table border=1>" > $WEB
echo "<tr><td><font color=blue>User_id</font></td><td><font color=green>Input:</font></td><td><font color=red>Output:</font></td><td><font color=blue>Total:</font></td><td><font color=blue>All day's:</font></td>" >> $WEB
ls -1 /opt/Billing/users/ | awk '{print("<tr><td>"$1"</td></tr>");system("cat /opt/Billing/users/"$1)}' | awk '{
print(\
"<tr><td><font color=blue>",$1,"</font></td><td><font color=green>",$2,"</font></td><td><font color=red>",$3,"</font></td><td><font color=blue>",$4,"</font></td><td><font color=blue>",$5,"</font></td></tr>")}' >> $WEB
echo "<tr><td><font color=blue>All total:</font></td>`cat /opt/Billing/total | awk '{print(\"<td><font color=green>\",$1,\"</font></td><td><font color=red>\",$2,\"</font></td>\")}'`</tr>" >> $WEB
echo "</table></body></html>" >> $WEB
Ctrl O
Enter
Ctrl X
5.Добавляем правило+счётчик для каждого юзера
добавить в nano /usr/local/sbin/post-firewall
Code:
#!/bin/sh
iptables -F FORWARD
CFG="/opt/.cfg"
echo "#!/bin/sh" > $CFG
USR="/opt/etc/users"
cat $USR | awk '{print("iptables -A FORWARD -s",$2,"-j ACCEPT")}' >> $CFG
cat $USR | awk '{print("iptables -A FORWARD -d",$2,"-j ACCEPT")}' >> $CFG
sh $CFG
Ctrl O
Enter
Ctrl X
Code:
chmod +x /usr/local/sbin/post-firewall
7.В конце для сохранения
Code:
flashfs save && flashfs commit && flashfs enable && reboot
Проверяем работу iptables
Code:
iptables -nvxL FORWARD
Должно быть так
Code:
# iptables -nvxL FORWARD
Chain FORWARD (policy ACCEPT 0 packets, 0 bytes)
pkts bytes target prot opt in out source destination
469 111714 ACCEPT all -- * * 192.168.1.2 0.0.0.0/0
450 34108 ACCEPT all -- * * 192.168.1.11 0.0.0.0/0
528 424124 ACCEPT all -- * * 0.0.0.0/0 192.168.1.2
115 8178 ACCEPT all -- * * 0.0.0.0/0 192.168.1.11
Если по другому (или все 0 в таблице) то iptables не правильно работает проверяем
nano /usr/local/sbin/post-firewall
Code:
#!/bin/sh
iptables -F FORWARD
CFG="/opt/.cfg"
echo "#!/bin/sh" > $CFG
USR="/opt/etc/users"
cat $USR | awk '{print("iptables -A FORWARD -s",$2,"-j ACCEPT")}' >> $CFG
cat $USR | awk '{print("iptables -A FORWARD -d",$2,"-j ACCEPT")}' >> $CFG
sh $CFG
И не забываем что нужно вставлять код так как есть, без лишних пробелов и остальных символов, копировать (Ctrl+C), так как работать не будет.
После перегрузки роутера заходим на http://192.168.1.1:8081/user.html(не забываем что порт 8081 может быть разным смотря как вы настроили его в /opt/etc/lighttpd/lighttpd.conf)
И имеем приблизительно через некоторое время такую картинку
Обновление происходит каждые 5 минут из /opt/etc/cron.5mins/end автоматически.
Еще можно в место IP сделать имена юзеров.
В скрипте /opt/etc/cron.5mins/end меняем на:
Code:
ls -1 /opt/Billing/users/ | awk '{print("<tr><td>"$1"</td></tr>");system("cat /opt/Billing/users/"$1)}' | awk '{
if(($1) == "192.168.1.11"){$1="Вася"}
if(($1) == "192.168.1.15"){$1="Петя"}
if(($1) == "192.168.1.2"){$1="Маша"}
print(\
"<tr><td><font color=blue>",$1,"</font></td><td><font color=green>",$2,"</font></td><td><font color=red>",$3,"</font></td><td><font color=blue>",$4,"</font></td><td><font color=blue>",$5,"</font></td></tr>")}' >> $WEB
Вроде все.
Еще можно установить vnStat + vnStat PHP frontend.
У меня после такой установки vnstat не заработал (все нули).
Причина оказалась в стандартных для vnstat настройках cron.
При установке ipkg install vnstat в директорию /opt/etc/cron.d/ пишется файл vnstat с ежепятиминутной командой /opt/bin/vnstat -u
При ее выполнении vnstat находит директорию /opt/var/lib/vnstat/dumps, почему-то думает, что это его база, не может ее прочитать и стопорится.
Поэтому файл /opt/etc/cron.d/vnstat я удалил, а /opt/etc/cron.5mins/vnstat.sh сделал следующим:
Code:
rm /opt/etc/cron.d/vnstat
Code:
touch /opt/etc/cron.5mins/vnstat.sh
Code:
chmod +x /opt/etc/cron.5mins/vnstat.sh
Открываем
nano /opt/etc/cron.5mins/vnstat.sh
Code:
#!/bin/sh
dump_dir="/opt/var/lib/vnstat/dumps"
vnstat -u -i ppp0
vnstat -u -i vlan1
vnstat -u -i eth1
vnstat --dumpdb -i ppp0 > $dump_dir/vnstat_dump_ppp0
vnstat --dumpdb -i vlan1 > $dump_dir/vnstat_dump_vlan1
vnstat --dumpdb -i eth1 > $dump_dir/vnstat_dump_eth1
Ctrl O
Enter
Ctrl X
Code:
flashfs save && flashfs commit && flashfs enable && reboot
После перезагрузки ждем 5 мин и наблюдаем статистику.
Все.