Предложение по шейпированию

Предложения и запрос функционала
ZeroWave
Сообщения: 63
Зарегистрирован: Вт июн 28, 2005 15:21
Откуда: Ташкент

Предложение по шейпированию

Сообщение ZeroWave »

Доброго Вам времени суток.
У меня есть идея, вот только незнаю как ее реализовать, так как еще неочень разбираюсь Mysql.
Суть состоит в следующем:
При подключении по VPN пользователю выдается определенный ppp интерфейс, соответственно по имени этого интерфейса можно узнать какой пользователю был выдан IP.
Далее по IP адресу мы из БД Mysql вычисляем в какой группе находится данный пользователь. И в соответствии с этим выполняем определенные правила для шейпирования. Например если пользователь находится в группе 32kb, то 32kbit/s если в группе 64 kb то 64kbit/s, немогли бы вы подсказать как правильно составить Mysql запрос, чтобы по IP адресу получить данные в какой группе находится пользователь и возможно ли это вообще ?
Заранеее благодарен.

Аватара пользователя
dalex
Сообщения: 1306
Зарегистрирован: Пт янв 21, 2005 11:54

Сообщение dalex »

есть вариант проще написать правила шейпирования для utm5_rfw и добавить их на группу 32kb например. тогда они будут применяться только к юзерам в этой группе

ZeroWave
Сообщения: 63
Зарегистрирован: Вт июн 28, 2005 15:21
Откуда: Ташкент

Сообщение ZeroWave »

Я так пробовал, но ничего неполучается так как заранее же неизвестно какой ppp интерфейс получит пользователь и соответсвенно, нельзя привязать правила именно к ниме, например у меня при добавлении девайса типа ppp возникают на шейпере проблемы, я сейчас сделал проще, у меня при подключении клиента выполняется скрипт из ip.up и устанавливается скорость на 32, но хотелось бы выдавать разным клиентам разные скорости.

ZeroWave
Сообщения: 63
Зарегистрирован: Вт июн 28, 2005 15:21
Откуда: Ташкент

Сообщение ZeroWave »

Привожу текст скрипта который я использую в ip.up для шейпирования:
ppp - заменяется параметром $REALDEVICE, тобишь именно тут хранится сам ppp интерфейс выдаваемый клиенту:

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

   #!/bin/bash
   DEVICE=ppp
   UP=512 #Скорость исходящего потока
   DOWN=512 #Скорость входящего потока
   /sbin/tc qdisc del dev $DEVICE root
   /sbin/tc qdisc add dev $DEVICE root tbf rate ${DOWN}Kbit latency 50ms burst $[$DOWN*1024]
   /sbin/tc qdisc del dev $DEVICE handle ffff: ingress
   /sbin/tc qdisc add dev $DEVICE handle ffff: ingress
   /sbin/tc filter add dev $DEVICE parent ffff: protocol ip prio 50 u32 match ip src 0.0.0.0/0 \
   police rate ${UP}Kbit burst $[$DOWN*1024] drop flowid :1
Вот в соответствии этого скрипта есть предложение сделать что то типа:

