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

Дополнительно