[Asterisk-Users] Asterisk QOS working perfect using sveasoft 3.11g

John Baker JohnB at listbrokers.com
Wed Aug 4 23:54:09 MST 2004


1) I would think pfifo would be a better choice than sfq for your voip 
qdisc.  Something like:

$TC qdisc add dev $DEV parent 1:10 handle 10: pfifo limit 10

2) Marking packets worked better for me.  I could never get it to work 
any other way.  (Hey, I'm not arguing.  I'm jealous.)

3) Shouldn't you also add rules to your PREROUTING table for your 
inbound packets?  Maybe:

iptables -t mangle -A PREROUTING -p udp -m udp --sport 5036 -j MARK 
--set-mark 0x1
iptables -t mangle -A PREROUTING -p udp -m udp --sport 5036 -j RETURN
iptables -t mangle -A PREROUTING -p udp -m udp --sport 4569 -j MARK 
--set-mark 0x1
iptables -t mangle -A PREROUTING -p udp -m udp --sport 4569 -j RETURN
iptables -t mangle -A PREROUTING -p udp -m udp --sport 5060 -j MARK 
--set-mark 0x1
iptables -t mangle -A PREROUTING -p udp -m udp --sport 5060 -j RETURN

For starters (or use your classify method)

4) Might want to look at an ingress filter so your modem doesn't get 
filled up.

Nice contribution!  I like your queue length idea especially.

John