Если Группа пользователя равна 32kbit/s то:
UP=32
DOWN=32
Если 64 то соответственно:
UP=64
DOWN=64 b
и так далее.
Единственное чего я немогу сделать это получить, IP зная ppp, тоесть например функцией ifconfig $REALDEVICE |grep параметры. (Какие именно параметры нужно использовать чтобы получить чистый IP, просто если мы делаем что то типа ifconfig $REALDEVICE |grep inet, то получаем целую строку содержащую как ip так и маску подсети:
( inet addr: [XXX.XXX.XXX - адрес сервера] [P-t-P:XXX.XXX.XXX.XXX - адрес клиента и маска сети соответственно ). Как можно получить только IP клиента ?
Потом мы делаем по IP адресу клиента запрос в базу данных и получаем группу в которую входит клиент.
Далее на основании этих данных тобишь названия группы мы присваиваем переменным UP и DOWN соответствующие значения, вот только загвоздка :) Я незнаю как это все описать програмным кодом :(

ZeroWave
Сообщения: 63
Зарегистрирован: Вт июн 28, 2005 15:21
Откуда: Ташкент

Сообщение ZeroWave »

Кстати забыл сказать OS Linux RH 9.0, iptables, tc, iproute - все имеется :)

Аватара пользователя
dalex
Сообщения: 1306
Зарегистрирован: Пт янв 21, 2005 11:54

Сообщение dalex »

а нельзя шейпить не на интерфейс а на адрес?
его то можно utm5_rfw передать
Я незнаю как это все описать програмным кодом
Собрал на коленке но чтото мне подсказывает что ifconfig с опциями должен отдадать адрес сам.
/bin/echo `ifconfig eth1|grep inet`|/bin/awk -F ":" '{print $2}'|/bin/awk -F "Bcast" '{print $1}'

ZeroWave
Сообщения: 63
Зарегистрирован: Вт июн 28, 2005 15:21
Откуда: Ташкент

Сообщение ZeroWave »

Нет шейпить по IP нельзя, так как при VPN пакеты передаются в зашифрованном виде иих просто невидно, я пробовал шейпить по IP, как это описано в доке на netup, но ничего неполучилось, начинается ругаться на ppp интерфейс и шейпинг не проходит, так что приходится оставаться с тем что есть тобишь все делать непосредственно через ip.up и ip.down, тем более что лучше когда правила создаются и удаляются динамически при подключении.

Аватара пользователя
dalex
Сообщения: 1306
Зарегистрирован: Пт янв 21, 2005 11:54

Сообщение dalex »

Нет шейпить по IP нельзя
Тогда
/bin/echo `ifconfig eth1|grep inet`|/bin/awk -F ":" '{print $2}'|/bin/awk -F "Bcast" '{print $1}'
Хотя может есть более простой вариант выдирания адреса

ZeroWave
Сообщения: 63
Зарегистрирован: Вт июн 28, 2005 15:21
Откуда: Ташкент

Сообщение ZeroWave »

Спасибо за скрипт:

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

/bin/echo `ifconfig eth1|grep inet`|/bin/awk -F ":" '{print $2}'|/bin/awk -F "Bcast" '{print $1}'
Я его немного модифицировал под свои нужды и получилось следующее:

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

/bin/echo `ifconfig ppp0|grep inet`|/bin/awk -F ":" '{print $3}'|/bin/awk -F "Mask" '{print $1}'
Вроде все работает, теперь как нужно сформировать запрос, чтобы по полученному IP адресу, выяснить в какой группе находится пользователь.

Аватара пользователя
dalex
Сообщения: 1306
Зарегистрирован: Пт янв 21, 2005 11:54

Сообщение dalex »

Вроде все работает, теперь как нужно сформировать запрос, чтобы по полученному IP адресу, выяснить в какой группе находится пользователь.
зачем?
utm5_rfw позволяет добавлять разные правила на разные группы.
Просто пропиши правила на группы и все.

cjcrazy
Сообщения: 497
Зарегистрирован: Чт янв 20, 2005 21:54

Сообщение cjcrazy »

2ZeroWave, если же используете ip-up (из pppd), то ip интерфейса передаётся в параметрах к ip-up
man pppd писал(а): /etc/ppp/ip-up
A program or script which is executed when the link is available
for sending and receiving IP packets (that is, IPCP has come up).
It is executed with the parameters

interface-name tty-device speed local-IP-address remote-IP-address
ipparam

ZeroWave
Сообщения: 63
Зарегистрирован: Вт июн 28, 2005 15:21
Откуда: Ташкент

Сообщение ZeroWave »

IP адреса у меня выдаются из Radiusa, мне наоборот было необходимо узнать IP адрес по называнию интерфейса, что уже получилось. спасибо. Теперь мне интересно было бы узнать какой необходимо сформировать запрос к базе UTM чтобы по IP адресу узнать в какой группе находится клиент.

cjcrazy
Сообщения: 497
Зарегистрирован: Чт янв 20, 2005 21:54

Сообщение cjcrazy »

ZeroWave писал(а):Теперь мне интересно было бы узнать какой необходимо сформировать запрос к базе UTM чтобы по IP адресу узнать в какой группе находится клиент.
не лучше ли выдавать пользователю ip исходя из группы "шейпирования"

ZeroWave
Сообщения: 63
Зарегистрирован: Вт июн 28, 2005 15:21
Откуда: Ташкент

Сообщение ZeroWave »

Я думаю так будет сложнее да и путаница может возникнуть, ведь проще просто запихнуть пользователя в определенную группу и больше не о чем не думать :)

ZeroWave
Сообщения: 63
Зарегистрирован: Вт июн 28, 2005 15:21
Откуда: Ташкент

Сообщение ZeroWave »

Еще раз добрый день, вот подумал подумал и решил таки не связываться я с этим SQL, но придумал другую идею, а что если например при включении пользователю интернета записывать его идентификатор группы в файл ? который будет иметь название его IP, тобишь делать что то вроде:

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

/bin/touch /netup/utm5/db/UIP
/bin/echo GID > /netup/utm5/UIP
С той проблемой что UTM никак нехотел записывать хоть что то в файл я справился написав маленький скрипт в качестве параметров которому передавал $1 - какие либо данные $2 - имя файла тобишь UIP.

Скрипт выглядит так:

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

#!/bin/bash
echo $1 > /netup/utm5/SHAPER/$2
А в админке прописал такие правила:
/bin/echorec UID UIP
Где echorec - сам скрипт.

Теперь другой вопрос в какой переменной хранится Идентификатор группы ?
Чтобы сделать что то вроде /bin/echorec UID UIP ?
Где UID - идентификатор группы.

Ответить