分类:
2012-03-09 09:56:13
脚本测试环境是一条2MADSL,版本是dualwan 1.23.0432,关闭所有其它QOS,把脚本保存到 防火墙脚本 中,重起路由就OK。
该脚本不定义特定接口,采用IMQ(中介队列),直接把源地址和目的地址为192.168.1.0/24的数据包分别送进imq1和imq0虚拟接口。
imq0控制下载,imq1控制上传。
在小区宽带应该也可以使用。未在DD-WRT上测试,应该也能使用。
正常网页浏览和p2p软件冒用用80端口也作了区分。判定逻辑是:一个传输数据在200kB以下是网
页浏览,数据包放进高优先队列。
超过后判定为P2P软件冒用,后续数据包放进低优先级队列。(脚本中204800代表200KB)
数据包分类逻辑是:先 小包分类→网页浏览分类→p2p软件冒用80端口→IP地址分类。
并且每个数据包都只属于一种分类。比如说,一个tcp小包,即使其源IP地址是192.168.1.2,并且目的端口是80,
也只会属于小包分类。
分类的优先级:小包分类=网页浏览(prio 0) > IP地址分类 (prio 2) > p2p软件冒用80端口(prio
7)
#!/bin/sh
#变量初始化
UP="40kbps"
DOWN="180kbps"
UP2R="14kbps"
UP2C="20kbps"
UP3R="1kbps"
UP3C="10kbps"
DOWN2R="70kbps"
DOWN2C="150kbps"
DOWN3R="10kbps"
DOWN3C="80kbps"
UPLOADR="1kbps"
DOWNLOADR="10kbps"
UPLOADC="6kbps"
DOWNLOADC="80kbps"
UIP="192.168.1."
NET="192.168.1.0/24"
UPSP=:128
DOWNSP=:512
IPS="2"
IPE="8"
#装载核心模块,创建QOS专用链
insmod imq
insmod ipt_IMQ
ifconfig imq1 up
ifconfig imq0 up
insmod ipt_length.o
-t mangle
-N QOSDOWN
iptables -t mangle -N QOSUP
iptables -t mangle -I FORWARD -d $NET -j QOSDOWN
iptables -t mangle -I FORWARD -s $NET -j QOSUP
iptables -t mangle -A QOSDOWN -j IMQ --todev 0
-t mangle -A QOSUP -j IMQ --todev 1
#根队列初始化
tc qdisc del dev imq0 root
tc qdisc del dev imq1 root
tc qdisc add dev imq0 root handle 1: htb
tc qdisc add dev imq1 root handle 1: htb
tc class add dev imq1 parent 1: classid 1:1 htb rate $UP
tc class add dev imq0 parent 1: classid 1:1 htb rate $DOWN
#特殊队列(小包,http)初始化
tc class add dev imq0 parent 1:1 classid 1:2 htb rate $DOWN2R ceil
$DOWN2C prio 0
tc class add dev imq0 parent 1:1 classid 1:3 htb rate $DOWN3R ceil
$DOWN2C prio 7
tc filter add dev imq0 parent 1:0 protocol ip handle 2 fw flowid 1:2
tc filter add dev imq0 parent 1:0 protocol ip handle 3 fw flowid 1:3
iptables -t mangle -A QOSDOWN -j BCOUNT
iptables -t mangle -A QOSDOWN -m length --length $DOWNSP -j MARK
--set-mark-return 2
iptables -t mangle -A QOSDOWN -p tcp -m mport --sports 80,443 -m bcount
--range :204800 -j MARK --set-mark-return 2
iptables -t mangle -A QOSDOWN -p tcp -m mport --sports 80,443 -m bcount
--range 204801: -j MARK --set-mark-return 3
tc class add dev imq1 parent 1:1 classid 1:2 htb rate $UP2R ceil $UP2C
prio 0
tc class add dev imq1 parent 1:1 classid 1:3 htb rate $UP3R ceil $UP3C
prio 7
tc filter add dev imq1 parent 1:0 protocol ip handle 2 fw flowid 1:2
tc filter add dev imq1 parent 1:0 protocol ip handle 3 fw flowid 1:3
s -t mangle -A QOSUP -j BCOUNT
iptables -t mangle -A QOSUP -m length --length :128 -j MARK
--set-mark-return 2
iptables -t mangle -A QOSUP -p tcp -m mport --dports 80,443 -m bcount
--range :204800 -j MARK --set-mark-return 2
s -t mangle -A QOSUP -p tcp -m mport --dports 80,443 -m bcount
--range 204801: -j MARK --set-mark-return 3
#特殊IP限速(未给出)
#所有普通IP单独限速
i=$IPS;
while [ $i -le $IPE ]
do
tc class add dev imq1 parent 1:1 classid 1:1$i htb rate $UPLOADR ceil
$UPLOADC prio 2
tc qdisc add dev imq1 parent 1:1$i handle 1$i: sfq perturb 15
tc filter add dev imq1 parent 1:0 protocol ip handle 1$i fw classid
1:1$i
tc class add dev imq0 parent 1:1 classid 1:1$i htb rate $DOWNLOADR ceil
$DOWNLOADC prio 2
tc qdisc add dev imq0 parent 1:1$i handle 1$i: sfq perturb 15
tc filter add dev imq0 parent 1:0 protocol ip handle 1$i fw classid
1:1$i
iptables -t mangle -A QOSUP -s $UIP$i -j MARK --set-mark-return 1$i
iptables -t mangle -A QOSDOWN -d $UIP$i -j MARK --set-mark-return 1$i
i=`expr $i + 1`
done
#每IP限制TCP连接数50,UDP连接数80,并且对53,80等端口例外(该模块可以单独使用)
iptables -t mangle -N LMT
iptables -t mangle -I PREROUTING -i br0 -j LMT
iptables -t mangle -A LMT -p tcp --syn -m connlimit --connlimit-above 50
--connlimit-mask 32 -j DROP
iptables -t mangle -A LMT -p udp -m udplimit --udplimit-above 60
--udplimit-mask 32 -j DROP
iptables -t mangle -I LMT -s 192.168.1.0/24 -p udp -m mport --dports 53
-j RETURN
iptables -t mangle -I LMT -s 192.168.1.0/24 -p tcp -m mport --dports
20:23,25,53,80,110,443 -j RETURN
qq交流群 42776821
文章转载至