基于TT 双WAN固件(dualwan)下的QOS脚本 很给力

脚本关键参数说明(V4.0):
IPS:限速开始IP地址
IPE:限速结束IP地址
IPS和IPE最好不要填写2---254,不然脚本运行时间会比较长,会多占用一些内存。
效率上,如果采用了u32 hash(v4.0和智能QOS修改版本)就没影响。
UP=35:总上传带宽。我的ADSL虽然是50KB/S,但为了低延迟,还是填35吧
DOWN=575:总下载带宽。我的ADSL虽然能达到625KB/S,但为了低延迟,还是填575吧(PS 本人家带宽6M)
UPLOADR=2:单IP上传保证带宽,2KB/S就很OK了。
UPLOADC=15:单IP上传最大带宽,ADSL也就填这么多了,搞QQ视频应该没问题。
UPLOADR2=1:被“惩罚”后的单IP上传保证带宽。
UPLOADC2=5:被“惩罚”后的单IP上传UDP最大带宽,一般不要超过6KB/S
DOWNLOADR2:被“惩罚”后的单IP下载保证带宽
DOWNLOADC2:被“惩罚”后的单IP下载最大带宽
参数修改注意事项:
1.使用English输入法修改
2.别乱加空格,参数后面没写单位的不要加上KB/S之类的单位。




附加说明1
UDP连接数限制问题:iptables的connlimit模块的udp连接数和web界面看到的udp连接数不是一回事情,connlimit的udp连接数只是
web界面看到的udp连接的一部分,是“有效连接数”。具体请自行研究iptables的conntrack机制的源代码(这个我也不太懂,半桶水)


附加说明2
V4.0 P2P惩罚脚本主要目的是为了对付PPLIVE,风行,QQLIVE,XUNLEI这样的疯狂BT软件,其中以PPLIVE的高清频道最为疯狂,风行也是
有机会就拼命发起UDP连接,xunlei有些时候也不老实。。。 
其实如果善于使用iptables的hashlimit,connlimit,recent等模块,再和TC结合起来的话,什么BT都可以治死。


附加说明3
以下代码中有两段语句 已经被我注释掉了 不起作用 想用的去掉语句前“#”即可生效
#iptables -t mangle -I PUNISH0 -m iprange --src-range 192.168.1.80-192.168.1.90 -j RETURN(意思是这个IP段的电脑不受限制)
#iptables -t mangle -I PUNISH0 -s 192.168.1.8 -j RETURN (这个是.8 IP主机不受限制 跟Zd原版QOS的“免死金牌效果”一样)


附加说明4
本人亲测效果明显 代码基于小包优先下载滞后带宽动态调配原则对网页浏览和游戏优化比较到位!家里两台电脑 一台电脑开迅雷全速下载 另外还有3家人在同时上网 在拿自己的本本测试 打开网页速度感觉就跟自己单独用一条AD感觉一样 QQ平台CS两小时延迟基本维持在50以内 其它游戏没测 (PS:本人对游戏不是很感兴趣 ) 从论坛上20多页的用户评论来说 这个QOS脚本效果真的不错  唯有不足相对于Zd TT固件中自带的3个QOS占用路由器CPU资源大了一点点 可以忽略不计 内存方面建议上到32MB比较合适    小内存路由器16MB 建议开启定时重启!

此脚本只适用于1.23固件版本  单条线路使用 1.28版本固件不建议使用















以下是QOS脚本:感谢代码贡献作者:zhoutao0712










#copyright by zhoutao0712
UIP="192.168.1."
NET="192.168.1.0/24"
IPS="2"
IPE="20"
UP=35
DOWN=575
UPLOADR=1
UPLOADC=15
DOWNLOADR=10
DOWNLOADC=$((DOWN*9/10))
UPLOADR2=1
UPLOADC2=5
DOWNLOADR2=2
DOWNLOADC2=$((DOWN*6/10))


modprobe imq
modprobe ipt_IMQ
modprobe ipt_length
modprobe ipt_hashlimit
ifconfig imq1 up
ifconfig imq0 up
iptables -t mangle -N QOSDOWN
iptables -t mangle -N QOSUP
iptables -t mangle -A PREROUTING -p ! icmp -s $NET -d ! $NET -j QOSUP
iptables -t mangle -I POSTROUTING -p ! icmp -d $NET -s ! $NET -j QOSDOWN
iptables -t mangle -A OUTPUT -o br0 -j ACCEPT
iptables -t mangle -A INPUT -i br0 -j ACCEPT
iptables -t mangle -A OUTPUT -j QOSUP
iptables -t mangle -A INPUT -j QOSDOWN


