Страница 1 из 1

mpd и привязка клиента к его IP

Добавлено: 2010-01-13 13:53:31
savio
FreeBSD 7.0.
mpd5+freeraduis
нужно разрешить клиенту подключаться к интернету по vpn только со своего рабочего места(компьютера).
другими словами привязать аккаунт(логин и пароль) к конкретному IP-адресу в локальной сети.
есть идеи?

Re: mpd и привязка клиента к его IP

Добавлено: 2010-01-13 14:17:44
Гость
mp5 этим точно нет смысла заниматься
этим должен заниматься ваш биллинг
который получив IP клиента должен проверять по своей базе а потом уже смотреть на денежки итд
и разрешать авторизацию или делать денай

Re: mpd и привязка клиента к его IP

Добавлено: 2010-01-13 14:53:20
_Deja Vu
в таком виде не пойдет?

Код: Выделить всё

client 192.168.0.55 {
secret          = parol
shortname       = my_device_name
nastype     = other
}
полтора года прошло: RADIUS - что? где? и как?

Re: mpd и привязка клиента к его IP

Добавлено: 2010-01-13 14:57:42
savio
да, прошло, вопрос снова актуален. а решения пока не нашел. такой не подойдет, так как у меня логины и пароли в БД MySql

Re: mpd и привязка клиента к его IP

Добавлено: 2010-01-13 15:05:19
_за_Нерзула
во че-то там с базой этой майэскюэльной:
FreeRadius+MySQL

а вот еще со скриптами:
mpd + freeradius + mysql

Re: mpd и привязка клиента к его IP

Добавлено: 2010-01-13 18:04:13
schizoid

Re: mpd и привязка клиента к его IP

Добавлено: 2010-01-13 22:49:22
savio
скрипт конечно ваш хорош, только мне нужно что бы впн соединение разрывалось... сколько не пытался сделать это полтора года назад, не получилось......

Re: mpd и привязка клиента к его IP

Добавлено: 2010-01-14 11:53:16
schizoid

Код: Выделить всё

ipfw add deny tcp from IP to me port 1723

Re: mpd и привязка клиента к его IP

Добавлено: 2010-01-14 12:16:58
savio
неа, не подойдет.
ситуация.
клиент на работе и дома пользуется нашим инетом. начальство хочет что бы он брал один аккаунт на работе и один дома.
я пробовал через up-script рвать только что подключенное соединение, но что-то ничего не получилось у меня тогда....

Re: mpd и привязка клиента к его IP

Добавлено: 2010-01-14 12:29:06
schizoid
алгоритм опишите, что вы хотите сделать. по пунктам.
в моем скрипте.
1. при подключении клиента определяется ИП с которого подключился, мак-адрес
2. дальше идет проверка на валидность
3. выносится решение

опишите, что вы хотите получить

Re: mpd и привязка клиента к его IP

Добавлено: 2010-01-14 12:33:48
savio
1. при подключении клиента определяется ИП с которого он подключился
2. дальше идет проверка на валидность(каждому логину соответсвует конкретный ИП)
3. если ИП с которого он подключился не равен ранее заданому(в БД) то reject

Re: mpd и привязка клиента к его IP

Добавлено: 2010-01-14 12:46:12
schizoid
savio писал(а):1. при подключении клиента определяется ИП с которого он подключился
2. дальше идет проверка на валидность(каждому логину соответсвует конкретный ИП)
3. если ИП с которого он подключился не равен ранее заданому(в БД) то reject
Надеюсь пользователи в базе? если радиус - то вообще песня.
1. Определить Ип можно к примеру из таблички CallingStationId. Делаем запрос:

Код: Выделить всё

r_ip=`/bin/echo "select CallingStationId from freeradius.radacct where UserName='$5' and date(AcctStartTime)='$date' and AcctStopTime='0000-00-00 00:00:00' ORDER BY CallingStationId DESC limit 1;" |mysql -s -uЮЗЕР -pПАРОЛЬ`
2. ТУт вытягиваем ИП, который должен быть. ХЗ где там он у вас лежит, что-ти типа такого:

