IPT=/sbin/iptables
IP=/sbin/ip
TC=/sbin/tc
# Specify ethernet device, Queue length, and MTU size
# ((qlen * mtu) / rate) / 1024 = time
DEV=eth0
OUT_QLEN=100
MTU=1492
# Set to ~80% of tested maximum bandwidth
UPLINK=10000000
# 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=512 # VOIP only
UPLINK_2_R=256 # Interactive services (HTTP)
UPLINK_3_R=256 # Default
UPLINK_4_R=128 # Bulk
# 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
echo “first”
#$IPT -t mangle -D PREROUTING -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
echo “second”
$IPT -t mangle -I POSTROUTING -o $DEV -j MYOUT
echo “third”
# add fwmark entries to classify different types of traffic - Set fwmark from
# 10-40 according to desired class. 10 is highest prio.
$IPT -t mangle -A MYOUT -j MARK –set-mark 30
# 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
$IPT -t mangle -A MYOUT -p udp –sport 4569 -j MARK –set-mark 10
$IPT -t mangle -A MYOUT -p udp –dport 4569 -j MARK –set-mark 10
$IPT -t mangle -A MYOUT -p udp –sport 5060:5070 -j MARK –set-mark 10
$IPT -t mangle -A MYOUT -p udp –dport 5060:5070 -j MARK –set-mark 10
$IPT -t mangle -A MYOUT -p udp –sport 16000:17000 -j MARK –set-mark 10
$IPT -t mangle -A MYOUT -p udp –dport 16000:17000 -j MARK –set-mark 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
#$IPT -t mangle -A MYOUT -p tcp –sport 0:1024 -j MARK –set-mark 20
#$IPT -t mangle -A MYOUT -p tcp –dport 0:1024 -j MARK –set-mark 20
$IPT -t mangle -A MYOUT -p tcp –sport smtp -j MARK –set-mark 40
$IPT -t mangle -A MYOUT -p tcp –dport smtp -j MARK –set-mark 40
$IPT -t mangle -A MYOUT -p tcp –sport rsync -j MARK –set-mark 40
$IPT -t mangle -A MYOUT -p tcp –dport rsync -j MARK –set-mark 40
# 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 0×0000 0xffc0 at 2 match u8 0×10 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 0×0000 0xffc0 at 2 match u8 0×60 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 0×0000 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
$IPT -t mangle -A MYOUT -p udp –dport domain -j MARK –set-mark 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
$IPT -t mangle -A MYOUT -p tcp –sport ssh -j MARK –set-mark 20
$IPT -t mangle -A MYOUT -p tcp –dport ssh -j MARK –set-mark 20
$IPT -t mangle -A MYOUT -p tcp –sport 2545 -j MARK –set-mark 20
$IPT -t mangle -A MYOUT -p tcp –dport 2545 -j MARK –set-mark 20
#
# Web
#
$IPT -t mangle -A MYOUT -p tcp –sport http -j MARK –set-mark 20
$IPT -t mangle -A MYOUT -p tcp –dport http -j MARK –set-mark 20
$IPT -t mangle -A MYOUT -p tcp –sport https -j MARK –set-mark 20
$IPT -t mangle -A MYOUT -p tcp –dport https -j MARK –set-mark 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
# No Classify, so we need to assign them
tc filter add dev eth0 parent 1:0 prio 0 protocol ip handle 10 fw flowid 1:10
tc filter add dev eth0 parent 1:0 prio 0 protocol ip handle 20 fw flowid 1:20
tc filter add dev eth0 parent 1:0 prio 0 protocol ip handle 30 fw flowid 1:30
tc filter add dev eth0 parent 1:0 prio 0 protocol ip handle 40 fw flowid 1:40
# All done, exit ok
exit 0