« Отговор #1 -: Nov 04, 2007, 23:59 »
Защо всъщност ти е радиус сървър ? Вярно, че е много по-добре в някои ситуации, но ако мрежата не е голяма просто няма смисъл. Мога да ти дам идея за примерен шейпър:
#!/bin/bash
DEVICE=$1
userip=$5
username=$PEERNAME
downspeed=`cat /etc/ppp/users/$username | awk '{ print $1 }'`
upspeed=`cat /etc/ppp/users/$username | awk '{ print $2 }'`
userid=`cat /etc/ppp/users/$username | awk '{ print $3 }'`
pay="1"
plateno=`cat /etc/ppp/users/$username | awk '{ print $4 }'`
iptables -t mangle -A FORWARD -d $userip -i eth0 -s ! 192.168.0.0/16 -j MARK --set-mark $userid
markup=$(expr $userid + 5000)
iptables -t mangle -A FORWARD -s $userip -o eth0 -d ! 192.168.0.0/16 -j MARK --set-mark $markup
tc qdisc del dev $DEVICE root
tc qdisc add dev $DEVICE root handle 3: htb
tc class add dev $DEVICE parent 3: classid 3:10 htb rate 100mbit
tc class add dev $DEVICE parent 3:10 classid 3:$userid htb rate ${downspeed}kbit ceil ${downspeed}kbit
tc qdisc add dev $DEVICE parent 3:$userid handle $userid sfq
tc filter add dev $DEVICE parent 3:0 protocol ip prio 5 handle $userid fw classid 3:$userid
tc class add dev eth0 parent 1:20 classid 1:$markup htb rate ${upspeed}kbit ceil ${upspeed}kbit
tc qdisc add dev eth0 parent 1:$markup handle $markup sfq
tc filter add dev eth0 parent 1:0 protocol ip prio 1 handle $markup fw classid 1:$markup
if [ $plateno -eq $pay ];
then
echo $username e platil! > /dev/null
else
iptables -t nat -I PREROUTING -s $5 -j DROP
fi
Горе долу това успях да нахвърлям за 15 минути. Може да има и някъде грешки, но ще се наложи да поправяш.
Скрипта работи като извлича данни за всеки един юзър от отделен файл кръстен с името на потребителя от "chap-secrets" или "pap-secrets", там което използваш. Синтаксиса не трябва да те затрудни, но все пак:
~#cat /etc/ppp/users/pesho
1024 256 1 1
~#
Това значи потребителя pesho има скорост на даунлоуд 1024 кбита, ъплоуд 256 кбита, 3-та позиция за номер на потребител (тук може да се подобри като се използва ip-адреса който задаваш, но не ми се задълбочава сега, номера е цяло число 0-4999)и на 4-та позиция проверката дали потребителя си е платил - 1 означава платил, като при всяко друго число означава не е платено- т.е. трябва да се спре.
При малко повече желание и труд може да се добавят и допълнителни маркировки за локални сървъри, за пиъринг с други доставчици, отделен шейпинг за различните портове и т.н.
Успех, ако имаш въпроси пиши.