Предложение по шейпированию
Предложение по шейпированию
Доброго Вам времени суток.
У меня есть идея, вот только незнаю как ее реализовать, так как еще неочень разбираюсь Mysql.
Суть состоит в следующем:
При подключении по VPN пользователю выдается определенный ppp интерфейс, соответственно по имени этого интерфейса можно узнать какой пользователю был выдан IP.
Далее по IP адресу мы из БД Mysql вычисляем в какой группе находится данный пользователь. И в соответствии с этим выполняем определенные правила для шейпирования. Например если пользователь находится в группе 32kb, то 32kbit/s если в группе 64 kb то 64kbit/s, немогли бы вы подсказать как правильно составить Mysql запрос, чтобы по IP адресу получить данные в какой группе находится пользователь и возможно ли это вообще ?
Заранеее благодарен.
У меня есть идея, вот только незнаю как ее реализовать, так как еще неочень разбираюсь Mysql.
Суть состоит в следующем:
При подключении по VPN пользователю выдается определенный ppp интерфейс, соответственно по имени этого интерфейса можно узнать какой пользователю был выдан IP.
Далее по IP адресу мы из БД Mysql вычисляем в какой группе находится данный пользователь. И в соответствии с этим выполняем определенные правила для шейпирования. Например если пользователь находится в группе 32kb, то 32kbit/s если в группе 64 kb то 64kbit/s, немогли бы вы подсказать как правильно составить Mysql запрос, чтобы по IP адресу получить данные в какой группе находится пользователь и возможно ли это вообще ?
Заранеее благодарен.
Я так пробовал, но ничего неполучается так как заранее же неизвестно какой ppp интерфейс получит пользователь и соответсвенно, нельзя привязать правила именно к ниме, например у меня при добавлении девайса типа ppp возникают на шейпере проблемы, я сейчас сделал проще, у меня при подключении клиента выполняется скрипт из ip.up и устанавливается скорость на 32, но хотелось бы выдавать разным клиентам разные скорости.
Привожу текст скрипта который я использую в ip.up для шейпирования:
ppp - заменяется параметром $REALDEVICE, тобишь именно тут хранится сам ppp интерфейс выдаваемый клиенту:
Вот в соответствии этого скрипта есть предложение сделать что то типа:
Если Группа пользователя равна 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 соответствующие значения, вот только загвоздка
Я незнаю как это все описать програмным кодом 
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 соответствующие значения, вот только загвоздка


а нельзя шейпить не на интерфейс а на адрес?
его то можно utm5_rfw передать
его то можно utm5_rfw передать
Собрал на коленке но чтото мне подсказывает что ifconfig с опциями должен отдадать адрес сам.Я незнаю как это все описать програмным кодом
/bin/echo `ifconfig eth1|grep inet`|/bin/awk -F ":" '{print $2}'|/bin/awk -F "Bcast" '{print $1}'
Нет шейпить по IP нельзя, так как при VPN пакеты передаются в зашифрованном виде иих просто невидно, я пробовал шейпить по IP, как это описано в доке на netup, но ничего неполучилось, начинается ругаться на ppp интерфейс и шейпинг не проходит, так что приходится оставаться с тем что есть тобишь все делать непосредственно через ip.up и ip.down, тем более что лучше когда правила создаются и удаляются динамически при подключении.
Спасибо за скрипт:
Я его немного модифицировал под свои нужды и получилось следующее:
Вроде все работает, теперь как нужно сформировать запрос, чтобы по полученному IP адресу, выяснить в какой группе находится пользователь.
Код: Выделить всё
/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}'
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
Еще раз добрый день, вот подумал подумал и решил таки не связываться я с этим SQL, но придумал другую идею, а что если например при включении пользователю интернета записывать его идентификатор группы в файл ? который будет иметь название его IP, тобишь делать что то вроде:
С той проблемой что UTM никак нехотел записывать хоть что то в файл я справился написав маленький скрипт в качестве параметров которому передавал $1 - какие либо данные $2 - имя файла тобишь UIP.
Скрипт выглядит так:
А в админке прописал такие правила:
/bin/echorec UID UIP
Где echorec - сам скрипт.
Теперь другой вопрос в какой переменной хранится Идентификатор группы ?
Чтобы сделать что то вроде /bin/echorec UID UIP ?
Где UID - идентификатор группы.
Код: Выделить всё
/bin/touch /netup/utm5/db/UIP
/bin/echo GID > /netup/utm5/UIP
Скрипт выглядит так:
Код: Выделить всё
#!/bin/bash
echo $1 > /netup/utm5/SHAPER/$2
/bin/echorec UID UIP
Где echorec - сам скрипт.
Теперь другой вопрос в какой переменной хранится Идентификатор группы ?
Чтобы сделать что то вроде /bin/echorec UID UIP ?
Где UID - идентификатор группы.