iptables -t mangle -A QOSDOWN -p udp -m mport --sports 53,67,68 -j RETURN
iptables -t mangle -A QOSUP -p udp -m mport --dports 53,67,68 -j RETURN
iptables -t mangle -N PUNISH0
iptables -t mangle -A QOSUP -p udp -j PUNISH0
iptables -t mangle -A PUNISH0 -m hashlimit --hashlimit 100/sec --hashlimit-mode srcip --hashlimit-name udplmt -j RETURN
iptables -t mangle -A PUNISH0 -m recent --rcheck --seconds 20 -j DROP
iptables -t mangle -A PUNISH0 -m recent --set
iptables -t mangle -N NEWCONN
iptables -t mangle -A QOSUP -m state --state NEW -j NEWCONN
iptables -t mangle -A NEWCONN -p ! tcp -m connlimit --connlimit-above 100 -j DROP
iptables -t mangle -A NEWCONN -p tcp -m connlimit --connlimit-above 200 -j DROP


iptables -t mangle -A QOSDOWN -p tcp ! --syn -m length --length :128 -j RETURN
iptables -t mangle -A QOSUP -p tcp ! --syn -m length --length :80 -j RETURN


iptables -t mangle -A QOSDOWN -j IMQ --todev 0
iptables -t mangle -A QOSUP -j IMQ --todev 1


iptables -t mangle -A QOSDOWN -p tcp -m length --length :768 -j MARK --set-mark-return 255
iptables -t mangle -A QOSUP -p tcp -m length --length :512 -j MARK --set-mark-return 255
iptables -t mangle -A QOSDOWN -p tcp -m mport --sports 80,443,25,110 -j BCOUNT
iptables -t mangle -A QOSDOWN -p tcp -m mport --sports 80,443,25,110 -m bcount --range :153600 -j MARK --set-mark-return 254
iptables -t mangle -A QOSUP -p tcp -m mport --dports 80,443,25,110 -j BCOUNT
iptables -t mangle -A QOSUP -p tcp -m mport --dports 80,443,25,110 -m bcount --range :51200 -j MARK --set-mark-return 254
iptables -t mangle -A QOSDOWN -m recent --rdest --rcheck  --seconds 120 -j MARK --set-mark-return 253
iptables -t mangle -A QOSUP -p udp -m recent --rcheck --seconds 120 -j MARK --set-mark-return 253
iptables -t mangle -A QOSDOWN -j MARK --set-mark 252
iptables -t mangle -A QOSUP -j MARK --set-mark 252