lists-jmhunter wrote:
> As seen on my post at:
> http://www.sveasoft.com/modules/phpBB2/viewtopic.php?p=28112#28112
> This works very well... It does NOT work with stable 4.0!  sveasoft
> will be issuing a bug fix for this (4.1) in the near future.
> 
> Final Rev of working script w/ asterisk support 
> 
> I'm not going to run alchemy on production machines until it is stablish. 
> 
> Remember to set your uplink properly and to set your proper wan port.
> I use pppoe for mine.
> 
> This must be used with pre 3.11 
> 
> Here are detailed instructions on how to commit this to nvram:
> http://www.sveasoft.com/modules/phpBB2/viewtopic.php?t=2943&start=0
> 
> I used that same script but did some final tweaks to make it work
> perfect for Asterisk using IAX and SIP!
> 
> 
> 
> Code:
> 
> 
> IPT=/usr/sbin/iptables 
> IP=/usr/sbin/ip 
> TC=/usr/sbin/tc 
> 
> # Specify ethernet device, Queue length, and MTU size 
> # ((qlen * mtu) / rate) / 1024 = time 
> DEV=ppp0 
> OUT_QLEN=30 
> MTU=1492 
> 
> # Set to ~80% of tested maximum bandwidth 
> UPLINK=495 
> 
> # specify class rates - We grant each class at LEAST its "fair share" of 
> # bandwidth. this way no class will ever be starved by another class. 
> UPLINK_1_R=200 # VOIP only 
> UPLINK_2_R=64 # Interactive (low port) traffic and ICMP/ACK 
> UPLINK_3_R=16 # Everything else (ssh) 
> UPLINK_4_R=16 # P2P 
> 
> # Each class is also permitted to consume all of the available bandwidth 
> # if no other classes are in use. 
> UPLINK_1_C=${UPLINK} 
> UPLINK_2_C=${UPLINK} 
> UPLINK_3_C=${UPLINK} 
> UPLINK_4_C=${UPLINK} 
> 
> # remove old qdiscs 
> $TC qdisc del dev $DEV root 2> /dev/null > /dev/null 
> $TC qdisc del dev $DEV ingress 2> /dev/null > /dev/null 
> 
> # reset iptables rules 
> $IPT -t mangle -D POSTROUTING -o $DEV -j MYOUT 
> $IPT -t mangle -F MYOUT 
> $IPT -t mangle -X MYOUT 
> 
> # set outgoing queue length 
> $IP link set dev $DEV qlen ${OUT_QLEN} 
> 
> # lower the MTU to decrease latency 
> #$IP link set dev $DEV mtu $MTU 
> 
> # Create HTB root qdisc with an htb default of 30 
> $TC qdisc add dev $DEV root handle 1: htb default 40 
> 
> # create main rate limit class 
> $TC class add dev $DEV parent 1: classid 1:1 htb rate ${UPLINK}kbit 
> 
> # create leaf rate limit classes 
> $TC class add dev $DEV parent 1:1 classid 1:10 htb rate
> ${UPLINK_1_R}kbit ceil ${UPLINK_1_C}kbit prio 0
> $TC class add dev $DEV parent 1:1 classid 1:20 htb rate
> ${UPLINK_2_R}kbit ceil ${UPLINK_2_C}kbit prio 1
> $TC class add dev $DEV parent 1:1 classid 1:30 htb rate
> ${UPLINK_3_R}kbit ceil ${UPLINK_3_C}kbit prio 2
> $TC class add dev $DEV parent 1:1 classid 1:40 htb rate
> ${UPLINK_4_R}kbit ceil ${UPLINK_4_C}kbit prio 3
> 
> # attach qdisc to leaf classes - here we at SFQ to each priority class. SFQ 
> # insures that within each class connections will be treated (almost) fairly. 
> $TC qdisc add dev $DEV parent 1:10 handle 10: sfq perturb 10 
> $TC qdisc add dev $DEV parent 1:20 handle 20: sfq perturb 10 
> $TC qdisc add dev $DEV parent 1:30 handle 30: sfq perturb 10 
> $TC qdisc add dev $DEV parent 1:40 handle 40: sfq perturb 10 
> 
> # add MYOUT chain to the mangle table in $IPT - this sets up the table 
> # we use to filter and mark packets. 
> $IPT -t mangle -N MYOUT 
> $IPT -t mangle -I POSTROUTING -o $DEV -j MYOUT 
> 
> # add fwmark entries to classify different types of traffic - Set fwmark from 
> # 10-40 according to desired class. 10 is highest prio. 
> 
> # outgoing VOIP rules - trumps everything else 
> $IPT -t mangle -A MYOUT -p udp --sport 5060:5063 -j CLASSIFY --set-class 1:10 
> $IPT -t mangle -A MYOUT -p udp --dport 5060:5063 -j CLASSIFY --set-class 1:10 
> $IPT -t mangle -A MYOUT -p udp --sport 4569:4569 -j CLASSIFY --set-class 1:10 
> $IPT -t mangle -A MYOUT -p udp --dport 4569:4569 -j CLASSIFY --set-class 1:10 
> $IPT -t mangle -A MYOUT -p udp --sport 5036:5036 -j CLASSIFY --set-class 1:10 
> $IPT -t mangle -A MYOUT -p udp --dport 5036:5036 -j CLASSIFY --set-class 1:10 
> 
> # default for outgoing interactive ports rules 
> $IPT -t mangle -A MYOUT -p tcp --sport 0:1024 -j CLASSIFY --set-class 1:20 
> $IPT -t mangle -A MYOUT -p tcp --dport 0:1024 -j CLASSIFY --set-class 1:20 
> 
> # the ack rule -- for ack packets smaller than 64 bytes --it must be
> added using
> # tc filter instead of iptables for now because the length module appears to be 
> # broken and/or missing from the wrt54g iptables 
> $TC filter add dev $DEV parent 1:0 prio 1 protocol ip u32 match ip
> protocol 6 0xff match u16 0x0000 0xffc0 at 2 match u8 0x10 0xff at 33
> flowid 1:10
> $TC filter add dev $DEV parent 1:0 prio 1 protocol ip u32 match ip
> protocol 6 0xff match u16 0x0000 0xffc0 at 2 match u8 0x60 0xff at 33
> flowid 1:10
> $TC filter add dev $DEV parent 1:0 prio 1 protocol ip u32 match ip
> protocol 6 0xff match u16 0x0000 0xffc0 at 2 match u8 0xb8 0xff at 33
> flowid 1:10
> # outgoing DNS rule 
> $IPT -t mangle -A MYOUT -p udp --dport domain -j CLASSIFY --set-class 1:20 
> 
> # cheap outgoing ping rule 
> $IPT -t mangle -A MYOUT -p icmp -j CLASSIFY --set-class 1:20 
> 
> # outgoing ssh connection rule 
> $IPT -t mangle -A MYOUT -p tcp --sport ssh -j CLASSIFY --set-class 1:20 
> $IPT -t mangle -A MYOUT -p tcp --dport ssh -j CLASSIFY --set-class 1:20 
> 
> # outgoing P2P rules -- these are close to last b/c they use
> relatively costly layer 7 matching
> $IPT -t mangle -A MYOUT -m layer7 --l7dir /etc/l7-protocols/protocols
> --l7proto directconnect -j CLASSIFY --set-class 1:40
> $IPT -t mangle -A MYOUT -m layer7 --l7dir /etc/l7-protocols/protocols
> --l7proto fasttrack -j CLASSIFY --set-class 1:40
> 
> # outgoing default rule - unmarked packets get schleped into lowest prio 
> $IPT -t mangle -A MYOUT -m mark --mark 0 -j CLASSIFY --set-class 1:30 
> 
> # All done, exit ok 
> exit 0 
> '
> _______________________________________________
> Asterisk-Users mailing list
> Asterisk-Users at lists.digium.com
> http://lists.digium.com/mailman/listinfo/asterisk-users
> To UNSUBSCRIBE or update options visit:
>    http://lists.digium.com/mailman/listinfo/asterisk-users
> 
> 



More information about the asterisk-users mailing list