The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]




Версия для распечатки Пред. тема | След. тема
Новые ответы [ Отслеживать ]
shell-скрипт для подсчета трафика, !*! GHopper, 26-Ноя-06, 12:45  [смотреть все]
Здравствуйте!
Я только начинаю знакомиться с ОС  FreeBSD. Поставил шлюз и теперь нужно организовать учет трафика для пользоватетелй сети. Решил задачу так:

rl1 - внешний интерфейс.
192.168.0.2 - пользователь из внутренней сети, который пользует интернет через шлюз
ipfw 10, 30 - правила count для трафика от пользователя 192.168.0.2 в интернет и обратно.
Трафик считается скриптом traffic (запускается с опереденным интервалом кроном), данные хранятся в файле /var/log/ipfw/count (структура такая: входящий трафик, исходящий, лимит трафика; все через пробел)

#traffic########################################
#!/bin/sh

clear
ipfw=`ipfw show 10`
ifconfig rl1 down
curout=`expr "$ipfw" : '.*\ .*\ \(.*\).*\ .*\ .*\ .*\ .*\ .*\ .*\ .*\ .*\ .*\ .*\ .*\ '`
ipfw zero 10
ipfw=`ipfw show 30`
curin=`expr "$ipfw" : '.*\ .*\ \(.*\).*\ .*\ .*\ .*\ .*\ .*\ .*\ .*\ .*\ .*\ .*\ .*\ '`
ipfw zero 30
ifconfig rl1 up
echo $curin,$curout

if [ $curin -eq 0 ] ; then
    echo curin is 0
    if [ $curout -eq 0 ] ; then
    echo curout is 0
    exit
    fi
fi

cat=`cat /var/log/ipfw/count`
totin=`expr "$cat" : '\(.*\)\ .*\ .*'`
totout=`expr "$cat" : '.*\ \(.*\)\ .*'`
balance=`expr "$cat" : '.*\ .*\ \(.*\)'`
echo $totin,$totout,$balance

#totin=`echo $curin+$totin | bc`
totin=`expr $curin + $totin`
#totout=`echo $curout+$totout | bc`
totout=`expr $curout + $totout`
echo $totin,$totout

if [ $totin -gt $totout ] ; then
    lim=`expr $balance - $totin`
else
    lim=`expr $balance - $totout`
fi

if [ $lim -le 0 ] ; then
    ipfw add 9 deny ip from 192.168.0.2 to any out via rl1
    ipfw add 29 deny ip from any to 192.168.0.2 in via rl1
fi

echo $totin $totout $balance > /var/log/ipfw/count
################################################

#/var/log/ipfw/count############################
0 0 10000
################################################

Так вот. Все работает, но т.к. это мой ПЕРВЫЙ shell-скрипт, то тут, скорее всего, не обойтись без ошибок (я ведь тоже человек). Хотелось-бы, чтобы вы взгялнули на мое творение, высказали критику и рекомендации.
Вопросы:
1. Может-ли тут произойти какое-нибудь переполнение?
2. Как сделать, чтобы count имел следующий вид:
#comment
in:    0
out:   0
limit: 10000
Тоесть сделать можно, а вот как потом из него информацию доставать? Как в таком случае читать файл построчно?
3. Что будет происходить при shutdown -h now? Если трафик будет проподать, то как избавиться от этого момента?
4. Можно-ли ipfw заставить в лог помимо времени, ip, порта и др. писать еще и число байт для каждого пакета?
5. Какая запись предпочтительнее:
totin=`echo $curin+$totin | bc`
totin=`expr $curin + $totin`

P.S. Не хочу ставить других интерпритаторов, netams, ipacc и пр. /bin/sh - все, что у меня есть! Думаю такую задачу можно решить стандартными средствами.




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2025 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру