1. #!/bin/bash
  2. 
  3. tc=`which tc`
  4. INTERNAL_IFACE='eth1'
  5. EXTERNAL_IFACE='eth0'
  6. WIRELESS_IFACE='eth2'
  7. INTERNAL_ROOT='1'
  8. EXTERNAL_ROOT='2'
  9. WIRELESS_ROOT='3'
  10. 
  11. # Define your incoming and outgoing bandwidth here. Take a little off
  12. # for overhead bandwidth.
  13. IN_BANDWIDTH='3008' # 3Mbit : 3072Kbit - 64Kbit overhead = 3008Kbit
  14. OUT_BANDWIDTH='240' # 256Kbit : 256Kbit - 16Kbit overhead = 240Kbit
  15. 
  16. LIMIT='2' # Classes for limited packets
  17. MANAGEMENT='8' # Class for management
  18. 
  19. # Here we define the classes we want to classify out bandwith usage with.
  20. VOIP='10'
  21. WWW='11'
  22. GAMES='12'
  23. P2P='13'
  24. OTHER='14'
  25. # Now the maximum shared bandwidth to assign each class (in kilobits).
  26. VOIP_RATE_OUT='96'
  27. VOIP_RATE_IN='96'
  28. WWW_RATE_OUT='80'
  29. WWW_RATE_IN='1200'
  30. GAMES_RATE_OUT='48'
  31. GAMES_RATE_IN='392'
  32. P2P_RATE_OUT='8'
  33. P2P_RATE_IN='1200'
  34. OTHER_RATE_OUT='8'
  35. OTHER_RATE_IN='120'
  36. 
  37. # Remove any previously applied disciplines
  38. ${tc} qdisc del dev ${INTERNAL_IFACE} root 2>/dev/null
  39. ${tc} qdisc del dev ${EXTERNAL_IFACE} root 2>/dev/null
  40. ${tc} qdisc del dev ${WIRELESS_IFACE} root 2>/dev/null
  41. 
  42. # Create the new queueing disciplines
  43. ${tc} qdisc add dev ${INTERNAL_IFACE} root handle ${INTERNAL_ROOT}:0 cbq \
  44. avpkt 1000 rate 100mbit bandwidth 100mbit
  45. ${tc} qdisc add dev ${EXTERNAL_IFACE} root handle ${EXTERNAL_ROOT}:0 cbq \
  46. avpkt 1000 rate 100mbit bandwidth 100mbit
  47. ${tc} qdisc add dev ${WIRELESS_IFACE} root handle ${WIRELESS_ROOT}:0 cbq \
  48. avpkt 1000 rate 54mbit bandwidth 54mbit
  49. 
  50. # Create an inband management class. I don't think this is really necessary on a home
  51. # network, but the http://www.sigsegv.cx/qos.html article suggests it.
  52. ${tc} class add dev ${INTERNAL_IFACE} parent ${INTERNAL_ROOT}:0 \
  53. classid ${INTERNAL_ROOT}:${MANAGEMENT} cbq allot 1500 rate 10mbit prio 1 avpkt 1500 bounded
  54. 
  55. # Now to setup the LIMIT classes for incoming and outgoing bandwidth.
  56. ${tc} class add dev ${INTERNAL_IFACE} parent ${INTERNAL_ROOT}:0 \
  57. classid ${INTERNAL_ROOT}:${LIMIT} \
  58. cbq allot 1500 rate ${IN_BANDWIDTH}kbit prio 1 avpkt 1500 bounded
  59. ${tc} class add dev ${WIRELESS_IFACE} parent ${WIRELESS_ROOT}:0 \
  60. classid ${WIRELESS_ROOT}:${LIMIT} \
  61. cbq allot 1500 rate ${IN_BANDWIDTH}kbit prio 1 avpkt 1500 bounded
  62. # We only need to throttle the outgoing bandwidth on the external interface.
  63. ${tc} class add dev ${EXTERNAL_IFACE} parent ${EXTERNAL_ROOT}:0 \
  64. classid ${EXTERNAL_ROOT}:${LIMIT} \
  65. cbq allot 1500 rate ${OUT_BANDWIDTH}kbit prio 1 avpkt 1500 bounded
  66. 
  67. ### Classes ###
  68. 
  69. # VoIP
  70. ${tc} class add dev ${INTERNAL_IFACE} parent ${INTERNAL_ROOT}:${LIMIT} \
  71. classid ${INTERNAL_ROOT}:${VOIP} cbq allot 1500 rate ${VOIP_RATE_IN}kbit prio 1 \
  72. weight 9.6 avpkt 1500 isolated
  73. ${tc} class add dev ${WIRELESS_IFACE} parent ${WIRELESS_ROOT}:${LIMIT} \
  74. classid ${WIRELESS_ROOT}:${VOIP} cbq allot 1500 rate ${VOIP_RATE_IN}kbit prio 1 \
  75. weight 9.6 avpkt 1500 isolated
  76. ${tc} class add dev ${EXTERNAL_IFACE} parent ${EXTERNAL_ROOT}:${LIMIT} \
  77. classid ${EXTERNAL_ROOT}:${VOIP} cbq allot 1500 rate ${VOIP_RATE_OUT}kbit prio 1 \
  78. weight 9.6 avpkt 1500 isolated
  79. 
  80. # WWW
  81. ${tc} class add dev ${INTERNAL_IFACE} parent ${INTERNAL_ROOT}:${LIMIT} \
  82. classid ${INTERNAL_ROOT}:${WWW} cbq allot 1500 rate ${WWW_RATE_IN}kbit prio 2 \
  83. weight 120 avpkt 1500
  84. ${tc} class add dev ${WIRELESS_IFACE} parent ${WIRELESS_ROOT}:${LIMIT} \
  85. classid ${WIRELESS_ROOT}:${WWW} cbq allot 1500 rate ${WWW_RATE_IN}kbit prio 2 \
  86. weight 120 avpkt 1500
  87. ${tc} class add dev ${EXTERNAL_IFACE} parent ${EXTERNAL_ROOT}:${LIMIT} \
  88. classid ${EXTERNAL_ROOT}:${WWW} cbq allot 1500 rate ${WWW_RATE_OUT}kbit prio 2 \
  89. weight 8 avpkt 1500
  90. 
  91. # Games
  92. ${tc} class add dev ${INTERNAL_IFACE} parent ${INTERNAL_ROOT}:${LIMIT} \
  93. classid ${INTERNAL_ROOT}:${GAMES} cbq allot 1500 rate ${GAMES_RATE_IN}kbit prio 3 \
  94. weight 39.2 avpkt 1500
  95. ${tc} class add dev ${WIRELESS_IFACE} parent ${WIRELESS_ROOT}:${LIMIT} \
  96. classid ${WIRELESS_ROOT}:${GAMES} cbq allot 1500 rate ${GAMES_RATE_IN}kbit prio 3 \
  97. weight 39.2 avpkt 1500
  98. ${tc} class add dev ${EXTERNAL_IFACE} parent ${EXTERNAL_ROOT}:${LIMIT} \
  99. classid ${EXTERNAL_ROOT}:${GAMES} cbq allot 1500 rate ${GAMES_RATE_OUT}kbit prio 3 \
  100. weight 4.8 avpkt 1500
  101. 
  102. # P2P
  103. ${tc} class add dev ${INTERNAL_IFACE} parent ${INTERNAL_ROOT}:${LIMIT} \
  104. classid ${INTERNAL_ROOT}:${P2P} cbq allot 1500 rate ${P2P_RATE_IN}kbit prio 4 \
  105. weight 120 avpkt 1500
  106. ${tc} class add dev ${WIRELESS_IFACE} parent ${WIRELESS_ROOT}:${LIMIT} \
  107. classid ${WIRELESS_ROOT}:${P2P} cbq allot 1500 rate ${P2P_RATE_IN}kbit prio 4 \
  108. weight 120 avpkt 1500
  109. ${tc} class add dev ${EXTERNAL_IFACE} parent ${EXTERNAL_ROOT}:${LIMIT} \
  110. classid ${EXTERNAL_ROOT}:${P2P} cbq allot 1500 rate ${P2P_RATE_OUT}kbit prio 4 \
  111. weight 0.8 avpkt 1500
  112. 
  113. # Other
  114. ${tc} class add dev ${INTERNAL_IFACE} parent ${INTERNAL_ROOT}:${LIMIT} \
  115. classid ${INTERNAL_ROOT}:${OTHER} cbq allot 1500 rate ${OTHER_RATE_IN}kbit prio 5 \
  116. weight 12 avpkt 1500
  117. ${tc} class add dev ${WIRELESS_IFACE} parent ${WIRELESS_ROOT}:${LIMIT} \
  118. classid ${WIRELESS_ROOT}:${OTHER} cbq allot 1500 rate ${OTHER_RATE_IN}kbit prio 5 \
  119. weight 12 avpkt 1500
  120. ${tc} class add dev ${EXTERNAL_IFACE} parent ${EXTERNAL_ROOT}:${LIMIT} \
  121. classid ${EXTERNAL_ROOT}:${OTHER} cbq allot 1500 rate ${OTHER_RATE_OUT}kbit prio 5 \
  122. weight 0.8 avpkt 1500
  123. 
  124. ## Apply classes to packets marked with iptables ##
  125. 
  126. # VoIP
  127. ${tc} filter add dev ${INTERNAL_IFACE} protocol ip \
  128. parent ${INTERNAL_ROOT}:0 prio 1 handle ${VOIP} \
  129. fw flowid ${INTERNAL_ROOT}:${VOIP}
  130. ${tc} filter add dev ${WIRELESS_IFACE} protocol ip \
  131. parent ${WIRELESS_ROOT}:0 prio 1 handle ${VOIP} \
  132. fw flowid ${WIRELESS_ROOT}:${VOIP}
  133. ${tc} filter add dev ${EXTERNAL_IFACE} protocol ip \
  134. parent ${EXTERNAL_ROOT}:0 prio 1 handle ${VOIP} \
  135. fw flowid ${EXTERNAL_ROOT}:${VOIP}
  136. 
  137. # WWW
  138. ${tc} filter add dev ${INTERNAL_IFACE} protocol ip \
  139. parent ${INTERNAL_ROOT}:0 prio 2 handle ${WWW} \
  140. fw flowid ${INTERNAL_ROOT}:${WWW}
  141. ${tc} filter add dev ${WIRELESS_IFACE} protocol ip \
  142. parent ${WIRELESS_ROOT}:0 prio 2 handle ${WWW} \
  143. fw flowid ${WIRELESS_ROOT}:${WWW}
  144. ${tc} filter add dev ${EXTERNAL_IFACE} protocol ip \
  145. parent ${EXTERNAL_ROOT}:0 prio 2 handle ${WWW} \
  146. fw flowid ${EXTERNAL_ROOT}:${WWW}
  147. 
  148. # GAMES
  149. ${tc} filter add dev ${INTERNAL_IFACE} protocol ip \
  150. parent ${INTERNAL_ROOT}:0 prio 3 handle ${GAMES} \
  151. fw flowid ${INTERNAL_ROOT}:${GAMES}
  152. ${tc} filter add dev ${WIRELESS_IFACE} protocol ip \
  153. parent ${WIRELESS_ROOT}:0 prio 3 handle ${GAMES} \
  154. fw flowid ${WIRELESS_ROOT}:${GAMES}
  155. ${tc} filter add dev ${EXTERNAL_IFACE} protocol ip \
  156. parent ${EXTERNAL_ROOT}:0 prio 3 handle ${GAMES} \
  157. fw flowid ${EXTERNAL_ROOT}:${GAMES}
  158. 
  159. # P2P
  160. ${tc} filter add dev ${INTERNAL_IFACE} protocol ip \
  161. parent ${INTERNAL_ROOT}:0 prio 4 handle ${P2P} \
  162. fw flowid ${INTERNAL_ROOT}:${P2P}
  163. ${tc} filter add dev ${WIRELESS_IFACE} protocol ip \
  164. parent ${WIRELESS_ROOT}:0 prio 4 handle ${P2P} \
  165. fw flowid ${WIRELESS_ROOT}:${P2P}
  166. ${tc} filter add dev ${EXTERNAL_IFACE} protocol ip \
  167. parent ${EXTERNAL_ROOT}:0 prio 4 handle ${P2P} \
  168. fw flowid ${EXTERNAL_ROOT}:${P2P}
  169. 
  170. # OTHER
  171. ${tc} filter add dev ${INTERNAL_IFACE} protocol ip \
  172. parent ${INTERNAL_ROOT}:0 prio 5 handle ${OTHER} \
  173. fw flowid ${INTERNAL_ROOT}:${OTHER}
  174. ${tc} filter add dev ${WIRELESS_IFACE} protocol ip \
  175. parent ${WIRELESS_ROOT}:0 prio 5 handle ${OTHER} \
  176. fw flowid ${WIRELESS_ROOT}:${OTHER}
  177. ${tc} filter add dev ${EXTERNAL_IFACE} protocol ip \
  178. parent ${EXTERNAL_ROOT}:0 prio 5 handle ${OTHER} \
  179. fw flowid ${EXTERNAL_ROOT}:${OTHER}