限速QOS样例

上传不限速实在是不行,局域网不时内有人开着p2p全速上传,把整个网络都堵住了。仔细研究了一下把上传问题解决了。基于nat的路由会在nat表的POSTROUTING 链上做源地址的替换,理论上只要在源地址被替换之前做标记都可以。但wifidog也会给数据包做标记,所以会冲突,下面的代码在有wifidog的系统上可以正常工作,目前还不支持不同应用的优先级划分。下面是关键代码:


  1. #! /bin/sh

  2. in_dev="br-lan"
  3. out_dev="pppoe-wan"

  4. # 网络带宽
  5. total_up="0.5mbit"
  6. total_down="5.5mbit"

  7. # 单机限速
  8. single_up="0.05mbit"
  9. single_down="0.4mbit"

  10. # 可借用带宽
  11. max_up="0.45mbit"
  12. max_down="2mbit"

  13. INET="192.168.254."

  14. ip_start="100"
  15. ip_end="200"

  16. start(){
  17. insmod sch_htb
  18. insmod cls_fw
  19. insmod cls_u32
  20. # insmod sch_sfq
  21.   tc qdisc del dev $out_dev root 2>/dev/null
  22.   tc qdisc del dev $in_dev root 2>/dev/null

  23.   tc qdisc add dev $out_dev root handle 1: htb  256 
  24.   tc qdisc add dev $in_dev root handle 1: htb default 256

  25. # 根分类,分类号1:1
  26.   tc class add dev $out_dev parent 1: classid 1:1 htb rate $total_up ceil $total_up
  27.   tc class add dev $in_dev parent 1: classid 1:1 htb rate $total_down ceil $total_down

  28.   i=$ip_start;
  29.   while [ $i -le $ip_end ]
  30.   do
  31. # out /upload
  32. #  子分类号1:?,父分类为 1:1(类的主号码必须与他们父辈的主号码一致)
  33.     tc class add dev $out_dev parent 1:1   classid 1:$i htb rate $single_up ceil $max_up prio 1
  34.     tc filter add dev $out_dev parent 1:0 protocol ip prio 100   handle 3$i fw flowid 1:$i
  35.     iptables -t mangle -A POSTROUTING -o $out_dev -s $INET$i -j MARK --set-mark 3$i

  36. # www等
  37. #    tc class add dev $out_dev parent 1:$i   classid 1:1$i htb rate $single_up ceil $max_up prio 1

  38. # 给大包做标记
  39. # 上传
  40. #    tc class add dev $out_dev parent 1:$i   classid 1:2$i htb rate $single_up ceil $max_up prio 1
  41. #    tc filter add dev  $out_dev protocol ip parent 1:1 prio 1 handle 4${i} fw flowid 1:2${i}
  42. #    iptables -t mangle -A POSTROUTING -o $out_dev -m length --length 1024:1500 -j MARK --set-mark 4${i} 



  43. # in /download
  44.     tc class add dev $in_dev parent 1:1 classid 1:$i htb rate $single_down ceil $max_down prio 1
  45.     tc filter add dev $in_dev parent 1: protocol ip prio 100  u32 match ip dst $INET$i/32 classid 1:$i

  46.     i=`expr $i + 1`
  47.   done
  48. }
  49. stop(){
  50.   i=$ip_start
  51.   echo "(stop...........)"
  52.   ((while [ $i -le $ip_end ]
  53.    do
  54.      iptables -t mangle -D POSTROUTING -o $out_dev -s  ${INET}${i} -j MARK --set-mark 3${i}
  55. #     iptables -t mangle -D POSTROUTING -o $out_dev -m length --length 1024:1500 -j MARK --set-mark 4${i}
  56.      i=`expr $i + 1`
  57.    done) && tc qdisc del dev $out_dev root && tc qdisc del dev $in_dev root && echo "ok.....!" ) || echo "error."

  58.   rmmod sch_htb
  59.   rmmod cls_fw
  60.   rmmod cls_u32
  61. #  rmmod sch_sfq
  62. }
  63. case "${1}" in
  64. start)
  65. (start && echo "Start Traffic Control") || echo "error."
  66. exit 0
  67. ;;
  68. stop)
  69. (stop && echo "Stop Traffic Control") || echo "error."
  70. exit 0
  71. ;;
  72. restart)
  73. stop
  74. start
  75. echo "Restart  Traffic Control"
  76. ;;
  77. status)
  78. status
  79. ;;
  80. esac


你可能感兴趣的:(Linux,TC)