Получилось следующее:
Код: Выделить всё
#!/bin/sh
# if-up.local
debug=0;
INPUT=eth0;
if [ -f /var/run/radattr.$1 ]
then
PPPNUM=`echo $1|sed 's/ppp//'|awk {'printf "%03d",$1'}`
IP=`ip route list proto kernel|grep "$1 "|awk '{print $1}'`
echo $IP >/var/run/shaper/$1
QDISC_ETH=`tc qdisc show dev $INPUT|grep root|awk '{print $2}'`
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`
# if [ $QDISC_ETH != htb ];
# then
tc qdisc del dev $INPUT root >/dev/null
tc qdisc add dev $INPUT root handle 1: htb default 2 r2q 10
tc class add dev $INPUT parent 1: classid 1:1 htb rate 100mbit ceil 1000mbit burst 40k prio 2
tc class add dev $INPUT parent 1: classid 1:2 htb rate 100mbit ceil 1000mbit burst 40k prio 1
# fi
if [ w${debug} = w1 ] ; then
echo "Debug mode" >>/tmp/pptpd
echo $DOWNSPEED >>/tmp/pptpd
echo $UPSPEED >>/tmp/pptpd
echo $FILTERS >>/tmp/pptpd
fi;
/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 10
/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
tc class add dev $INPUT parent 1:1 classid 1:1$PPPNUM htb rate ${DOWNSPEED}kbit ceil ${DOWNSPEED}kbit burst 20k
tc class add dev $INPUT parent 1:1$PPPNUM classid 1:2$PPPNUM htb rate 32kbit ceil ${DOWNSPEED}kbit burst 20k prio 10
tc class add dev $INPUT parent 1:1$PPPNUM classid 1:3$PPPNUM htb rate 32kbit ceil ${DOWNSPEED}kbit burst 20k prio 1
tc qdisc add dev $INPUT parent 1:2$PPPNUM handle 2$PPPNUM: sfq perturb 10 quantum 1500
tc qdisc add dev $INPUT parent 1:3$PPPNUM handle 3$PPPNUM: sfq perturb 10 quantum 1500
iptables -t mangle -F
iptables -t mangle -A PREROUTING -s $IP -j MARK --set-mark 0x3$PPPNUM
iptables -t mangle -A PREROUTING -s $IP -p icmp -j MARK --set-mark 0x2$PPPNUM
iptables -t mangle -A PREROUTING -s $IP -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -j MARK --set-mark 0x2$PPPNUM
tc filter add dev $INPUT parent 1:0 protocol ip prio 1 handle 0x3$PPPNUM fw classid 1:3$PPPNUM
tc filter add dev $INPUT parent 1:0 protocol ip prio 2 handle 0x2$PPPNUM fw classid 1:2$PPPNUM
fi
#### Filters
if [ w$FILTERS != w ] ;
then
echo "filters not supported";
fi;
fi
Соответственно if-down.local:
Код: Выделить всё
#!/bin/sh
# if-down.local
debug=0;
INPUT=eth0;
if [ -f /var/run/radattr.$1 ]
then
PPPNUM=`echo $1|sed 's/ppp//'|awk {'printf "%03d",$1'}`
IP=`cat /var/run/shaper/$1`
QDISC_ETH=`tc qdisc show dev $INPUT|grep root|awk '{print $2}'`
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`
if [ w${debug} = w1 ] ; then
echo "Debug mode" >>/tmp/pptpd
echo $DOWNSPEED >>/tmp/pptpd
echo $UPSPEED >>/tmp/pptpd
echo $FILTERS >>/tmp/pptpd
fi;
##### speed server->client
if [ "$UPSPEED" != "0" ] ;
then
/sbin/tc qdisc del dev $1 root > /dev/null
fi
##### speed client->server
if [ "$DOWNSPEED" != "0" ] ;
then
tc filter del dev eth0 parent 1:0 protocol ip prio 1 handle 0x3$PPPNUM fw classid 1:3$PPPNUM
tc filter del dev eth0 parent 1:0 protocol ip prio 2 handle 0x2$PPPNUM fw classid 1:2$PPPNUM
tc class del dev $INPUT classid 1:3$PPPNUM
tc class del dev $INPUT classid 1:2$PPPNUM
tc class del dev $INPUT classid 1:1$PPPNUM
iptables -t mangle -D PREROUTING -s $IP -j MARK --set-mark 0x3$PPPNUM
iptables -t mangle -D PREROUTING -s $IP -p icmp -j MARK --set-mark 0x2$PPPNUM
iptables -t mangle -D PREROUTING -s $IP -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -j MARK --set-mark 0x2$PPPNUM
fi
#### Filters
if [ w$FILTERS != w ] ;
then
echo "filters not supported";
fi;
fi
При запуске (многократном) bash -x скрипт (для отладки) - вроде как все работает нормально.
При запуске без отладки if-up (повторном) - сервер падает о0 В логах при этом нет ничего.
Система - Fedora core 8 x86_64. Ядро 2.6.23.1-42 из ее репозитория.
Кто что может посоветовать?