# Script to shape up and downlink with traffic that is already MARKed # Delete all old stuff first tc qdisc del dev ppp0 root 2> /dev/null > /dev/null tc qdisc del dev ifb0 root 2> /dev/null > /dev/null tc qdisc del dev ifb0 ingress 2> /dev/null > /dev/null tc qdisc del dev ppp0 root 2> /dev/null > /dev/null tc qdisc del dev ifb0 root 2> /dev/null > /dev/null tc qdisc del dev ppp0 ingress 2> /dev/null > /dev/null tc qdisc del dev eth0 root 2> /dev/null > /dev/null tc qdisc del dev eth0 ingress 2> /dev/null > /dev/null # Set variables # The downlink should be slightly less than the ADSL line # All the classes below should add up to this DOWNLINK=2200 # Same for the uplink UPLINK=330 ############################################################################## ## downlink via eth0 ## # A qdisc is a whole set of shaping rules that we apply # Here we add a HTB qdisc to the interface eth0 # This is known as the root for the interface # We don't set a default class to stop us shaping local eth0 traffic # We have to shape at eth0 and not ppp0 as we can only do egress shaping tc qdisc add dev eth0 root handle 1: htb # Then we add to the root some overall rate limits tc class add dev eth0 parent 1: classid 1:1 htb rate ${DOWNLINK}kbit # Then we go through and add a number of classes to the # root qdisc. With some qdiscs the classes are automatically # created. With HTB they are not so we add 4 in total # with different rate limits for each # interactive traffic tc class add dev eth0 parent 1:1 classid 1:10 htb \ rate 100kbit ceil 100kbit prio 0 # web browsing tc class add dev eth0 parent 1:1 classid 1:30 htb \ rate 1000kbit ceil 1000kbit prio 1 # default traffic tc class add dev eth0 parent 1:1 classid 1:40 htb \ rate 1000kbit ceil 1000kbit prio 2 # bad boys tc class add dev eth0 parent 1:1 classid 1:60 htb \ rate 100kbit ceil 100kbit prio 3 # Next we add some more qdiscs. These are different priority # qdiscs but they each sit on top of the classes already created. # So the root qdisc dumps traffic in each class, and the qdisc # here prioritises within that class tc qdisc add dev eth0 parent 1:10 handle 10: sfq perturb 10 tc qdisc add dev eth0 parent 1:30 handle 30: sfq perturb 10 #flow hash keys dst divisor 1024 #hash ctorigsrc tc qdisc add dev eth0 parent 1:40 handle 40: sfq perturb 10 #hash ctorigsrc tc qdisc add dev eth0 parent 1:60 handle 60: sfq perturb 10 #hash ctorigsrc # Finally we attach some filters to each class # A filter is what sends a particular packet to a particular class # This filter uses the iptables marks to allocate them tc filter add dev eth0 parent 1:0 protocol ip handle 10 fw flowid 1:10 tc filter add dev eth0 parent 1:0 protocol ip handle 30 fw flowid 1:30 tc filter add dev eth0 parent 1:0 protocol ip handle 40 fw flowid 1:40 tc filter add dev eth0 parent 1:0 protocol ip handle 60 fw flowid 1:60 # These are additional filters that hash based on the client IP # This means that rather than bandwidth being shared between # several connections (so that one client could get several times # the bandwidth), each client gets an equal slice of the bandwidth # regardless of the number of connections they have tc filter add dev eth0 parent 10: protocol ip handle 10 flow hash keys nfct-dst divisor 1024 tc filter add dev eth0 parent 30: protocol ip handle 30 flow hash keys nfct-dst divisor 1024 tc filter add dev eth0 parent 40: protocol ip handle 40 flow hash keys nfct-dst divisor 1024 tc filter add dev eth0 parent 60: protocol ip handle 60 flow hash keys nfct-dst divisor 1024 ########################################## End of downlink configuration ########################################## ################################################################################################################### ## uplink via ppp0 ## # A qdisc is a whole set of shaping rules that we apply # Here we add a HTB qdisc to the interface ppp0 # This is known as the root for the interface # Default class is 40 tc qdisc add dev ppp0 root handle 1: htb default 40 # Then we add to the root some overall rate limits tc class add dev ppp0 parent 1: classid 1:1 htb rate ${UPLINK}kbit # Then we go through and add a number of classes to the # root qdisc. With some qdiscs the classes are automatically # created. With HTB they are not so we add 4 in total # with different rate limits each # interactive traffic tc class add dev ppp0 parent 1:1 classid 1:10 htb \ rate 50kbit ceil 50kbit prio 0 # web browsing tc class add dev ppp0 parent 1:1 classid 1:30 htb \ rate 120kbit ceil 200kbit prio 1 # default traffic tc class add dev ppp0 parent 1:1 classid 1:40 htb \ rate 120kbit ceil 200kbit prio 2 # bad boys tc class add dev ppp0 parent 1:1 classid 1:60 htb \ rate 40kbit ceil 40kbit prio 3 # Next we add some more qdiscs. These are different priority # qdiscs but they each sit on top of the classes already created. # So the root qdisc dumps traffic in each class, and the qdisc # here prioritises within that class tc qdisc add dev ppp0 parent 1:10 handle 10: sfq perturb 10 tc qdisc add dev ppp0 parent 1:30 handle 30: sfq perturb 10 tc qdisc add dev ppp0 parent 1:40 handle 40: sfq perturb 10 tc qdisc add dev ppp0 parent 1:60 handle 60: sfq perturb 10 # Finally we attach some filters to each class # A filter is what sends a particular packet to a particular class # This filter uses the iptables marks to allocate them tc filter add dev ppp0 parent 1:0 prio 0 protocol ip handle 10 fw flowid 1:10 tc filter add dev ppp0 parent 1:0 prio 0 protocol ip handle 30 fw flowid 1:30 tc filter add dev ppp0 parent 1:0 prio 0 protocol ip handle 40 fw flowid 1:40 tc filter add dev ppp0 parent 1:0 prio 0 protocol ip handle 60 fw flowid 1:60 # see download comment tc filter add dev ppp0 parent 10: protocol ip handle 10 flow hash keys nfct-src divisor 1024 tc filter add dev ppp0 parent 30: protocol ip handle 30 flow hash keys nfct-src divisor 1024 tc filter add dev ppp0 parent 40: protocol ip handle 40 flow hash keys nfct-src divisor 1024 tc filter add dev ppp0 parent 60: protocol ip handle 60 flow hash keys nfct-src divisor 1024 ################################# End of uplink configuration #####################################################
Courtesy : http://files.andybev.com/web-portal/shape-htb