Здравствуйте!
Я только начинаю знакомиться с ОС FreeBSD. Поставил шлюз и теперь нужно организовать учет трафика для пользоватетелй сети. Решил задачу так:rl1 - внешний интерфейс.
192.168.0.2 - пользователь из внутренней сети, который пользует интернет через шлюз
ipfw 10, 30 - правила count для трафика от пользователя 192.168.0.2 в интернет и обратно.
Трафик считается скриптом traffic (запускается с опереденным интервалом кроном), данные хранятся в файле /var/log/ipfw/count (структура такая: входящий трафик, исходящий, лимит трафика; все через пробел)#traffic########################################
#!/bin/shclear
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,$curoutif [ $curin -eq 0 ] ; then
echo curin is 0
if [ $curout -eq 0 ] ; then
echo curout is 0
exit
fi
ficat=`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,$totoutif [ $totin -gt $totout ] ; then
lim=`expr $balance - $totin`
else
lim=`expr $balance - $totout`
fiif [ $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
fiecho $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 - все, что у меня есть! Думаю такую задачу можно решить стандартными средствами.
и еще вопросец - как это все хранить не в байтах, а в Мб? С дробными частями шел не работает.
expr 60 / 1024 - будет ноль!
>и еще вопросец - как это все хранить не в байтах, а
>в Мб? С дробными частями шел не работает.
>expr 60 / 1024 - будет ноль!#echo 3/2 | bc -l
или
#echo -e "scale=2\n3/6" | bc -l
>>и еще вопросец - как это все хранить не в байтах, а
>>в Мб? С дробными частями шел не работает.
>>expr 60 / 1024 - будет ноль!
>
>#echo 3/2 | bc -l
>или
>#echo -e "scale=2\n3/6" | bc -l
Тогда возникает другая проблема:x1=1
x2=2
if [ $x1 -gt $x2 ] ; then
echo $x1 greater $x2
else
echo $x1 smaller $x2
fiВыдаст "1 smaller 2", но если я поменяю x2=0.2 и выполню скрипт, то получу слудующий ответ: "[: 0.2: bad number\n 1 smaller 0.2"
>Тогда возникает другая проблема:
>
>x1=1
>x2=2
>if [ $x1 -gt $x2 ] ; then
> echo $x1 greater $x2
>else
> echo $x1 smaller $x2
>fi
>
>Выдаст "1 smaller 2", но если я поменяю x2=0.2 и выполню скрипт,
>то получу слудующий ответ: "[: 0.2: bad number\n 1 smaller 0.2"
>ну подумай сам. Раз баш не хочет понимать дробные числа, значит надо опять bc использовать.
например, вот так:
[ $(echo "$x1 > $x2" | bc) -ne 0 ] && echo "$x1 greater $x2" || echo "$x1 smaller $x2"
Имхо такие вещи было бы проще на перле писать.