上传不限速实在是不行,局域网不时内有人开着p2p全速上传,把整个网络都堵住了。仔细研究了一下把上传问题解决了。基于nat的路由会在nat表的POSTROUTING 链上做源地址的替换,理论上只要在源地址被替换之前做标记都可以。但wifidog也会给数据包做标记,所以会冲突,下面的代码在有wifidog的系统上可以正常工作,目前还不支持不同应用的优先级划分。下面是关键代码:
- #! /bin/sh
-
- in_dev="br-lan"
- out_dev="pppoe-wan"
-
- # 网络带宽
- total_up="0.5mbit"
- total_down="5.5mbit"
-
- # 单机限速
- single_up="0.05mbit"
- single_down="0.4mbit"
-
- # 可借用带宽
- max_up="0.45mbit"
- max_down="2mbit"
-
- INET="192.168.254."
-
- ip_start="100"
- ip_end="200"
-
- start(){
- insmod sch_htb
- insmod cls_fw
- insmod cls_u32
- # insmod sch_sfq
- tc qdisc del dev $out_dev root 2>/dev/null
- tc qdisc del dev $in_dev root 2>/dev/null
-
- tc qdisc add dev $out_dev root handle 1: htb 256
- tc qdisc add dev $in_dev root handle 1: htb default 256
-
- # 根分类,分类号1:1
- tc class add dev $out_dev parent 1: classid 1:1 htb rate $total_up ceil $total_up
- tc class add dev $in_dev parent 1: classid 1:1 htb rate $total_down ceil $total_down
-
- i=$ip_start;
- while [ $i -le $ip_end ]
- do
- # out /upload
- # 子分类号1:?,父分类为 1:1(类的主号码必须与他们父辈的主号码一致)
- tc class add dev $out_dev parent 1:1 classid 1:$i htb rate $single_up ceil $max_up prio 1
- tc filter add dev $out_dev parent 1:0 protocol ip prio 100 handle 3$i fw flowid 1:$i
- iptables -t mangle -A POSTROUTING -o $out_dev -s $INET$i -j MARK --set-mark 3$i
-
- # www等
- # tc class add dev $out_dev parent 1:$i classid 1:1$i htb rate $single_up ceil $max_up prio 1
-
- # 给大包做标记
- # 上传
- # tc class add dev $out_dev parent 1:$i classid 1:2$i htb rate $single_up ceil $max_up prio 1
- # tc filter add dev $out_dev protocol ip parent 1:1 prio 1 handle 4${i} fw flowid 1:2${i}
- # iptables -t mangle -A POSTROUTING -o $out_dev -m length --length 1024:1500 -j MARK --set-mark 4${i}
-
-
-
- # in /download
- tc class add dev $in_dev parent 1:1 classid 1:$i htb rate $single_down ceil $max_down prio 1
- tc filter add dev $in_dev parent 1: protocol ip prio 100 u32 match ip dst $INET$i/32 classid 1:$i
-
- i=`expr $i + 1`
- done
- }
- stop(){
- i=$ip_start
- echo "(stop...........)"
- ((while [ $i -le $ip_end ]
- do
- iptables -t mangle -D POSTROUTING -o $out_dev -s ${INET}${i} -j MARK --set-mark 3${i}
- # iptables -t mangle -D POSTROUTING -o $out_dev -m length --length 1024:1500 -j MARK --set-mark 4${i}
- i=`expr $i + 1`
- done) && tc qdisc del dev $out_dev root && tc qdisc del dev $in_dev root && echo "ok.....!" ) || echo "error."
-
- rmmod sch_htb
- rmmod cls_fw
- rmmod cls_u32
- # rmmod sch_sfq
- }
- case "${1}" in
- start)
- (start && echo "Start Traffic Control") || echo "error."
- exit 0
- ;;
- stop)
- (stop && echo "Stop Traffic Control") || echo "error."
- exit 0
- ;;
- restart)
- stop
- start
- echo "Restart Traffic Control"
- ;;
- status)
- status
- ;;
- esac
-