Настройка шейпера в LINUX PPPD

Материал из BiTel WiKi

Перейти к: навигация, поиск

Текст данной статьи любезно предоставлен mister999

Я реализовал это так - может кому пригодится: 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 p3\314wm\333B7@S/\024\370E\....\241'e\371K\303
Acct-Interim-Interval 60
Session-Timeout 29293

Этот файл удобно обрабатывать в скрипте /etc/ppp/ip-up, для этого добавляем в него следующие строки :

if [ -f /var/run/radattr.$1 ]
then
DOWNSPEED=`/usr/bin/awk '/PPPD-Downstream-Speed-Limit/ {print $2}' /var/run/radattr.$1`
UPSPEED=`/usr/bin/awk '/PPPD-Upstream-Speed-Limit/ {print $2}' /var/run/radattr.$1`
FILTERS=`/usr/bin/awk '/Filter-Id/ {print $2}' /var/run/radattr.$1`
#echo $DOWNSPEED
#echo $UPSPEED
#echo $FILTERS
/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 u160x0000 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

На ядре 2.6.33.4 не заработал шейпинг исходящего трафика (т.е. ingress трафика для сервера). Предлагаю свой вариант, который проще (без приоритизации) и который работает на последних ядрах:

if [ -f /var/run/radattr.$1 ]
then
  DOWNSPEED=`/usr/bin/awk '/PPPD-Downstream-Speed-Limit/ {print $2}' /var/run/radattr.$1`
  UPSPEED=`/usr/bin/awk '/PPPD-Upstream-Speed-Limit/ {print $2}' /var/run/radattr.$1`

  #echo $DOWNSPEED
  #echo $UPSPEED

  /sbin/tc qdisc del dev $1 root > /dev/null
  /sbin/tc qdisc del dev $1 ingress > /dev/null

  ##### speed server->client
  if [ "$UPSPEED" != "0" ] ;
    /sbin/tc qdisc add dev $1 root tbf ${UPSPEED} latency 25ms
  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: handle 1 protocol ip prio 50 basic police ${DOWNSPEED} drop flowid :1
  fi
fi

Для того, чтобы нужные атрибуты распознавались радиусом и радиусклиентом нужно добавить их в соответствующие словари (/etc/radiusclient/dictionary и /usr/local/BGRadiusDialup/dictionary.xml)

ATTRIBUTE PPPD-Upstream-Speed-Limit 230 integer
ATTRIBUTE PPPD-Downstream-Speed-Limit 231 integer

Скорость можно выставлять индивидуально для каждого пользователя. При этом можно установить разные upspeed и downspeed. Скорость выставляется в Kbit/s

Так же можно привязать определенные значения атрибутов PPPD-Upstream-Speed-Limit и PPPD-Downstream-Speed-Limit к определенному тарифу посредством создания набора атрибутов. Т.е. чтобы не прописывать у каждого юзера, а сразу задавать скорость для тарифов.

Личные инструменты