[Asterisk-Users] Asterisk QOS working perfect using sveasoft 3.11g
lists-jmhunter
jacob.hunter at gmail.com
Wed Aug 4 02:26:07 MST 2004
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
'
More information about the asterisk-users
mailing list