Advertisement
Guest User

nbolton

a guest
Dec 5th, 2009
328
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
Bash 4.36 KB | None | 0 0
  1. #!/bin/bash
  2.  
  3. #set -v
  4.  
  5. # crontab doesn't look in /sbin
  6. tc=/sbin/tc
  7.  
  8. # devices (up and down)
  9. # traffic is routed in to eth1, and out of eth0
  10. dev_dn=eth0
  11. dev_up=eth1
  12.  
  13. # special filter ip's
  14. sv_ips=("192.168.20.10" "192.168.20.1") # sv-1, rt-1
  15. tv_ip=192.168.20.100 # bt vision client
  16. ws_ips=("192.168.20.106" "192.168.20.102") # ws-1, ws-4
  17. hb_ips=(
  18.     "212.58.224.0/19" "213.120.0.0/14" # bbc iplayer servers
  19.     "87.248.212.0/24" # windows update
  20.     "168.143.161.20" # twirl (uses twitter)
  21. )
  22.  
  23. # throttle speeds
  24. up_kbit=500 # internet upload
  25. dn_kbit=8000 # internet download
  26. local_mbit=100 # static lan speed
  27.  
  28. while getopts ":u:d:?" opt
  29. do
  30.     case $opt in
  31.     u) up_kbit=$OPTARG ;;
  32.     d) dn_kbit=$OPTARG ;;
  33.     *) echo "qos-on [-d dn_kbit|-u up_kbit]" ;;
  34.     esac
  35. done
  36.  
  37. # upload classes
  38. # burst is for web page requests
  39. up_c1="htb \
  40. rate ${up_kbit}kbit \
  41. ceil ${up_kbit}kbit \
  42. prio 1"
  43. up_c2="htb \
  44. rate $[8*$up_kbit/10]kbit \
  45. ceil ${up_kbit}kbit \
  46. prio 2"
  47. up_c3="htb \
  48. rate $[4*$up_kbit/10]kbit \
  49. ceil ${up_kbit}kbit \
  50. prio 3"
  51.  
  52. # download classes
  53. # burst is for web page responses
  54. dn_c1="htb \
  55. rate ${dn_kbit}kbit \
  56. ceil ${dn_kbit}kbit \
  57. prio 1"
  58. dn_c2="htb \
  59. rate ${dn_kbit}kbit \
  60. ceil ${dn_kbit}kbit \
  61. prio 2"
  62. dn_c3="htb \
  63. rate $[8*$dn_kbit/10]kbit \
  64. ceil ${dn_kbit}kbit \
  65. burst 300k \
  66. prio 3"
  67. dn_c4="htb \
  68. rate $[6*$dn_kbit/10]kbit \
  69. ceil ${dn_kbit}kbit \
  70. burst 200k \
  71. prio 4"
  72. dn_c5="htb \
  73. rate $[5*$dn_kbit/10]kbit \
  74. ceil ${dn_kbit}kbit \
  75. prio 5"
  76.  
  77. # print some debug info
  78. echo -e "\n"`date`
  79. echo "upload..."
  80. echo "  1: $up_c1"
  81. echo "  2: $up_c2"
  82. echo "  3: $up_c3"
  83. echo "download..."
  84. echo "  1: $dn_c1"
  85. echo "  2: $dn_c2"
  86. echo "  3: $dn_c3"
  87. echo "  4: $dn_c4"
  88. echo "  5: $dn_c5"
  89.  
  90. # reset all devs
  91. $tc qdisc del dev $dev_up root 2> /dev/null
  92. $tc qdisc del dev $dev_dn root 2> /dev/null
  93.  
  94. # add a handle with default flow
  95. $tc qdisc add dev $dev_up root handle 1: htb default 30
  96. $tc qdisc add dev $dev_dn root handle 2: htb default 40
  97.  
  98. $tc class add dev $dev_up parent 1: classid 1:1 htb rate ${up_kbit}kbit ceil ${up_kbit}kbit
  99. $tc class add dev $dev_dn parent 2: classid 2:1 htb rate ${dn_kbit}kbit ceil ${dn_kbit}kbit
  100.  
  101. # internet upload
  102. $tc class add dev $dev_up parent 1:1 classid 1:10 $up_c1
  103. $tc class add dev $dev_up parent 1:1 classid 1:20 $up_c2
  104. $tc class add dev $dev_up parent 1:1 classid 1:30 $up_c3
  105. $tc qdisc add dev $dev_up parent 1:10 handle 10: sfq perturb 10
  106. $tc qdisc add dev $dev_up parent 1:20 handle 20: sfq perturb 10
  107. $tc qdisc add dev $dev_up parent 1:30 handle 30: sfq perturb 10
  108.  
  109. # internet download
  110. $tc class add dev $dev_dn parent 2:1 classid 2:10 $dn_c1
  111. $tc class add dev $dev_dn parent 2:1 classid 2:20 $dn_c2
  112. $tc class add dev $dev_dn parent 2:1 classid 2:30 $dn_c3
  113. $tc class add dev $dev_dn parent 2:1 classid 2:40 $dn_c4
  114. $tc class add dev $dev_dn parent 2:1 classid 2:50 $dn_c5
  115. $tc qdisc add dev $dev_dn parent 2:10 handle 10: sfq perturb 10
  116. $tc qdisc add dev $dev_dn parent 2:20 handle 20: sfq perturb 10
  117. $tc qdisc add dev $dev_dn parent 2:30 handle 30: sfq perturb 10
  118. $tc qdisc add dev $dev_dn parent 2:40 handle 40: sfq perturb 10
  119. $tc qdisc add dev $dev_dn parent 2:50 handle 50: sfq perturb 10
  120.  
  121. # lan up/down (we don't want to limit this)
  122. $tc class add dev $dev_dn parent 2:1 classid 2:5 htb rate ${local_mbit}mbit
  123. $tc qdisc add dev $dev_dn parent 2:5 handle 5: sfq perturb 10
  124.  
  125. u32_up="$tc filter add dev $dev_up protocol ip parent 1:0 prio 1 u32"
  126. u32_dn="$tc filter add dev $dev_dn protocol ip parent 2:0 prio 1 u32"
  127.  
  128. # lan traffic (up and down goes via eth1)
  129. for ip in ${sv_ips[*]}; do
  130.     $u32_dn match ip src $ip flowid 2:5
  131. done
  132.  
  133. # highest download prio
  134. $u32_dn match ip dst $tv_ip flowid 2:10
  135.  
  136. # ssh and icmp - very high up and down
  137. $u32_up match ip tos 0x10 0xff flowid 1:10
  138. $u32_up match ip protocol 1 0xff flowid 1:10
  139. $u32_dn match ip tos 0x10 0xff flowid 2:20
  140. $u32_dn match ip protocol 1 0xff flowid 2:20
  141.  
  142. # ack - fairly high (but it does use a lot of bw)
  143. $u32_up \
  144.    match ip protocol 6 0xff \
  145.    match u8 0x05 0x0f at 0 \
  146.    match u16 0x0000 0xffc0 at 2 \
  147.    match u8 0x10 0xff at 33 \
  148.    flowid 1:20
  149.  
  150. # cap heavy downloading (before workstations)
  151. for ip in ${hb_ips[*]}; do
  152.     $u32_dn match ip src $ip flowid 2:50
  153. done
  154.  
  155. # high prio workstations's (left over traffic)
  156. for ip in ${ws_ips[*]}; do
  157.     $u32_dn match ip dst $ip flowid 2:30
  158. done
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement