非常有用的TC限速例子

#!/bin/bash
DEV="tun0"
UPLINK=300
#下行downlink 3200 k 大概一半左右,以便能够得到更多的并发连接
DOWNLINK=2048
VIP1="192.168.1.159/32"
VIP2="192.168.1.163/32"
##两个vip用户
echo "==================== Packetfilter and Traffic Control 流量控制 By 网络技术部 Ver. 1.0===================="
start_routing() {
        echo -n "队列设置开始start......"
        #tc qdisc del dev $DEV root >null 2&>1
        #删除原来的队列
        #1.增加一个根队列,没有进行分类的数据包都走这个1:24是缺省类:
        tc qdisc add dev $DEV root handle 1: htb default 24
        #1.1增加一个根队下面主干类1: 速率为$UPLINK k
        tc class add dev $DEV parent 1: classid 1:1 htb rate ${UPLINK}kbit ceil ${UPLINK}kbit prio 0
        #1.1.1 在主干类1下建立第一叶子类,这是一个最高优先权的类.需要高优先和高速的包走这条通道,比如SYN,ACK,ICMP等
        tc class add dev $DEV parent 1:1 classid 1:11 htb rate $[$UPLINK]kbit ceil ${UPLINK}kbit prio 1
        #1.1.2 在主类1下建立第二叶子类 ,这是一个次高优先权的类。比如我们重要的crm数据.
        tc class add dev $DEV parent 1:1 classid 1:12 htb rate $[$UPLINK-150]kbit ceil ${UPLINK-50}kbit prio 2
        #1.2 在根类下建立次干类 classid 1:2 。此次干类的下面全部优先权低于主干类,以防重要数据堵塞.
        tc class add dev $DEV parent 1: classid 1:2 htb rate $[$UPLINK-150]kbit prio 3
        #1.2.1 在次干类下建立第一叶子类,可以跑例如http,pop等.
        tc class add dev $DEV parent 1:2 classid 1:21 htb rate 100kbit ceil $[$UPLINK-150]kbit prio 4
        #1.2.2 在次干类下建立第二叶子类。不要太高的速度,以防发大的附件大量占用带宽,例如smtp等
        tc class add dev $DEV parent 1:2 classid 1:22 htb rate 30kbit ceil $[$UPLINK-160]kbit prio 5
        #1.2.3 在次干类下建立第三叶子类。不要太多的带宽,以防大量的数据堵塞网络,例如ftp-data等,
        tc class add dev $DEV parent 1:2 classid 1:23 htb rate 15kbit ceil $[$UPLINK-170]kbit prio 6
        #1.2.4 在次干类下建立第四叶子类。无所谓的数据通道,无需要太多的带宽,以防无所谓的人在阻碍正务.
        tc class add dev $DEV parent 1:2 classid 1:24 htb rate 5kbit ceil $[$UPLINK-250]kbit prio 7
      
        #1.3 在主干类1下建立第三叶子类,给VIP用户(尽量不限速)
        tc class add dev $DEV parent 1: classid 1:3 htb rate $[$UPLINK+1000]kbit prio 3
      
        #在每个类下面再附加上另一个队列规定,随机公平队列(SFQ),不被某个连接不停占用带宽,以保证带宽的平均公平使用:
        #SFQ(Stochastic Fairness Queueing,随机公平队列),SFQ的关键词是“会话”(或称作“流”) ,
        #主要针对一个TCP会话或者UDP流。流量被分成相当多数量的FIFO队列中,每个队列对应一个会话。
        #数据按照简单轮转的方式发送, 每个会话都按顺序得到发送机会。这种方式非常公平,保证了每一
        #个会话都不会没其它会话所淹没。SFQ之所以被称为“随机”,是因为它并不是真的为每一个会话创建
        #一个队列,而是使用一个散列算法,把所有的会话映射到有限的几个队列中去。
        #参数perturb是多少秒后重新配置一次散列算法。默认为10
        tc qdisc add dev $DEV parent 1:11 handle 111: sfq perturb 5
        tc qdisc add dev $DEV parent 1:12 handle 112: sfq perturb 5
        tc qdisc add dev $DEV parent 1:3 handle 13: sfq perturb 5
        tc qdisc add dev $DEV parent 1:21 handle 121: sfq perturb 10
        tc qdisc add dev $DEV parent 1:22 handle 122: sfq perturb 10
        tc qdisc add dev $DEV parent 1:23 handle 133: sfq perturb 10
        tc qdisc add dev $DEV parent 1:24 handle 124: sfq perturb 10
        echo "队列设置成功.done."
        echo -n "设置包过滤 Setting up Filters......"
        #这里设置过滤器,handle 是iptables作mark的值,让被iptables 在mangle链做了mark的不同的值选择不同的通
        #道classid,而prio 是过滤器的优先级别.
        tc filter add dev $DEV parent 1:0 protocol ip prio 1 handle 1 fw classid 1:11
        tc filter add dev $DEV parent 1:0 protocol ip prio 2 handle 2 fw classid 1:12
        tc filter add dev $DEV parent 1:0 protocol ip prio 3 handle 3 fw classid 1:21
        tc filter add dev $DEV parent 1:0 protocol ip prio 3 handle 3 fw classid 1:3
        tc filter add dev $DEV parent 1:0 protocol ip prio 4 handle 4 fw classid 1:22
        tc filter add dev $DEV parent 1:0 protocol ip prio 5 handle 5 fw classid 1:23
        tc filter add dev $DEV parent 1:0 protocol ip prio 6 handle 6 fw classid 1:24
        echo "设置过滤器成功.done."
              
########## downlink ##########################################################################
#6. 下行的限制:
#设置入队的规则,是因为把一些经常会造成下载大文件的端口进行控制,不让它们来得太快,导致堵塞.来得太快
#的就直接drop,就不会浪费和占用机器时间和力量去处理了.
#(1). 把下行速率控制在大概1000-1500k左右,因为这个速度已经足够用了,以便能够得到更多的并发下载连接
tc qdisc add dev $DEV handle ffff: ingress
tc filter add dev $DEV parent ffff: protocol ip prio 50 handle 8 fw police rate ${DOWNLINK}kbit burst 10k drop flowid :8

##vip 通道,给特殊ip较高的优先级和较大的下载速度
tc filter add dev $DEV parent ffff: protocol ip prio 3 u32 match ip dst $VIP1 police rate 2000kbit burst 10k drop flowid :1
tc filter add dev $DEV parent ffff: protocol ip prio 3 u32 match ip dst $VIP2 police rate 2000kbit burst 10k drop flowid :1
#(2).如果内部网数据流不是很疯狂的话,就不用做下载的限制了,用#符号屏蔽上面两行即可.
#(3).如果要对任何进来数据的数据进行限速的话,可以用下面这句:
tc filter add dev $DEV parent ffff: protocol ip prio 10 u32 match ip src 0.0.0.0/0 police rate ${DOWNLINK}kbit burst 10k drop flowid :1
}
###############################################################################################
#7. 开始给数据包打标记,往PREROUTING链中添加mangle规则:
start_mangle() {
              
        echo -n "开始给数据包打标记......start mangle mark......"
iptables -F -t mangle
iptables -X -t mangle
iptables -Z -t mangle
#(1)把出去的不同类数据包(为dport)给mark上标记1--6.让它走不同的通道
#(2)把进来的数据包(为sport)给mark上标记8,让它受到下行的限制,以免速度太过快而影响全局.
#(3)每条规则下根着return的意思是可以通过RETURN方法避免遍历所有的规则,加快了处理速度
##设置vip


##设置TOS的处理:
iptables -t mangle -A PREROUTING -m tos --tos Minimize-Delay -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -m tos --tos Minimize-Delay -j RETURN
iptables -t mangle -A PREROUTING -m tos --tos Minimize-Cost -j MARK --set-mark 4
iptables -t mangle -A PREROUTING -m tos --tos Minimize-Cost -j RETURN
iptables -t mangle -A PREROUTING -m tos --tos Maximize-Throughput -j MARK --set-mark 5
iptables -t mangle -A PREROUTING -m tos --tos Maximize-Throughput -j RETURN
##提高tcp初始连接(也就是带有SYN的数据包)的优先权是非常明智的:
iptables -t mangle -A PREROUTING -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p tcp -m tcp --tcp-flags SYN,RST,ACK SYN -j RETURN
######icmp,想ping有良好的反应,放在第一类吧.
iptables -t mangle -A PREROUTING -p icmp -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p icmp -j RETURN
# small packets (probably just ACKs)长度小于64的小包通常是需要快些的,一般是用来确认tcp的连接的,
#让它跑快些的通道吧.也可以把下面两行屏蔽,因为再下面有更多更明细的端口分类.
#iptables -t mangle -A PREROUTING -p tcp -m length --length :64 -j MARK --set-mark 2
#iptables -t mangle -A PREROUTING -p tcp -m length --length :64 -j RETURN
#ftp放第2类,因为一般是小包, ftp-data放在第5类,因为一般是大量数据的传送.
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport ftp -j MARK --set-mark 2
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport ftp -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport ftp-data -j MARK --set-mark 5
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport ftp-data -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport ftp -j MARK --set-mark 8
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport ftp -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport ftp-data -j MARK --set-mark 8
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport ftp-data -j RETURN
##提高ssh数据包的优先权:放在第1类,要知道ssh是交互式的和重要的,不容待慢哦
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 22 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 22 -j RETURN
#
##smtp邮件:放在第4类,因为有时有人发送很大的邮件,为避免它堵塞,让它跑4道吧
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 25 -j MARK --set-mark 4
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 25 -j RETURN
#iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 25 -j MARK --set-mark 8
#iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 25 -j RETURN
## name-domain server:放在第1类,这样连接带有域名的连接才能快速找到对应的地址,提高速度的一法
iptables -t mangle -A PREROUTING -p udp -m udp --dport 53 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p udp -m udp --dport 53 -j RETURN
#
## http:放在第3类,是最常用的,最多人用的,
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 80 -j MARK --set-mark 3
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 80 -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 80 -j MARK --set-mark 8
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 80 -j RETURN
##pop邮件:放在第3类
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 110 -j MARK --set-mark 3
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 110 -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 110 -j MARK --set-mark 8
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 110 -j RETURN
## https:放在第3类
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 443 -j MARK --set-mark 3
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 443 -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 443 -j MARK --set-mark 8
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 443 -j RETURN
## Microsoft-SQL-Server:放在第2类,我这里认为较重要,一定要保证速度的和优先的.
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 1433 -j MARK --set-mark 2
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 1433 -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 1433 -j MARK --set-mark 8
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 1433 -j RETURN
## voip用, 提高,语音通道要保持高速,才不会断续.
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 1720 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 1720 -j RETURN
iptables -t mangle -A PREROUTING -p udp -m udp --dport 1720 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p udp -m udp --dport 1720 -j RETURN
## vpn ,用作voip的,也要走高速路,才不会断续.
iptables -t mangle -A PREROUTING -p udp -m udp --dport 1723 -j MARK --set-mark 1
iptables -t mangle -A PREROUTING -p udp -m udp --dport 1723 -j RETURN
## 放在第1类,因为我觉得它在我心中很重要,优先.
#iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 7070 -j MARK --set-mark 1
#iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 7070 -j RETURN
## WWW caching service:放在第3类
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 8080 -j MARK --set-mark 3
iptables -t mangle -A PREROUTING -p tcp -m tcp --dport 8080 -j RETURN
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 8080 -j MARK --set-mark 8
iptables -t mangle -A PREROUTING -p tcp -m tcp --sport 8080 -j RETURN
##提高本地数据包的优先权:放在第1
iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 22 -j MARK --set-mark 1
iptables -t mangle -A OUTPUT -p tcp -m tcp --dport 22 -j RETURN
iptables -t mangle -A OUTPUT -p icmp -j MARK --set-mark 1
iptables -t mangle -A OUTPUT -p icmp -j RETURN
#本地small packets (probably just ACKs)
iptables -t mangle -A OUTPUT -p tcp -m length --length :64 -j MARK --set-mark 2
iptables -t mangle -A OUTPUT -p tcp -m length --length :64 -j RETURN
#(4). 向PREROUTING中添加完mangle规则后,用这条规则结束PREROUTING表:
##也就是说前面没有打过标记的数据包将交给1:24处理。
##实际上是不必要的,因为1:24是缺省类,但仍然打上标记是为了保持整个设置的协调一致,而且这样
#还能看到规则的包计数。
iptables -t mangle -A PREROUTING -i $DEV -j MARK --set-mark 6
echo "标记完毕! mangle mark done!"
}
#-----------------------------------------------------------------------------------------------------
#8.取消mangle标记用的自定义函数
stop_mangle() {
      
        echo -n "停止数据标记 stop mangle table......"
        ( iptables -t mangle -F && echo "ok." ) || echo "error."
}
#9.取消队列用的      
stop_routing() {
        echo -n "(删除所有队列......)"
        ( tc qdisc del dev $DEV root && tc qdisc del dev $DEV ingress && echo "ok.删除成功!" ) || echo "error."
}
#10.显示状态
status() {
        echo "1.show qdisc $DEV (显示上行队列):----------------------------------------------"
        tc -s qdisc show dev $DEV
        echo "2.show class $DEV (显示上行分类):----------------------------------------------"
        tc class show dev $DEV
        echo "3. tc -s class show dev $DEV (显示上行队列和分类流量详细信息):------------------"
        tc -s class show dev $DEV
        echo "3. tc -s filter ls dev $DEV (显示下行队列和分类流量详细信息):------------------"
        tc filter ls dev $DEV parent ffff:
        echo "说明:设置总队列上行带宽 $UPLINK k."
        echo "1. classid 1:11 ssh、dns、和带有SYN标记的数据包。这是最高优先权的类包并最先类 "
        echo "2. classid 1:12 重要数据,这是较高优先权的类。"
        echo "3. classid 1:21 web,pop 服务 "
        echo "4. classid 1:22 smtp服务 "
        echo "5. classid 1:23 ftp-data服务 "
        echo "6. classid 1:24 其他服务 "
        echo "7. classid 1:3 VIP通道 "
}
#11.显示帮助
usage() {
        echo "使用方法(usage): `basename $0` [start | stop | restart | status | mangle ]"
        echo "参数作用:"
        echo "start   开始流量控制"
        echo "stop    停止流量控制"
        echo "restart 重启流量控制"
        echo "status 显示队列流量"
        echo "mangle 显示mark标记"
}
#----------------------------------------------------------------------------------------------
#12. 下面是脚本运行参数的选择的控制
#
#kernel=` kernelversion`
kernel=`uname -r|cut -b 1-3`
case "$kernel" in
   2.2)
      echo " (!) Error: won't do anything with 2.2.x 不支持内核2.2.x"
      exit 1
      ;;
    
   2.4|2.6)
      case "$1" in
         start)
            ( start_routing && start_mangle && echo "开始流量控制! TC started!" ) || echo "error."
                      
            exit 0
            ;;
         stop)
            ( stop_routing && stop_mangle && echo "停止流量控制! TC stopped!" ) || echo "error."
          
            exit 0
            ;;
         restart)
            stop_routing
            stop_mangle
            start_routing
            start_mangle
          
            echo "流量控制规则重新装载!"
            ;;
         status)
            status
            ;;
          
         mangle)
            echo "iptables -t mangle -L (显示目前mangle表表标记详细):"
            iptables -t mangle -nL
            ;;
          
         *) usage
            exit 1
            ;;
      esac
      ;;
   *)
      echo " (!) Error: Unknown kernel version. check it !"
      exit 1
      ;;
esac
echo "script done!"
exit 1
您正在看的文章来自丫丫网络 http://bbs.yayaw.com,原文地址:http://bbs.yayaw.com/read.php?tid=1023

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值