qos功能脚本

 

#/bin/sh

#/lib/****qos/****qos_function.sh

 

QOS_CONF=/etc/config/****qos

EVAL=eval

LOGGER=logger

mask=0x0000FFFF

ETHBW=1024000

lan_mark=2222

 

local prog=****qos

local wan_ifname

local lan_ifname=br-lan

# values for ****qos config

local qos_enable

local download_bw

local upload_bw

local dfclass

 

# values for high class

local high_up_rate  # upload rate

local high_down_rate

local high_up_ceil

local high_down_ceil

local high_prio

local high_classid

local high_mark

 

# values for medium class

local medium_up_rate  # upload rate

local medium_down_rate

local medium_up_ceil

local medium_down_ceil

local medium_prio

local medium_classid

local medium_mark

 

# values for low class

local low_up_rate  # upload rate

local low_down_rate

local low_up_ceil

local low_down_ceil

local low_prio

local low_classid

local low_mark

 

 

 

show_data()

{

         echo"### config for coolqos ###"

        

         echo"wan_ifname=${wan_ifname}"

         echo"lan_ifname=${lan_ifname}"

         #values for coolqos config

         echoqos_enable=${qos_enable}

         echodownload_bw=${download_bw}

         echoupload_bw=${upload_bw}

         echodfclass=${dfclass}

        

         echo""

         #values for high class

         echo"### config for high class ###"

         echohigh_up_rate=${high_up_rate}    

         echohigh_down_rate=${high_down_rate}

         echohigh_up_ceil=${high_up_ceil}

         echohigh_down_ceil=${high_down_ceil}

         echohigh_prio=${high_prio}

         echohigh_classid=${high_classid}

         echohigh_mark=${high_mark}

        

         echo""

# values for medium class

         echo"###config for medium class ###"

         echomedium_up_rate=${medium_up_rate}        

         echomedium_down_rate=${medium_down_rate}

         echomedium_up_ceil=${medium_up_ceil}

         echomedium_down_ceil=${medium_down_ceil}

         echomedium_prio=${medium_prio}

         echomedium_classid=${medium_classid}

         echomedium_mark=${medium_mark}

 

         echo""

# values for low class

         echo"### config for low class ###"

         echolow_up_rate=${low_up_rate}       

         echolow_down_rate=${low_down_rate}

         echolow_up_ceil=${low_up_ceil}

         echolow_down_ceil=${low_down_ceil}

         echolow_prio=${low_prio}

         echolow_classid=${low_classid}

         echolow_mark=${low_mark}

 

 

}

 

get_wan_ifname()

{

         localwan_proto

         config_loadnetwork

         config_getwan_proto wan proto "none"

         if[ ${wan_proto} == "none" ]; then

                   LOGGER"${prog}:cannot get wan proto,exit"

                   exit1

         else

                   if[ ${wan_proto} == "pppoe" ]; then

                            wan_ifname=pppoe-wan

                   else

                            wan_ifname=vlan2

                   fi

         fi

        

}

init_data()

{

         localhigh_uprate_prec

         localhigh_downrate_prec

         localmedium_uprate_prec

         localmedium_downrate_prec

         locallow_uprate_prec

         locallow_downrate_prec

         get_wan_ifname;

         config_load$QOS_CONF

        

         #get config for coolqos  

         config_getqos_enable  coolqos enable "0"

         if[ ${qos_enable} != "1" ]; then

                   $LOGGER"${prog}:don't enable coolqos,exit"

                   exit1

         fi

         config_getdownload_bw coolqos download "10240"

         config_getupload_bw coolqos upload "1024"

         config_getdfclass coolqos dfclass "high"

                  

         #get config for high class default,high: 50%~100%

         config_gethigh_uprate_prec high  uprate"50,100"

         config_gethigh_downrate_prec high  downrate"50,100"

         config_gethigh_prio high prio "1"

         config_gethigh_classid high classid "1001"

         config_gethigh_mark high mark "1001"

         #get config for medium class default,medium: 30%~60%

         config_getmedium_uprate_prec medium uprate "30,60"

         config_getmedium_downrate_prec medium downrate "30,60"

         config_getmedium_prio medium prio "2"

         config_getmedium_classid medium classid "1002"

         config_getmedium_mark medium mark "1002"

         #get config for low class default,low: 20%~30%

         config_getlow_uprate_prec low uprate "20,30"

         config_getlow_downrate_prec low downrate "20,30"

         config_getlow_prio low prio "1"

         config_getlow_classid low classid "1003"

         config_getlow_mark low mark "1003"

 

         #get rate with prec*bw

         localvar

         localtmp

         localdest

         localrate_prec

         localceil_prec

         forvar in high medium low ; do

                   tmp=${var}_uprate_prec

                   dest=`evalecho '$'$tmp`

                   rate_prec=`echo${dest}|awk -F ',' '{print $1}' `

                   ceil_prec=`echo${dest}|awk -F ',' '{print $2}' `

                  

                   eval${var}_up_rate=$(echo `expr ${rate_prec} \* ${upload_bw}  \/ 100 `)

                   eval${var}_up_ceil=`expr ${ceil_prec} \* ${upload_bw}  \/ 100 `

                  

                   tmp=${var}_downrate_prec

                   dest=`evalecho '$'$tmp`

                   rate_prec=`echo${dest}|awk -F ',' '{print $1}' `

                   ceil_prec=`echo${dest}|awk -F ',' '{print $2}' `

                   eval${var}_down_rate=$(echo `expr ${rate_prec} \* ${download_bw}  \/ 100 `)

                   eval${var}_down_ceil=`expr ${ceil_prec} \* ${download_bw}  \/ 100 `                 

                  

         done

        

}

create_qdisc()

{

        

         localvar

         localclass

         localifname

         localtmp

         localtmp_value

         localrate

         localceil

         localclassid

         localmark

         localprio

         forvar in down up ; do

                   if[ ${var} == "up" ]; then

                            ifname=${wan_ifname}

                            TQA="tcqdisc add dev $ifname";

                            TCA="tcclass add dev $ifname";

                            TFA="tcfilter add dev $ifname";

                            #########[UPLOAD] config root qdisc for wan_ifname ##########

                            tmp=${dfclass}_classid

                            tmp_value=`evalecho '$'$tmp`

                            $EVAL"tc qdisc del dev $ifname root 1>/dev/null 2>&1"

                            $EVAL"$TQA root handle 1: htb default ${tmp_value}"

                            $EVAL"$TCA parent 1: classid 1:1 htb rate ${upload_bw}kbit ceil  ${upload_bw}kbit"       

                           

                   else

                            ifname=${lan_ifname}

                            TQA="tcqdisc add dev $ifname";

                            TCA="tcclass add dev $ifname";

                            TFA="tcfilter add dev $ifname";

                            #########[DOWNLOAD] config root qdisc for lan_ifname ##########

                            tmp=${dfclass}_classid

                            tmp_value=`evalecho '$'$tmp`

                            $EVAL"tc qdisc del dev $ifname root 1>/dev/null 2>&1"

                            $EVAL"$TQA root handle 1: htb default ${tmp_value}"

                            $EVAL"$TCA parent 1: classid 1:1 htb rate ${download_bw}kbit ceil  ${download_bw}kbit"     

                            #config class 1:2 for lan to lan

                            $EVAL"$TCA parent 1: classid 1:2 htb rate ${ETHBW}kbit ceil  ${ETHBW}kbit"

                            $EVAL"$TQA parent 1:2 handle 2: sfq perturb 10"

                            $EVAL"$TFA parent 1: prio 1 protocol ip handle 0x${lan_mark} fw flowid1:2"

                           

                   fi

                   #echo"${var}load"

                   #echo"TQA=$TQA"

                   #echo"TCA=$TCA"

                   #echo"TFA=$TFA"

                   forclass in high medium low ; do

                            #echo"#Config  ${class} class for${var}load traffic"

                            tmp=${class}_${var}_rate

                            rate=`evalecho '$'$tmp`

                            tmp=${class}_${var}_ceil

                            ceil=`evalecho '$'$tmp`

                            tmp=${class}_prio

                            prio=`evalecho '$'$tmp`

                            tmp=${class}_classid

                            classid=`evalecho '$'$tmp`

                            tmp=${class}_mark

                            mark=`evalecho '$'$tmp`

                           

                            echo"#[${var}LOAD] Config ${class},rate ${rate}kbit ceil ${ceil}kbit classid${classid}"

                            $EVAL"$TCA parent 1:1 classid 1:${classid} htb rate ${rate}kbit ceil${ceil}kbit  prio $prio "

                            #add sfq disc

                            $EVAL"$TQA parent 1:${classid} handle ${classid}: sfq perturb 10"

                            #add filter

                            #echo"#[${var}LOAD] add filter for ${var}"

                            $EVAL"$TFA parent 1: prio ${prio} protocol ip handle 0x${mark} fw flowid1:${classid}"

                           

                   done

         done

}

# add host

add_host()

{

         #echo"add_host"

         #$1:IPADDR$2:class

         localmark

         localclass

         localip

        

         config_getip $1 ipaddr "0"

         config_getclass $1 class "0"

        

         if[ ! ${ip} ]; then

                   #echo"ip is null"

                   return1

         fi

         if[ "${ip}" = "0" ] ; then

                   return1

         fi

         #get host class mark

         tmp=${class}_mark

         mark=`evalecho '$'$tmp`

         if[ ! -n "${mark}" ]; then

                   mark=${high_mark}

         fi

        

        

         IPT_CMD_DOWN="iptables-t mangle -A QOS_DOWNLOAD -d ${ip} -j MARK --set-mark 0x${mark}/${mask} "

         IPT_CMD_UP="iptables-t mangle -A QOS_UPLOAD -s ${ip} -j MARK --set-mark 0x${mark}/${mask} "

         $EVAL${IPT_CMD_DOWN}

         $EVAL${IPT_CMD_UP}

        

         IPT_CMD_DOWN="iptables-t mangle -A QOS_DOWNLOAD -d ${ip} -j RETURN "

         IPT_CMD_UP="iptables-t mangle -A QOS_UPLOAD -s ${ip} -j RETURN"

         $EVAL${IPT_CMD_DOWN}

         $EVAL${IPT_CMD_UP}

        

}

 

create_netfilter_rule()

{

         #echo"create_netfilter_rule"

         localIPTN_CMD="iptables -t mangle -N "

         localIPTA_CMD="iptables -t mangle -A "

        

        

         $EVAL"$IPTN_CMD QOS_DOWNLOAD"

         $EVAL"${IPTA_CMD} POSTROUTING  -o${lan_ifname} -j QOS_DOWNLOAD"

        

         $EVAL"${IPTN_CMD} QOS_UPLOAD"

         $EVAL"${IPTA_CMD} POSTROUTING  -o${wan_ifname} -j QOS_UPLOAD"

        

         #add rules in mangle for lan host(192.168.1.0/24) access to router(192.168.1.1)

         locallan_net_addr=`ifconfig br-lan | grep "inet addr" | cut -d":" -f 2 | cut -d " " -f 1 | cut -d "." -f1-3`.0/24

         $EVAL"iptables -t mangle -A QOS_DOWNLOAD -s ${lan_net_addr} -j MARK --set-mark0x${lan_mark}/${mask}"

         $EVAL"iptables -t mangle -A QOS_DOWNLOAD -s ${lan_net_addr} -j RETURN"

        

         config_load$QOS_CONF

         config_foreachadd_host host

        

}

 

qos_start()

{

         init_data

         #show_data

         create_qdisc

         create_netfilter_rule

}

 

qos_stop()

{

         get_wan_ifname

         #delete qdisc

         $EVAL"tc qdisc del dev $lan_ifname root 1>/dev/null 2>&1"

         $EVAL"tc qdisc del dev $wan_ifname root 1>/dev/null 2>&1"

        

         #delete chains in mangle table

         $EVAL"iptables -t mangle -F QOS_DOWNLOAD 1>/dev/null 2>&1"

         $EVAL"iptables -t mangle -D POSTROUTING -o ${lan_ifname} -j QOS_DOWNLOAD  1>/dev/null 2>&1"

         $EVAL"iptables -t mangle -X QOS_DOWNLOAD 1>/dev/null 2>&1"

 

         $EVAL"iptables -t mangle -F QOS_UPLOAD 1>/dev/null 2>&1 "

         $EVAL"iptables -t mangle -D POSTROUTING -o ${wan_ifname} -j QOS_UPLOAD  1>/dev/null 2>&1"

         $EVAL"iptables -t mangle -X QOS_UPLOAD 1>/dev/null 2>&1"

}

 

qos_restart()

{

         qos_stop

         qos_start

}

小包优先+web优先+2千多条游戏服务器IP优先+游戏爆发+连接数限制 番茄概念QOS脚本 主要概念: 1.小包优先定义: 上传数据包中长度小于128Byte并且状态为ESTABLISHED的数据包 下载数据包中长度小于256Byte并且状态为ESTABLISHED的数据包 这个ESTABLISHED是什么东东呢? 解释:TCP数据包有INVALID,ESTABLISHED,NEW,RELATED,UNTRACKED等状态。 具体解释:http://man.chinaunix.net/network/iptables-tutorial-cn-1.1.19.html#USERLANDSTATES 这个ESTABLISHED指连接已经完全建立的数据包了,而NEW指新建一个连接所使用的第一个数据包。 这样,就排除了那些状态为NEW的小包。 好处:有些人总是热衷于“修改XP最大连接数”来提高BT下载速率。其实这个所谓的“最大连接数”是指“最大并发连接数”, 也就是XP每秒能够发送状态为NEW的数据包,默认值是10。有些垃圾的BT软件将其修改为1000,这样庞大的连接数将会导致 瞬间上传速率非常大,如果将其优先级设置太高,将会导致网络延迟的震荡(一会高一会低)。 PS:“修改XP最大连接数”是无法提高BT下载的速率的,最多可以提高达到最大速率的时间。比如说不修改30秒达到最大速率,修改 后可能10秒就达到最大速率。但是会带来操作系统不稳定,路由器压力增大,蠕虫攻击,网络延迟震荡等不良后果。 微软在IT业混了几十年,从来就不提倡所谓的“修改最大连接数”。 2.正常的web浏览相对于下载BT数据包具有较高的优先级。 3.游戏爆发的定义: 当某个内网IP的速率小于50KB/S的时候,那么该IP的数据包进入“游戏爆发队列”。时间为10秒。 “游戏爆发队列”的优先级仅仅低于“游戏队列” 对于那些只玩游戏不下载的IP有帮助。 4.连接数限制。PS:tcp连接数在ROS各版本均可用,UDP连接数则需在5.X以上支持! 每IP限制TCP连接数100,UDP连接数150,并且对DNS,WEB,QQ等端口例外 不过在此我并未加入在脚本里,大家可以自行添加。 ex: TCP限线程 /ip firewall filter add chain=forward protocol=tcp tcp-flags=syn connection-limit=100,32 action=drop 创奇高手 QQ:550453843 Q群:500人总群 ROS总基地 群号:7217877(拥挤) 新群 创奇网络社区ROS总基地 群号:143322592(推荐) 新群 创奇网络社区ROS总基地 群号:139532314 (推荐) 创奇网络社区|ROS总基地 专注于ROS软路由技术!专注于互联网IT前沿技术!http://bbs.chanki.net 提倡互助分享精神!打造一个集IT资讯,网吧技术,网络技术,资源共享,硬件数码等的一体化交流社区!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值