Код: Выделить всё

ip=`/bin/echo "select ip from freeradius.radcheck where UserName='$5';" |mysql -s -uЮЗЕР -pПАРОЛЬ`
3. Производим проверку

Код: Выделить всё

if [ "$r_ip" = "$ip" ]; then
echo "Good"
else
ipfw table 1 add $r_ip
fi
где в фаерволе есть правило

Код: Выделить всё

ipfw add deny tcp from 'table(1)' to me port 1723
далее, что бы с этого ИПа можно было подключиться вновь, в down-скрипте убираем этот ИП из таблицы
само правило аля:

Код: Выделить всё

ipfw table 1 delete $r_ip

как-то так

Re: mpd и привязка клиента к его IP

Добавлено: 2010-01-14 12:49:45
savio
хм.... интересная идея.... буду пробовать :good:

Re: mpd и привязка клиента к его IP

Добавлено: 2010-01-14 13:00:15
schizoid
выложу текущий up и down скрипт, может что-то еще почерпнете...

Код: Выделить всё

# cat /usr/local/etc/mpd4/up.sh                                                                                                                   
#!/bin/sh                                                                                                                                                                          
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin                                                                                                                  
###параметры получаемые при выполнении скрипта###                                                                                                                                  
##$1   $2        $3            $4      $5                                                                                                                                          
##ng0 inet 192.168.10.100/32 10.0.0.1 eugene                                                                                                                                       

#номер правила
i=`/bin/echo "select id from freeradius.radcheck where UserName='$5';" |mysql -s -uЮЗЕР -pПАРОЛЬ` >> /usr/local/etc/mpd4/test 2>&1
#пакет скорости интернета                                                                                                                   
bw=`/bin/echo "select bw from freeradius.radcheck where UserName='$5';" |mysql -s -uЮЗЕР -pПАРОЛЬ` >> /usr/local/etc/mpd4/test 2>&1

time=`date "+%H"`
time_start="00"  
time_stop="10"   

# Увеличение скорости клиентам с полуночи до 10-ти утра

if  ( [ $time -lt $time_stop ] && [ $time -ge $time_start ] )
 then                                                        
    if [ $bw = "bw_128" ]                                    
    then                                                     
    bw="bw_384"                                              
        elif [ $bw = "bw_384" ]                              
        then                                                 
        bw="bw_768"                                          
            elif [ $bw = "bw_512" ]                          
            then                                             
            bw="bw_1024"                                     
                elif [ $bw = "bw_1024" ]                     
                then                                         
                bw="bw_1536"                                 
 fi                                                          
fi                                                           
                                                             
echo ""  >> /usr/local/etc/mpd4/test 2>&1                    
date=`date "+%Y-%m-%d"`                                      
r_ip=`/bin/echo "select CallingStationId from freeradius.radacct where UserName='$5' and date(AcctStartTime)='$date' and AcctStopTime='0000-00-00 00:00:00' ORDER BY CallingStationId DESC limit 1;" |mysql -s -uЮЗЕР -pПАРОЛЬ` >> /usr/local/etc/mpd4/test 2>&1                                                                                            
echo "r_ip=$r_ip" >> /usr/local/etc/mpd4/test                                                                                                                                      
r_mac=`/usr/sbin/arp -n $r_ip|awk '{print $4}'` >> /usr/local/etc/mpd4/test 2>&1                                                                                                   
echo "r_mac=$r_mac" >> /usr/local/etc/mpd4/test                                                                                                                                    
mac1=`/bin/echo "select mac1 from freeradius.radcheck where UserName='$5';" |mysql -s -uЮЗЕР -pПАРОЛЬ` >> /usr/local/etc/mpd4/test 2>&1                                  
mac2=`/bin/echo "select mac2 from freeradius.radcheck where UserName='$5';" |mysql -s -uЮЗЕР -pПАРОЛЬ` >> /usr/local/etc/mpd4/test 2>&1                                  
mac3=`/bin/echo "select mac3 from freeradius.radcheck where UserName='$5';" |mysql -s -uЮЗЕР -pПАРОЛЬ` >> /usr/local/etc/mpd4/test 2>&1                                  

echo "-------------------------" >> /usr/local/etc/mpd4/test
echo `date` >> /usr/local/etc/mpd4/test                     
s=`/bin/echo "select $bw from freeradius.bw;" |mysql -s -uЮЗЕР -pПАРОЛЬ` >> /usr/local/etc/mpd4/test 2>&1

echo "Speed is $s Kbit/s"  >> /usr/local/etc/mpd4/test
num_in=`expr 500 + $i`
num_out=`expr 700 + $i`
num_block=`expr 800 + $i`
pipe_in=$i
pipe_out=`expr 100 + $i`

echo "For user $5" >> /usr/local/etc/mpd4/test
echo "" >> /usr/local/etc/mpd4/test
#pipe's IN
ipfw add $num_in pipe $pipe_in ip from any to $4 >> /usr/local/etc/mpd4/test 2>&1
#pipe's OUT
ipfw add $num_out pipe $pipe_out ip from $4 to any >> /usr/local/etc/mpd4/test 2>&1
#pipe's speed
ipfw pipe $pipe_in config bw "$s"Kbit/s queue 10 >> /usr/local/etc/mpd4/test 2>&1
ipfw pipe $pipe_out config bw "$s"Kbit/s queue 10 >> /usr/local/etc/mpd4/test 2>&1
echo "" >> /usr/local/etc/mpd4/test
#count
ipfw add $num_in count ip from any to any in via $1 >> /usr/local/etc/mpd4/test 2>&1
ipfw add $num_out count ip from any to any out via $1 >> /usr/local/etc/mpd4/test 2>&1
echo "" >> /usr/local/etc/mpd4/test

echo "Begin test for mac-adress's" >> /usr/local/etc/mpd4/test

if [ "$r_mac" = "$mac1" ]; then
    echo "mac1 Goot" >> /usr/local/etc/mpd4/test
    elif [ "$r_mac" = "$mac2" ]; then
            echo "mac2 Goot" >> /usr/local/etc/mpd4/test
            elif [ "$r_mac" = "$mac3" ]; then
                echo "mac3 Goot" >> /usr/local/etc/mpd4/test
                else
                echo "Пользователь $5 подключился с чужого компьютера IP=$r_ip (MAC=$r_mac). Правильный мак: $mac1, $mac2 или $mac3"| mail -s "Bad connections!!!" admin@domain.net.ua
                echo "Пользователь $5 подключился с чужого компьютера IP=$r_ip (MAC=$r_mac). Правильный мак: $mac1, $mac2 или $mac3" >> /usr/local/etc/mpd4/test
                ipfw add $num_block fwd 192.168.10.100,90 log tcp from $4 to any via vlan113 >> /usr/local/etc/mpd4/test 2>&1
fi

Код: Выделить всё

# cat /usr/local/etc/mpd4/down.sh
#!/bin/sh
PATH=/bin:/sbin:/usr/bin:/usr/sbin:/usr/local/bin:/usr/local/sbin
###параметры получаемые при выполнении скрипта###
##$1   $2    $3
##ng0 inet  eugene

#номер правила
i=`/bin/echo "select id from freeradius.radcheck where UserName='$3';" |mysql -s -uЮЗЕР -pПАРОЛЬ`

num_in=`expr 500 + $i`
num_out=`expr 700 + $i`
num_block=`expr 800 + $i`
pipe_in=$i
pipe_out=`expr 100 + $i`

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
ipfw pipe delete $pipe_in >> /usr/local/etc/mpd4/test 2>&1
ipfw pipe delete $pipe_out >> /usr/local/etc/mpd4/test 2>&1
ipfw delete $num_in >> /usr/local/etc/mpd4/test 2>&1
ipfw delete $num_out >> /usr/local/etc/mpd4/test 2>&1
ipfw delete $num_block >> /usr/local/etc/mpd4/test 2>&1

echo "" >> /usr/local/etc/mpd4/test