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