if [ $(cat /tmp/qos_state) -eq 1 ]
then
exit
else
echo 1 >/tmp/qos_state
fi
tc qdisc del dev imq0 root;tc qdisc del dev imq1 root
tc qdisc add dev imq0 root handle 1: htb default 999
tc qdisc add dev imq1 root handle 1: htb default 999
tc class add dev imq1 parent 1: classid 1:1 htb rate $((UP))kbps
tc class add dev imq0 parent 1: classid 1:1 htb rate $((DOWN))kbps
tc class add dev imq0 parent 1:1 classid 1:5000 htb rate $((DOWN/5))kbps quantum 15000 prio 1
tc filter add dev imq0 parent 1:0 protocol ip prio 5 handle 255 fw flowid 1:5000
tc class add dev imq1 parent 1:1 classid 1:5000 htb rate $((UP))kbps quantum 15000 prio 1
tc filter add dev imq1 parent 1:0 protocol ip prio 5 handle 255 fw flowid 1:5000
tc class add dev imq0 parent 1:1 classid 1:4000 htb rate $((DOWN/10))kbps ceil $((DOWN*6/10))kbps quantum 8000 prio 3
tc filter add dev imq0 parent 1:0 protocol ip prio 10 handle 254 fw flowid 1:4000
tc class add dev imq1 parent 1:1 classid 1:4000 htb rate $((UP/10))kbps ceil $((UP/2))kbps quantum 1500 prio 3
tc filter add dev imq1 parent 1:0 protocol ip prio 10 handle 254 fw flowid 1:4000
tc class add dev imq1 parent 1:1 classid 1:3000 htb rate $((UP/3))kbps ceil $((UP))kbps
tc class add dev imq0 parent 1:1 classid 1:3000 htb rate $((DOWN/3))kbps ceil $((DOWN))kbps
tc filter add dev imq1 parent 1:0 protocol ip prio 20 handle 253 fw flowid 1:3000
tc filter add dev imq0 parent 1:0 protocol ip prio 20 handle 253 fw flowid 1:3000
tc class add dev imq1 parent 1:1 classid 1:2000 htb rate $((UP*2/3))kbps ceil $((UP))kbps
tc class add dev imq0 parent 1:1 classid 1:2000 htb rate $((DOWN*2/3))kbps ceil $((DOWN))kbps
tc filter add dev imq1 parent 1:0 protocol ip prio 15 handle 252 fw flowid 1:2000
tc filter add dev imq0 parent 1:0 protocol ip prio 15 handle 252 fw flowid 1:2000
tc filter add dev imq0 parent 1:3000 prio 200 handle f0: protocol ip u32 divisor 256
tc filter add dev imq0 protocol ip parent 1:3000 prio 200 u32 ht 800:: match ip dst $NET hashkey mask 0x000000ff at 16 link f0:
tc filter add dev imq1 parent 1:3000 prio 200 handle f0: protocol ip u32 divisor 256
tc filter add dev imq1 protocol ip parent 1:3000 prio 200 u32 ht 800:: match ip src $NET hashkey mask 0x000000ff at 12 link f0:
tc filter add dev imq0 parent 1:2000 prio 100 handle f1: protocol ip u32 divisor 256
tc filter add dev imq0 protocol ip parent 1:2000 prio 100 u32 ht 801:: match ip dst $NET hashkey mask 0x000000ff at 16 link f1:
tc filter add dev imq1 parent 1:2000 prio 100 handle f1: protocol ip u32 divisor 256
tc filter add dev imq1 protocol ip parent 1:2000 prio 100 u32 ht 801:: match ip src $NET hashkey mask 0x000000ff at 12 link f1:
n=$IPS;
while [ $n -le $IPE ]
do
m=$(printf "%x\n" $n)
tc class add dev imq1 parent 1:3000 classid 1:${n}f htb rate $((UPLOADR2))kbps ceil $((UPLOADC2))kbps quantum 1500 prio 7
tc class add dev imq0 parent 1:3000 classid 1:${n}f htb rate $((DOWNLOADR2))kbps ceil $((DOWNLOADC2))kbps quantum 1500 prio 7
tc qdisc add dev imq1 parent 1:${n}f handle ${n}f bfifo limit 8kb
tc qdisc add dev imq0 parent 1:${n}f handle ${n}f sfq perturb 15
tc filter add dev imq1 parent 1:3000 protocol ip prio 200 u32 ht f0:${m}: match ip src 0/0 flowid 1:${n}f
tc filter add dev imq0 parent 1:3000 protocol ip prio 200 u32 ht f0:${m}: match ip dst 0/0 flowid 1:${n}f
tc class add dev imq1 parent 1:2000 classid 1:${n}a htb rate $((UPLOADR))kbps ceil $((UPLOADC))kbps quantum 1500 prio 5
tc class add dev imq0 parent 1:2000 classid 1:${n}a htb rate $((DOWNLOADR))kbps ceil $((DOWNLOADC))kbps quantum 2000 prio 5
tc qdisc add dev imq1 parent 1:${n}a handle ${n}a bfifo limit 8kb
tc qdisc add dev imq0 parent 1:${n}a handle ${n}a sfq perturb 15
tc filter add dev imq1 parent 1:2000 protocol ip prio 100 u32 ht f1:${m}: match ip src 0/0 flowid 1:${n}a
tc filter add dev imq0 parent 1:2000 protocol ip prio 100 u32 ht f1:${m}: match ip dst 0/0 flowid 1:${n}a
n=$((n+1))
done
tc class add dev imq1 parent 1:1 classid 1:999 htb rate 1kbps ceil $((UP/5))kbps quantum 1500 prio 7
tc class add dev imq0 parent 1:1 classid 1:999 htb rate 2kbps ceil $((DOWN))kbps quantum 1500 prio 7
echo 0 >/tmp/qos_state


#iptables -t mangle -I PUNISH0 -m iprange --src-range 192.168.1.80-192.168.1.90 -j RETURN
#iptables -t mangle -I PUNISH0 -s 192.168.1.8 -j RETURN


cat >/tmp/qos_scheduler <<"EOF"
echo 1 >/tmp/state_scheduler
if [ $(cat /proc/net/arp|fgrep -c 0x2) -eq 1 ]
then
ifconfig imq0 down
ifconfig imq1 down
exit
fi
if [ $(ifconfig |grep -c imq0) -eq 0 ]
then
ifconfig imq0 up
ifconfig imq1 up
fi
ip neigh flush dev $(nvram get lan_ifname)
EOF
chmod +x /tmp/qos_scheduler
cru d qos_scheduler
echo -e '*/1 * * * *  sh /tmp/qos_scheduler #qos_scheduler#' >>/tmp/var/spool/cron/crontabs/root








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