Нарезка скорости в МПД и проверка юзеров по мак-адресам
МПД настроен по стаье
http://www.lissyara.su/?id=1350
Добавляем в таблицу radcheck 3 поля: mac1, mac2 и bw.
Почему 2 поля мак, потому что у некоторых пользователей дома по 2 ПК, и они подключаются в инет то по одному, то по второму (если у ваших юзеров больше, мона добавить и больше, тока нуно будет подправить скрипт)
поле bw содержит данные типа bw_all, bw_64 и bw_128 (это своего рода скоростные пакеты)
также добавляем табличку bw, где есть 3 поля (bw_all, bw_64 и bw_128), которые содержат параметры нарезки скорости, числовые (у мну 160, 64 и 128 соответственно).
далее сами скрипты:
#cat up.sh
Код: Выделить всё
#!/bin/sh
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
#номер правила
i=`/bin/echo "select id from freeradius.radcheck where Username='$5';" |mysql -s -uЮЗЕР -pПАРОЛЬ`
#пакет скорости интернета
bw=`/bin/echo "select bw from freeradius.radcheck where Username='$5';" |mysql -s -uЮЗЕР -pПАРОЛЬ`
date=`date "+%Y-%m-%d"`
#IP с которого подключается пользователь
r_ip=`/bin/echo "select CallingStationId from freeradius.radacct where Username='$5' and date(AcctStartTime)='$date' and AcctStopTime='0000-00-00 00:00:00' limit 1;" |mysql -s -uЮЗЕР -pПАРОЛЬ`
#MAC подключившегося пользователя
r_mac=`arp -n $r_ip|awk '{print $4}'`
#Выгребаем мак-адреса для данного пользователя из своей БД
mac1=`/bin/echo "select mac1 from freeradius.radcheck where Username='$5';" |mysql -s -uЮЗЕР -pПАРОЛЬ`
mac2=`/bin/echo "select mac2 from freeradius.radcheck where Username='$5';" |mysql -s -uЮЗЕР -pПАРОЛЬ`
echo "-------------------------" >> /usr/local/etc/mpd4/test
echo `date` >> /usr/local/etc/mpd4/test
if [ "$bw" = "bw_all" ]; then
echo "0 start!" >> /usr/local/etc/mpd4/test
s=`/bin/echo "select bw_all from freeradius.bw;" |mysql -s -uЮЗЕР -pПАРОЛЬ`
else
if [ "$bw" = bw_64 ]; then
echo "1 start!" >> /usr/local/etc/mpd4/test
s=`/bin/echo "select bw_64 from freeradius.bw;" |mysql -s -uЮЗЕР -pПАРОЛЬ`
else
echo "2 start!" >> /usr/local/etc/mpd4/test
s=`/bin/echo "select bw_128 from freeradius.bw;" |mysql -s -uЮЗЕР -pПАРОЛЬ`
fi
fi
#проверка для последней цифры в номере фаервола
if [ "$i" -le 9 ]
then
n=0$i
else
n=$i
fi
echo "For user $5" >> /usr/local/etc/mpd4/test
echo "" >> /usr/local/etc/mpd4/test
#pipe's IN
echo "ipfw add 5$n pipe $i ip from any to $4" >> /usr/local/etc/mpd4/test
ipfw add 5$n pipe $i ip from any to $4
#pipe's OUT
echo "ipfw add 7$n pipe 1$n ip from $4 to any" >> /usr/local/etc/mpd4/test
ipfw add 7$n pipe 1$n ip from $4 to any
#pipe's speed
echo "ipfw pipe $i config bw "$s"Kbit/s queue 10" >> /usr/local/etc/mpd4/test
ipfw pipe $i config bw "$s"Kbit/s queue 10
echo "ipfw pipe 1$n config bw "$s"Kbit/s queue 10" >> /usr/local/etc/mpd4/test
ipfw pipe 1$n config bw "$s"Kbit/s queue 10
echo "" >> /usr/local/etc/mpd4/test
echo "Begin test for mac-adress's" >> /usr/local/etc/mpd4/test
if [ "$r_mac" = "$mac1" ]; then
echo "0 Goot" >> /usr/local/etc/mpd4/test
elif [ "$r_mac" = "$mac2" ]; then
echo "1 Goot" >> /usr/local/etc/mpd4/test
else
echo "Пользователь $5 подключился с чужого компьютера IP=$r_ip (MAC=$r_mac). Правильный мак: $mac1 или $mac2"| mail -s "Bad connections!!!" admin@ДОМЕН
echo "Пользователь $5 подключился с чужого компьютера IP=$r_ip (MAC=$r_mac). Правильный мак: $mac1 или $mac2" >> /usr/local/etc/mpd4/test
echo "ipfw add 8$n fwd 192.168.0.100,90 tcp from $4 to any via vr0" >> /usr/local/etc/mpd4/test
ipfw add 8$n fwd 192.168.0.100,90 tcp from $4 to any via vr0
fi
правила в фаерволе для пайпов создаются вида 5хх и 7хх (пока тока до 100 пользователей)
сами пайпы с 1-го
номер пайпа зависит от ИП выдаваемого пользователю.
Если юзер приконнектился с левым маком его перенаправляет на страничку с предупреждением и отправляется мыло админу.
Все действия ведутся в лог /usr/local/etc/mpd4/test (кому не нада мона ессесно убрать).
Далее
#cat down.sh
Код: Выделить всё
#!/bin/sh
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
#номер правила
i=`/bin/echo "select id from freeradius.radcheck where Username='$3';" |mysql -s -uЮЗЕР -pПАРОЛЬ`
#проверка для последней цифры в номере фаервола
if [ "$i" -le 9 ]
then
n=0$i
else
n=$i
fi
echo "-------------------------" >> /usr/local/etc/mpd4/test
echo `date` >> /usr/local/etc/mpd4/test
echo "Stop for user $3" >> /usr/local/etc/mpd4/test
echo "" >> /usr/local/etc/mpd4/test
echo "ipfw pipe delete $i" >> /usr/local/etc/mpd4/test
ipfw pipe delete $i
echo "ipfw pipe delete 1$n" >> /usr/local/etc/mpd4/test
ipfw pipe delete 1$n
echo "ipfw delete 5$n" >> /usr/local/etc/mpd4/test
ipfw delete 5$n
echo "ipfw delete 7$n" >> /usr/local/etc/mpd4/test
ipfw delete 7$n
echo "ipfw delete 8$n" >> /usr/local/etc/mpd4/test
ipfw delete 8$n
echo "" >> /usr/local/etc/mpd4/test
может канечна мона и попроще, но у мну пока так, главное работает

ядерный взрыв...смертельно красиво...жаль, что не вечно...