===== linux pppd + radattr.so ===== Здесь рассказывается, как использовать атрибуты, передаваемые радиусом NAS'у на основе linux pppd. Это нужно для того, чтобы ограничивать пользователям скорость и выставлять фильтры. Последние версии pppd имеют в своем составе плагины для работы с radius-сервером. Чтобы воспользоваться этой возможностью, нужно добавить две строчки в файл options.pptpd : plugin radius.so plugin radattr.so radius.so предназначен для аутентификации и аккаунтинга через радиус, а radattr.so принимает от радиуса дополнительные атрибуты и помещает их в файл /var/run/radattr.pppX , где pppX - имя интерфейса. Выглядит он примерно так: MS-CHAP2-Success \207S=F17E6A6B06CD4B0C38F6....F35CD130BD7EBE MS-MPPE-Recv-Key \302\177\360\305\202I\362O....65\26\216#\336 MS-MPPE-Send-Key \317Ab4\353\275R\24\331O\3....\236gr*\274$\233 MS-MPPE-Encryption-Policy MS-MPPE-Encryption-Types Framed-IP-Address 192.168.144.226 Filter-Id test_filter PPPD-Downstream-Speed-Limit 128 PPPD-Upstream-Speed-Limit 128 Octets-Direction Sum Session-Octets-Limit 106954752 Framed-IP-Netmask 255.255.255.255 MS-CHAP-MPPE-Keys \317Ab4\353\275R\24\331O\3....\241'e\371K\303 Acct-Interim-Interval 60 Session-Timeout 29293 Этот файл удобно обрабатывать в скрипте /etc/ppp/ip-up.local, для этого добавляем в него следующие строки: if [ -f /var/run/radattr.$1 ]; then DOWNSPEED=`/bin/awk '/PPPD-Downstream-Speed-Limit/ {print $2}' /var/run/radattr.$1` UPSPEED=`/bin/awk '/PPPD-Upstream-Speed-Limit/ {print $2}' /var/run/radattr.$1` FILTERS=`/bin/awk '/Filter-Id/ {print $2}' /var/run/radattr.$1` /sbin/tc qdisc del dev $1 root > /dev/null /sbin/tc qdisc del dev $1 ingress > /dev/null ##### speed server->client if [ "$UPSPEED" != "0" ] ; then /sbin/tc qdisc add dev $1 root handle 1: htb default 20 r2q 1 /sbin/tc class add dev $1 parent 1: classid 1:1 htb rate ${UPSPEED}kbit burst 4k /sbin/tc class add dev $1 parent 1:1 classid 1:10 htb rate ${UPSPEED}kbit burst 4k prio 1 /sbin/tc class add dev $1 parent 1:1 classid 1:20 htb rate ${UPSPEED}kbit burst 4k prio 2 /sbin/tc qdisc add dev $1 parent 1:10 handle 10: sfq perturb 10 quantum 1500 /sbin/tc qdisc add dev $1 parent 1:20 handle 20: sfq perturb 10 quantum 1500 /sbin/tc filter add dev $1 parent 1:0 protocol ip prio 10 u32 match ip tos 0x10 0xff flowid 1:10 /sbin/tc filter add dev $1 parent 1:0 protocol ip prio 10 u32 match ip protocol 1 0xff flowid 1:10 /sbin/tc filter add dev $1 parent 1: protocol ip prio 10 u32 match ip protocol 6 0xff match u8 0x05 0x0f at 0 match u16 0x0000 0xffc0 at 2 match u8 0x10 0xff at 33 flowid 1:10 fi ##### speed client->server if [ "$DOWNSPEED" != "0" ] ; then /sbin/tc qdisc add dev $1 handle ffff: ingress /sbin/tc filter add dev $1 parent ffff: protocol ip prio 50 u32 match ip src 0.0.0.0/0 police rate ${DOWNSPEED}kbit burst 12k drop flowid :1 fi fi ====radiusclient==== **/etc/radiusclient/radiusclient.conf** Для того, чтобы нужные атрибуты распознавались радиусом и радиус-клиентом, нужно добавить их в соответствующие словари **/etc/radiusclient/dictionary** # Limit session traffic ATTRIBUTE Session-Octets-Limit 227 integer # What to assume as limit - 0 in+out, 1 in, 2 out, 3 max(in,out) ATTRIBUTE Octets-Direction 228 integer # Connection Speed Limit ATTRIBUTE PPPD-Upstream-Speed-Limit 230 integer ATTRIBUTE PPPD-Downstream-Speed-Limit 231 integer ATTRIBUTE PPPD-Upstream-Speed-Limit-1 232 integer ATTRIBUTE PPPD-Downstream-Speed-Limit-1 233 integer ATTRIBUTE PPPD-Upstream-Speed-Limit-2 234 integer ATTRIBUTE PPPD-Downstream-Speed-Limit-2 235 integer ATTRIBUTE PPPD-Upstream-Speed-Limit-3 236 integer ATTRIBUTE PPPD-Downstream-Speed-Limit-3 237 integer ATTRIBUTE Acct-Interim-Interval 85 integer и **/usr/local/radiusd/etc/raddb/dictionary** Скорость можно выставлять индивидуально для каждого пользователя и в тарифном плане. При этом в тарифном плане можно установить разные upspeed и downspeed. Если установлена скорость в настройках пользователя, то скорость из тарифного плана игнорируется. Скорость выставляется в Kbit/s Если у кого-то не заработает (не будут отдаваться нужные параметры ), то скорее всего у вас старая версия Abills'а, обновитесь из CVS: #!/bin/bash cvs -d:pserver:anonymous@abills.cvs.sourceforge.net:/cvsroot/abills login cvs -z3 -d:pserver:anonymous@abills.cvs.sourceforge.net:/cvsroot/abills checkout -r rel-0-3 abills Я предполагаю, что вышеописанный шейпер далеко не идеален и можно было бы в нем что-то улучшить. Если у вас есть предложения или замечания - в личку пользователю axl на здешнем форуме.. ====PPTP==== [[http://www.poptop.org|www.poptop.org]] Собираем с исходных кодов # tar zxvf pptpd-1.3.3.tar.gz # cd pptpd-1.3.3 # ./configure # make # make install # cp pptpd.init /etc/init.d/pptpd # chmod 755 /etc/init.d/pptpd # chkconfig --level 345 pptpd on # touch /var/log/pptpd.log Правим файл **/etc/pptpd.conf** : ppp /usr/sbin/pppd option /etc/ppp/options.pptpd noipparam debug # stimeout 10 #bcrelay eth0 localip ***.***.***.*** # Здесь IP адрес вашего сервера в локальной сети #remoteip 172.20.19.2-250,172.20.18.2-252 # Закоментировать, назначается #радиусом **/etc/ppp/options.pptpd** plugin radius.so plugin radattr.so proxyarp debug require-mschap-v2 #+chap #+pap ms-dns ***.***.***.*** # Здесь укажите IP адрес DNS сервера, который # будет сообщаться подключившемуся клиенту ====MSChap V2 MPPE+MPPC==== **Проверено на Slackware 12. Linux 2.6.21.5-smp**\\ Берём патч [[http://www.koptev.ru/docs/mppe_mppc/]] **/etc/ppp/options.pptpd** plugin radius.so plugin radattr.so logfile /var/log/pptpd debug require-mschap-v2 refuse-mschap refuse-chap refuse-pap #noccp nodeflate novj novjccomp #require mppe #mppe-stateful #ms-dns ***.***.***.*** ====ABillS==== **/ Configuration/ NAS/** ^Type: | pppd | ^Alive: | Интервал RADIUS Alive пакетов. Желательно значение 120 | ^:Manage: | | ^IP:PORT: | IP-адрес и порт, на котором система сброса (pppd_kill) слушает команды | ^Password: | Пароль | ^Radius Pairs: | Дополнительные RADIUS атрибуты. | Сброс на локальной машине:\\ **/etc/sudoers** apache ALL = NOPASSWD: /usr/abills/misc/pppd_kill Для организации сброса с удалённой машины нужно поднять скрипт:\\ **/etc/services** hangup 30000/tcp При использовании inetd:\\ **/etc/inetd.conf** hangup stream tcp nowait root /usr/abills/misc/pppd_kill pppd_kill server При использовании xinetd:\\ **/etc/xinetd.d/hangup** service hangup { disable = no port = 30000 socket_type = stream protocol = tcp wait = no user = root passenv = PATH server = /usr/abills/misc/pppd_kill server_args = server env = HOME=/var/cvs } ====Проверка установленной скорости==== показать установленный шейпер на пользователй # /usr/abills/libexec/billd checkspeed NAS_IDS=1 SHOW_SPEED=1 Проверить и в случае несоответствиaя переключить скорость # /usr/abills/libexec/billd checkspeed NAS_IDS=2 ====Дополнительно===== * [[http://wiki.freeradius.org/PopTop|FreeRadius + PoPTop]]