Настройка шейпера в 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 к определенному тарифу посредством создания набора атрибутов. Т.е. чтобы не прописывать у каждого юзера, а сразу задавать скорость для тарифов.