Здесь пример только для входящего трафика. Исходящий жмется также.
#cat /etc/init.d/shaper.sh
eth0 - local net interface
case "$1" in
start)
echo -n "Starting shaper. . ."
tc qdisc add dev eth0 root handle 1: htb default 30 r2q 1
tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit
#самый медленный класс, с приоритетом 1 - потому как тормознуть наглый хост надо палюбасу :)
tc class add dev eth0 parent 1:1 classid 1:30 htb rate 4mbit ceil 10mbit burst 200k prio 1
tc qdisc add dev eth0 parent 1:30 sfq perturb 10
iptables -t mangle -A POSTROUTING -o eth0 -d 192.168.1.66 -j CLASSIFY --set-class 1:30
#туда же весь торрент трафик
iptables -t mangle -A POSTROUTING -o eth0 -p tcp -m multiport --sport 4661,4662,4672,4665,4711,6881:6889,6881:6999 -j CLASSIFY --set-class 1:30
iptables -t mangle -A POSTROUTING -o eth0 -p udp -m multiport --sport 4661,4662,4672,4665,4711,6881:6889,6881:6999 -j CLASSIFY --set-class 1:30
#более добрая политика для внутряки через прокси и остальное
tc class add dev eth0 parent 1:1 classid 1:20 htb rate 10mbit ceil 30mbit burst 200k prio 2
tc qdisc add dev eth0 parent 1:20 sfq perturb 10
iptables -t mangle -A POSTROUTING -o eth0 -p tcp -m multiport --sport 3128,80,443,25,110,495,995,465,222,2222 -j CLASSIFY --set-class 1:20
#совсем добрый класс для dns/ssh, мелких пакетов и директора))
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 4mbit ceil 100mbit burst 200k prio 3
tc qdisc add dev eth0 parent 1:10 sfq perturb 10
iptables -t mangle -A POSTROUTING -o eth0 -p tcp -m multiport --sport 53,123,22 -j CLASSIFY --set-class 1:10
iptables -t mangle -A POSTROUTING -o eth0 -p tcp --syn -m length --length 40:68 -j CLASSIFY --set-class 1:10
iptables -t mangle -A POSTROUTING -o eth0 -p tcp --tcp-flags ALL SYN,ACK -m length --length 40:68 -j CLASSIFY --set-class 1:10
iptables -t mangle -A POSTROUTING -o eth0 -d 192.168.0.66 -j CLASSIFY --set-class 1:10
echo "OK"
;;
#окончание скрипта
stop)
echo -n "Stopping shaper. . ."
iptables -t mangle -F
tc qdisc del dev eth0 root
echo "OK"
;;
status)
if [ "$2" = "" ]; then
$0; exit;fi
echo "============== QDISC STATUS =================="
tc -s -d qdisc show dev $2
echo "============== CLASS STATUS =================="
tc -s -d class show dev $2
echo "----------------------------------------------"
;;
restart)
$0 stop && $0 start || exit 1
;;
*)
echo "Usage: `basename $0` {start|stop|restart|status eth0/eth1}"
exit 1
;;
esac