Создаёш в /etc/ppp/ip-up.d/ файл up-shaper
Содержимое:
Код: Выделить всё
#!/bin/bash
int=$1
period=day
now=`date +%H%M`
if [ "$now" -gt "0030" -a "$now" -lt "0700" ];then
period=night
fi
echo "/etc/ppp/shaper/shaper.sh up $int $period" > /var/log/ppp-shaper.log
/etc/ppp/shaper/shaper.sh up $int $period > /var/log/ppp-shaper.log 2>&1
chmod +x /etc/ppp/ip-up.d/up-shaper
0030 и 0700 это период ночь а остальное день
В /etc/ip-down.d/down-shaper
Содержимое:
Код: Выделить всё
#!/bin/bash
int=$1
echo /etc/ppp/shaper/shaper.sh down $int
chmod +x /etc/ppp/ip-up.d/down-shaper
Создаёте папку
mkdir /etc/ppp/shaper
В неё ложите сам shaper.sh
Код: Выделить всё
#!/bin/bash
TC="/sbin/tc"
action=$1
int=$2
ppp=`echo $int | sed 's/ppp//'`
period=$3
bw=`grep PPPD-Downstream-Speed-Limit\ /var/run/radattr.$int | cut -f2 -d\ `
bw_out=`grep PPPD-Upstream-Speed-Limit\ /var/run/radattr.$int | cut -f2 -d\ `
bw_night=`grep PPPD-Downstream-Speed-Limit-1 /var/run/radattr.$int | cut -f2 -d\ `
bw_night_out=`grep PPPD-Upstream-Speed-Limit-1 /var/run/radattr.$int | cut -f2 -d\ `
int_ip=`grep Framed-IP-Address /var/run/radattr.$int | cut -f2 -d\ `
if [[ -z $bw_out ]]; then
bw_out=$bw
fi
if [[ -z $bw_night ]]; then
bw_night=$bw
fi
if [[ -z $bw_night_out ]]; then
bw_night_out=$bw_night
fi
echo "`date`: $bw $bw_out $bw_night $bw_night_out $int $int_ip $action $period" >> /var/log/ppp-shaper.log
function up {
#Upstream shaping
$TC qdisc add dev $int root handle 1: htb default 1 r2q 1
$TC class add dev $int parent 1: classid 1:1 htb rate ${1}kbit ceil $(($1+$1 / 8))kbit
$TC qdisc add dev $int parent 1:1 sfq perturb 10
#Downstream shping
$TC qdisc add dev $int handle ffff: ingress
$TC filter add dev $int parent ffff: protocol ip prio 50 u32 match ip src 0.0.0.0/0 police rate $((${2} / 2 + ${2}))kbit burst 16k drop flowid :1
}
function down {
$TC qdisc del dev $int root handle 1: htb default 1 r2q 1
$TC class del dev $int parent 1: classid 1:1 htb rate ${1}kbit burst 16k
$TC qdisc del dev $int parent 1:1 sfq perturb 10
$TC qdisc del dev $int handle ffff: ingress
}
case "$action" in
up)
if [[ "$period" == day ]]; then
up $bw $bw_out
else
up $bw_night $bw_night_out
fi
;;
down)
down
;;
*)
echo "No action defined"
;;
esac
exit 0
chmod +x /etc/ppp/shaper/shaper.sh
И файл speedswitch.pl
Содеожимое:
Код: Выделить всё
#!/usr/bin/perl
my $period = $ARGV[0];
print $period;
my @radattrs = `ls /var/run/radattr*`;
foreach(@radattrs){
my $radattr = $_;
$radattr =~ /(ppp\d+)$/;
my $int = $1;
print "$int\n";
`/etc/ppp/shaper/shaper.sh down $int >> /var/log/speedswitch.log`;
`/etc/ppp/shaper/shaper.sh up $int $period >> /var/log/speedswitch.log`;
}
chmod +x /etc/ppp/shaper/speedswitch.pl
В crontab
Код: Выделить всё
30 0 * * * root /usr/bin/perl /etc/ppp/shaper/speedswitch.pl night
01 7 * * * root /usr/bin/perl /etc/ppp/shaper/speedswitch.pl day
PPPD-Downstream-Speed-Limit=2048, PPPD-Upstream-Speed-Limit=2048,
PPPD-Downstream-Speed-Limit-1=4096, PPPD-Upstream-Speed-Limit-1=4096
Таким образом у клиентов с 12:30 до 07:00 скорость 4096 а в остальное время 2048 и во время прохожднния временных интервалов соединение переподключается а скорость увеличивается.
Все работает четко за исключением извитого вопроса с исходящей скоростью исли кто-то предложит лучший вариант
Код: Выделить всё
#Downstream shping
$TC qdisc add dev $int handle ffff: ingress
$TC filter add dev $int parent ffff: protocol ip prio 50 u32 match ip src 0.0.0.0/0 police rate $((${2} / 2 + ${2}))kbit burst 16k drop flowid :1
Этого куска shapera я буду очень рад
Есть ёщё один вариант shapera с изменением скорости по направлениям могу выложить у меня под ubuntu работает