基于openwrt的自动OQS配置脚本

1:说明

此处的自动的意思为:只要用户动态获取到IP地址之后,程序就会自动根据此IP地址配置TC规则,对此在线的用户进行上下行带宽速率的限制。下面的脚本是本人测试过的,在速率限制上面没有问题,就是没有优先级的设置。

2:TC配置脚本如下:

[python]  view plain  copy
 print ?
  1. #!/bin/sh  
  2.   
  3. i=0  
  4. sum=0;  
  5. in_dev="br-lan"  
  6. out_dev="br-wan"  
  7. onlineUserNum=0;  
  8. #dhcp.release=/x86_openwrt/qos_workd/dhcp.leases  
  9.   
  10. #touch tmp_ipaddr.log  
  11. tmpfile=tmp_ipaddr.log  
  12. CONFIGFILEDIR=/etc/qos  
  13.   
  14. MACADDR_FiLE=$CONFIGFILEDIR/tmp_macAddr.log  
  15. DHCP_RELEASE=/var/dhcp.leases  
  16. MAX_RATE_LOG=$CONFIGFILEDIR/maxrate.log  
  17. TMP_WGET_LOG=$CONFIGFILEDIR/wget.log  
  18. TMP_TC_LOG=$CONFIGFILEDIR/tc.log  
  19. div_part=0;  
  20.   
  21. print_debug()  
  22. {  
  23.   `$1`  
  24.     echo "$1" >> $CONFIGFILEDIR/tc.log  
  25.   
  26. }  
  27. tcinitfunc()  
  28. {  
  29.         total_down=`cat $MAX_RATE_LOG|grep "maxrate"|cut -d ":" -f 2`  
  30.         if [ "$total_down"x = ""x ] ; then  
  31.       
  32.                 total_down=4096  
  33.       
  34.         fi  
  35.       total_down=$(( $total_down * 8 ))  
  36.         total_up=$(( $total_down / 2 ))  
  37.   
  38.       print_debug "tc qdisc add dev $out_dev root handle 1:0 htb  default 30 r2q 20 "  
  39.       print_debug "tc class add dev $out_dev parent 1:0 classid 1:1 htb rate $total_up"kbit" ceil $total_up"kbit" "  
  40.         
  41.         print_debug "tc qdisc add dev $in_dev root handle 1: htb default 100"  
  42.         print_debug "tc class add dev $in_dev  parent 1:  classid 1:1 htb rate $total_down"kbit"  ceil $total_down"kbit" "  
  43.       
  44. }  
  45. configTcRule()  
  46. {  
  47.      ipaddr=$1;  
  48. #产生唯一MARK值  
  49.      ipseg3=`echo $ipaddr|cut -d "." -f 3`  
  50.      ipseg4=`echo $ipaddr|cut -d "." -f 4`  
  51.      markflag=$(( $ipseg3 + $ipseg4 ))  
  52. #当前网络的上下行带宽  
  53.     total_down=`cat $MAX_RATE_LOG|grep "maxrate"|cut -d ":" -f 2`  
  54.     if [ "$total_down"x = ""x ] ; then  
  55.   
  56.             total_down=4096  
  57.   
  58.     fi  
  59.         total_down=$(( $total_down * 8 ))  
  60. #   echo $total_down   
  61.     total_up=$(( $total_down / 2 ))  
  62. #可预借带宽  
  63.     max_up=$(( $total_up / 5 ))   
  64.     max_down=$(( $total_down / 5 ))  
  65.   
  66. #根据实际的用户数平分网络带宽  
  67.   
  68.      if [ "$onlineUserNum"  -le 5 ] ;then  
  69.   
  70.  #      single_up=$(( $total_up / $onlineUserNum ))  
  71. #       single_down=$(( $total_up/ $onlineUserNum  ))  
  72.         div_part=5;  
  73.      elif [ "$onlineUserNum" -gt 5 -a "$onlineUserNum"  -le 10 ] ;then   
  74.             div_part=10;  
  75.      elif [ "$onlineUserNum" -gt 10 -a "$onlineUserNum" -le 15 ] ;then   
  76.             div_part=15;  
  77.      elif [ "$onlineUserNum" -gt 15 -a "$onlineUserNum"  -le  20 ] ;then   
  78.             div_part=20;  
  79.     else  
  80.             div_part=$onlineUserNum ;  
  81.   
  82.      fi  
  83.         single_up=$(( $total_up / $div_part ))   
  84.     #           single_up=$(( $total_up / $div_part ))  
  85.         single_down=$(( $total_up/ $div_part  ))  
  86.   
  87. echo "CONFIG QOS RULE for:  $ipaddr onlineUserNum=$onlineUserNum  div_part =$div_part total_down=$total_down"kbit"  total_up=$total_up"kbit"  ipseg3=$ipseg3 ipseg4= $ipseg4 markflag=$markflag" >> $CONFIGFILEDIR/tc.log  
  88. #     tc qdisc del dev $out_dev root 2>/dev/null  
  89. #     tc qdisc del dev $in_dev root 2>/dev/null  
  90.        
  91. #     tc qdisc add dev $out_dev root handle 1:0 htb default 30 r2q 20  
  92. #     print_debug "tc qdisc add dev $out_dev root handle 1:0 htb  default 30 r2q 20 "  
  93. #     tc class add dev $out_dev parent 1:0 classid 1:1 htb rate $total_up"kbit" ceil $total_up"kbit"   
  94.     #  print_debug "tc class add dev $out_dev parent 1:0 classid 1:1 htb rate $total_up"kbit" ceil $total_up"kbit" "  
  95.   
  96. # tc -s class show dev br-wan  
  97. # tc -s qdisc ls dev br-wan  
  98. # tc -s -d filter show dev br-wan  
  99. #upload  
  100. #       tc class add dev $out_dev parent 1:1   classid 1:$markflag htb rate $single_up"kbit"  ceil $max_up"kbit"  prio 10 burst 15k quantum 20000  
  101. #       print_debug " tc class add dev $out_dev parent 1:1   classid 1:$markflag htb rate $single_up"kbit"  ceil $max_up"kbit"  prio 10 burst 15k quantum 20000"  
  102. #       tc filter add dev $out_dev parent 1:0 protocol ip prio 10   handle $markflag fw flowid 1:$markflag  
  103. #       print_debug " tc filter add dev $out_dev parent 1:0 protocol ip prio 10   handle $markflag fw flowid 1:$markflag"  
  104. #       iptables -t mangle -A POSTROUTING -o $out_dev -s $ipaddr -j MARK --set-mark $markflag  
  105. #       print_debug "iptables -t mangle -A POSTROUTING -o $out_dev -s $ipaddr -j MARK --set-mark $markflag"  
  106. # www等  
  107. #    tc class add dev $out_dev parent 1:$markflag   classid 1:1$i htb rate $single_up ceil $max_up prio 1  
  108.   
  109. # 给大包做标记  
  110. # 上传  
  111.   
  112. #www等         
  113. #    iptables -t mangle -A POSTROUTING -o $out_dev -m length --length 1024:1500 -j MARK --set-mark 4$markflag   
  114.     print_debug "iptables -t mangle -A POSTROUTING -o $out_dev -s $ipaddr -p tcp -m multiport --dport 80,8080 -j MARK --set-mark 4$markflag"   
  115.         print_debug "tc class add dev $out_dev parent 1:1  classid 1:2$markflag htb rate $single_up"kbit"  ceil $total_up"kbit"  prio 1"  
  116.         print_debug "tc filter add dev  $out_dev protocol ip parent 1:0 prio 1 handle 4$markflag  fw flowid 1:2$markflag"  
  117.     print_debug "tc qdisc add dev $out_dev parent 1:2$markflag handle 2$markflag: fq_codel"   
  118.   
  119.   
  120.   
  121. #download   
  122.         print_debug "tc class add dev $in_dev parent 1:1 classid 1:$markflag htb rate $single_down"kbit"  ceil $max_down"kbit"  prio 1"  
  123.         print_debug "tc filter add dev $in_dev parent 1: protocol ip prio 100  u32 match ip dst $ipaddr flowid $classid 1:$markflag"  
  124.   
  125. }  
  126.   
  127. deliptable_psotrouting()  
  128. {  
  129.     while read -r line ;do  
  130.   
  131.           macaddr=`echo $line |cut -d " " -f 2`  
  132.          if [ "$macaddr" != "" ] ; then  
  133.               
  134.              ipaddr=`echo $line |cut -d " " -f 3`  
  135.              ipseg3=`echo $ipaddr|cut -d "." -f 3`  
  136.              ipseg4=`echo $ipaddr|cut -d "." -f 4`  
  137.              markflag=$(( $ipseg3 + $ipseg4 ))  
  138.                   iptables -t mangle -D POSTROUTING -o $out_dev -s $ipaddr -p tcp -m multiport --dport 80,8080 -j MARK --set-mark 4$markflag  
  139.             echo "iptables -t mangle -D POSTROUTING -o $out_dev -s $ipaddr -p tcp -m multiport --dport 80,8080 -j MARK --set-mark 4$markflag"  
  140.         fi  
  141.     done < $DHCP_RELEASE  
  142. }  
  143. autoConfigQos()  
  144. {  
  145.   
  146.     flag_iptables=0;  
  147.     if ! test -e $MACADDR_FiLE;then  
  148.         touch $MACADDR_FiLE;  
  149.         cat /dev/null > $MACADDR_FiLE  
  150.     fi  
  151.   
  152.     if ! test -e $CONFIGFILEDIR/tc.log;then  
  153.         touch $CONFIGFILEDIR/tc.log;  
  154.         cat /dev/null > $CONFIGFILEDIR/tc.log  
  155.     fi  
  156.   
  157.     while read -r line ;do  
  158.     onlineUserNum=$(( $onlineUserNum + 1 ))  
  159.     done < $DHCP_RELEASE  
  160.   
  161.   
  162.      if [ "$onlineUserNum"  -le 5 ] ;then  
  163.             div_part=5;  
  164.         if [ "$onlineUserNum"  -eq 5 ] ; then  
  165.   
  166.             echo "onlineUserNum=$onlineUserNum" > $MACADDR_FiLE   
  167.         fi  
  168.      elif [ "$onlineUserNum" -gt 5 -a "$onlineUserNum"  -le 10 ] ;then   
  169.   
  170.         num=`cat $MACADDR_FiLE|grep "onlineUserNum"|cut -d "=" -f 2`  
  171.         if [ "$num" = "6" ] ; then  
  172.   
  173.                 echo "onlineUserNum=$onlineUserNum find num=$num in $MACADDR_FiLE "  
  174.   
  175.         else                  
  176.                 cat /dev/null > $MACADDR_FiLE  
  177.                 echo "onlineUserNum=6" > $MACADDR_FiLE   
  178.                 echo "=========== === cat /dev/null > $MACADDR_FiLE  onlineUserNum=$onlineUserNum =================="      
  179.                 tc qdisc del dev $out_dev root >/dev/null  
  180.                 tc qdisc del dev $in_dev   root >/dev/null     
  181.                 flag_iptables=1;  
  182.         fi  
  183.      elif [ "$onlineUserNum" -gt 10 -a "$onlineUserNum" -le 15 ] ;then   
  184.         num=`cat $MACADDR_FiLE|grep "onlineUserNum"|cut -d "=" -f 2`  
  185.         if [ "$num" = "11" ] ; then  
  186.   
  187.                 echo "onlineUserNum=$onlineUserNum find num=$num in $MACADDR_FiLE "  
  188.   
  189.         else          
  190.                 cat /dev/null > $MACADDR_FiLE  
  191.                 echo "onlineUserNum=11" > $MACADDR_FiLE   
  192.                 echo "=========== === cat /dev/null > $MACADDR_FiLE  onlineUserNum=$onlineUserNum =================="      
  193.                 tc qdisc del dev $out_dev root >/dev/null  
  194.                 tc qdisc del dev $in_dev   root >/dev/null     
  195.                 flag_iptables=1;  
  196.         fi  
  197.      elif [ "$onlineUserNum" -gt 15 -a "$onlineUserNum"  -le  20 ] ;then   
  198.         num=`cat $MACADDR_FiLE|grep "onlineUserNum"|cut -d "=" -f 2`  
  199.         if [ "$num"   =  "16" ] ; then  
  200.   
  201.                 echo "onlineUserNum=$onlineUserNum find num=$num in $MACADDR_FiLE "  
  202.   
  203.         else  
  204.                   
  205.                 cat /dev/null > $MACADDR_FiLE  
  206.                 echo "onlineUserNum=16" > $MACADDR_FiLE   
  207.                 echo "=========== === cat /dev/null > $MACADDR_FiLE  onlineUserNum=$onlineUserNum =================="      
  208.                 tc qdisc del dev $out_dev root >/dev/null  
  209.                 tc qdisc del dev $in_dev   root >/dev/null     
  210.                 flag_iptables=1;          
  211.         fi  
  212.     else  
  213.             div_part=$onlineUserNum ;  
  214.   
  215.      fi  
  216.     if [ "$flag_iptables" -eq 1 ];then  
  217.   
  218.         deliptable_psotrouting  
  219.     fi  
  220.   
  221.   
  222.     while read -r line ;do  
  223.   
  224.           macaddr=`echo $line |cut -d " " -f 2`  
  225.          if [ "$macaddr" != "" ] ; then  
  226.                 macaddrfind=`cat $MACADDR_FiLE|grep $macaddr`  
  227.                 if [ "$macaddrfind" == "" ] ; then  
  228.   
  229.                     ipaddr=`echo $line |cut -d " " -f 3`  
  230.                     echo  $macaddr >> $MACADDR_FiLE  
  231.                     configTcRule $ipaddr   
  232.   
  233.                 fi  
  234.   
  235.         fi  
  236.     done < $DHCP_RELEASE  
  237. }  
  238.   
  239. getNetworkDownLoadRate()  
  240. {  
  241.   
  242.     i=0  
  243.     sum=0;  
  244.   
  245.     cat /dev/null > $MAX_RATE_LOG  
  246.     cat /dev/null > $TMP_WGET_LOG  
  247.     while(($i<5))  
  248.     do  
  249.   
  250.         wget http://cn.wordpress.org/wordpress-3.1-zh_CN.zip >& $TMP_WGET_LOG  
  251.         maxrate=`cat $TMP_WGET_LOG |grep "save"|cut -d " " -f 3-4 >> $MAX_RATE_LOG`  
  252.         i=$(($i+1))  
  253.     done  
  254.   
  255.     maxrate=0  
  256.     while read -r line ;do  
  257.   
  258.         findMB=`echo $line|grep "MB/s"`  
  259.         rate=`echo $line |cut -d " " -f 1|cut -d  "(" -f 2|cut -d "." -f 1`  
  260.         if [ "$findMB" != "" ] ; then  
  261.   
  262.                 rate=$(( $rate * 1024 ))  
  263.   
  264.         fi  
  265.   
  266.         echo  $rate  
  267.         if [ $rate -gt $maxrate ] ;then  
  268.   
  269.   
  270.             maxrate=$rate  
  271.         fi  
  272.   
  273.     done < $MAX_RATE_LOG  
  274.     echo "maxrate:$maxrate" >> $MAX_RATE_LOG  
  275. }  
  276. tmp=$1  
  277. if [ "$tmp" = "netrate" ];then  
  278.         getNetworkDownLoadRate  
  279. elif [ "$tmp" = "qosconfig" ];then  
  280.         autoConfigQos  
  281. elif [ "$tmp" = "deliptables" ];then  
  282.         deliptable_psotrouting  
  283. elif [ "$tmp" = "tcinit" ];then  
  284.         tcinitfunc  
  285. fi  
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值