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
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