我是靠谱客的博主 称心黑夜,最近开发中收集的这篇文章主要介绍Linux流量控制,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

 

Linux高级路由---策略路由/捆绑/网桥

 

Linux高级路由---策略路由/捆绑/网桥

  1.策略路由
    基于策略的路由比传统路由在功能上更强大,使用更灵活,它使网络管理员不仅能够根据目的地址而且能够根据报文大小、应用或IP源地址来选择转发路径...         
    #/etc/iproute2/rt_tables 此文件存有linux 系统路由表默认表有255 254 253三张表
      255  local 本地路由表 存有本地接口地址,广播地址,已及NAT地址.
           local表由系统自动维护..管理员不能操作此表...
      254  main 主路由表 传统路由表,ip route若没指定表亦操作表254.一般存所有的路由..
           注:平时用ip ro sh查看的亦是此表设置的路由.
      253  default  默认路由表一般存放默认路由...
           注:rt_tables文件中表以数字来区分表0保留最多支持255张表
    路由表的查看可有以下二种方法:
      #ip route list table table_number

      #ip route list table table_name

    路由表添加完毕,即可在策略路由表内添加路由例:

      #ip route add 192.168.1.0/24 dev eth0 via 192.168.1.66 realm 4

        注:发往子网192.168.1.0/24的数据包通过分类4转发配合tc使用,后文有介绍讲解...

      #ip route add default via 192.168.1.1 table int1

      #ip route add 192.168.1.0/24 via 192.168.1.1 table int2

      #ip route add 172.16.0.2/16 via 172.16.0.1 table int3 

        注:各路由表中应当指明默认路由,尽量不回查路由表.路由添加完毕,即可在路由规则中应用..
    #ip rule sh 显示路由规则
      0:      from all lookup local
      32766:  from all lookup main
      32767:  from all lookup default
    进行路由时,正是根据路由规则来进行匹配,按优先级(pref后数值)从高到低匹配,直到找到合适的规则.所以在应用中配置默认路由是必要的..     
    策略路由一般手工添加路由表,路由表的添加只需编辑rt_tables文件,规定表序号,表名即可..
    ip rule规则添加示例:
      #ip rule add from 192.168.1.112/32 [tos 0x10] table test2 pref 999 prohibit
      #ip rule add to 192.168.1.2 pref 1000 table test1
      #ip rule add from 192.168.1.0/24 pref 1001 table test1
      #ip rule add [from 0/0] table test1 pref 1003
      #ip rule add fwmark 1 pref 1002 table test2  此句型配合iptables -t mangle应用.如先对数据

  包作标记:

      #iptables -t mangle -A PREROUTING -p tcp -m multiport

                             --dports 80,8080,20,21 -s 192.168.1.0/24 -j MARK --set-mark 1    
        注:创建完路由规则若需立即生效须执行#ip route flush cache;刷新路由缓冲
    可参数解析如下:
        From -- 源地址
        To -- 目的地址(这里是选择规则时使用,查找路由表时也使用)
      Tos -- IP包头的TOS(type of sevice)域
      Dev -- 物理接口
      Fwmark -- 防火墙参数
    采取的动作除了指定路由表外,还可以指定下面的动作:
        Table 指明所使用的表
       Nat 透明网关

      Prohibit 丢弃该包,并发送 COMM.ADM.PROHIITED的ICMP信息
      Reject 单纯丢弃该包
      Unreachable丢弃该包, 并发送 NET UNREACHABLE的ICMP信息
    具体格式如下:
        Usage: ip rule [ list | add | del ] SELECTOR ACTION
        SELECTOR := [ from PREFIX ] [ to PREFIX ] [ tos TOS ][ dev STRING ] [ pref NUMBER ]
        ACTION := [ table TABLE_ID ] [ nat ADDRESS ][ prohibit | reject | unreachable ]
                  [ flowid CLASSID ]
        TABLE_ID := [ local | main | default | new | NUMBER ]

 

  2.网卡捆绑(网关linux+多网卡)

    #modprobe bonding mod=1 miimon=200 primary=eth1 创建bond0,模式为1,主网卡eth1..

    #ip addr add dev bond$ 10.0.0.1/24 设置bond0的IP

    #ifenslave bond0 eth1 eth2 添加绑定的dev

      注:mode=0 轮转均衡(默认模式),此模式MAC频繁切换导致交换机负载大..

         mode=1 主备模式 用primary指定网卡

         mode=4 常用 802.3ad模式,动态链路采集模式.此模式要求SWITCH捆绑..

         miimon=ms 每隔多少毫秒查询链路是否有效.

      其它参数如:

         arp_interval=ms

         arp_ip_target=*.*.*.*

 

    另一种网卡捆绑固化方式:

      #vi /etc/modules.conf 加入以下行

      alias bond0 bonding

        系统在启动时加载bonding模块,对外虚拟网络接口设备为 bond0..

      #cd /etc/sysconfig/network-scripts

      #vi ifcfg-bond0

        DEVICE=bond0
        IPADDR=11.0.0.1
        NETMASK=255.0.0.0
        NETWORK=192.168.1.0
        BROADCAST=192.168.1.255
        ONBOOT=yes
        BOOTPROTO=none
        USERCTL=no

      #vi ifcfg-eth0  
        DEVICE=eth0
        USERCTL=no
        ONBOOT=yes
        MASTER=bond0
        SLAVE=yes
        BOOTPROTO=none

      #vi ifcfg-eth1
        DEVICE=eth0
        USERCTL=no
        ONBOOT=yes
        MASTER=bond0
        SLAVE=yes
        BOOTPROTO=none

     #/etc/init.d/network restart 重启网络服务验证网卡的配置信息备份网卡被加上了NOARP标记

     #cat /proc/net/bond0/info 查看bond信息

 

  3.网桥(Linux+多网卡)

    配置工具 brctl http://bridge.sourceforge.net/  源码包名:bridge-utils-*形式

    安装第一步:autoconf 后类同于源码包安装..

    例.linu+二网卡eth0 eth1 配置成网桥

      配置前去除加入网桥的eth0 eth1的IP

      #ifconfig eth0/eth1 down

      #ifconfig eth0/eth1 0.0.0.0 up

      #brctl addbr br0

      #brctl addif br0 eth0 eth1

      #ip li set dev br0 up

      #brctl showmacs br0 显示网桥MAC
    撤网桥:

      #ip li set dev br0 down

      #brctl delif br0 eth0 eth1

      #brctl delbr br0

    网桥接口处亦可进行流量控制,无Ip的linux网桥可有效防御外界的功击,对linux网桥机的总控安全性高... 

 

    贴上一篇网桥应用实例,此实例是网桥的一种扩张应用...

      脚本名:start_bridge.sh

      #!/bin/sh

      brctl addbr net1
      brctl addif net1 eth0
      ifconfig eth0 down
      ifconfig eth0 0.0.0.0 up
      ifconfig net1 192.168.5.1 up
      #ip ro del 192.168.1.0/24 dev eth1  proto kernel  scope link  src 192.168.1.28

      ip ro del 192.168.1.0/24
      #route add -net 0.0.0.0 netmask 0.0.0.0 gw 192.168.5.2

      ip route add default via 192.168.5.2
      echo "1" > /proc/sys/net/ipv4/ip_forward

 

  Linux高级路由需结合iptables才能充分体现其功能的强大,实际工作中的应用多半基于此,当然要熟练掌握Linux高级路由+iptables还需进一步的加强学习和实践的应用...希望感兴趣的朋友能和我一起学习,在实际工作应用中得到发展...Linux高级路由---策略路由/捆绑/网桥

  另推荐一篇透明式防火墙的网络文档: http://liuhongdan.bokee.com/6302917.html

 

 

 

Linux流量控制I---无类算法SFQ/TBF

 

 

Linux流量控制---tc

  Linux流量控制控发不控收,所以只能对产生瓶颈网卡处的发包速率进行控制..而网络瓶颈分析亦为Linux网络流控的第一步...

  Linux流量控制分二种:  队列控制(QOS) 瓶颈处的发送队列的规则控制  SFQ PRIO

                        流量控制(带宽限制) 队列整形  TBF HTB

     二种流控算法上分:  无类算法  用于树叶级无分支的队列  SFQ

                        分类算法  用于多分支的队列  PRIO TBF HTB

  下面以二种算法的不同流控分别介绍:

1.队列控制的无类算法 SFQ

  SFQ(Stochastic Fairness Queueing 随机公平队列)是公平队列算法家族中的一个简单实现.它的精确性不如其它的方法,但实现了高度的公平,需要的计算量亦很少.

  SFQ算法主要针对一个TCP会话或者UDP流.流量被分成相当多数量的FIFO队列中,每个队列对应一个会话.数据按照简单轮转的方式发送, 每个会话都按顺序得到发送机会. 这种方式非常公平,保证了每一个会话都不会没其它会话所淹没.

  SFQ之所以被称为"随机",是因为它并不是真的为每一个会话创建一个队列,而是使用一个散列算法,把所有的会话映射到有限的几个队列中去. 因为使用了散列,所以可能多个会话分配在同一个队列里,从而需要共享发包的机会,也就是共享带宽.为了不让这种效应太明显,SFQ会频繁地改变散列算法,以便把这种效应控制在几秒钟之内(时间由参数设定). 

  注:SFQ只会发生在数据发生拥堵,产生等待队列的网卡上..出口网卡若无等待队列,SFQ亦不起作用...

  以下示例即在网卡上建立SFQ:

    #tc qdisc add dev eth0 root handle 1: sfq

       SFQ参数有perturb(重新调整算法间隔) quantum  基本上不需要手工调整:

       handle 1: 规定算法编号..可以不用设置由系统指定..

    #tc qdisc sh dev eth0 显示算法

    #tc qd del dev eth0 root 删除  注:默认eht0支持TOS

  SFQ队列一般用在树叶级,配合其它流量整形算法一并使用...

2.流量控制的无类算法 TBF

  令牌桶过滤器(TBF)是一个简单的队列规定:只允许以不超过事先设定的速率到来的数据包通过,但可能允许短暂突发流量朝过设定值.
  TBF很精确,对于网络和处理器的影响都很小,实现是针对数据的字节数进行的,而不是针对数据包进行,常用于网关限速.

  TBF的实现在于一个缓冲器(桶),不断地被一些叫做"令牌"的虚拟数据以特定速率填充着. (token rate).桶最重要的参数就是它的大小,也就是它能够存储令牌的数量. 每个到来的令牌从数据队列中收集一个数据包,然后从桶中被删除.这个算法关联到两个流上——令牌流和数据流,于是我们得到3种情景:
  A.数据流以等于令牌流的速率到达TBF.这种情况下,每个到来的数据包都能对应一个令牌,然后无延迟地通过队列.
  B.数据流以小于令牌流的速度到达TBF.通过队列的数据包只消耗了一部分令牌,剩下的令牌会在桶里积累下来,直到桶被装满.剩下的令牌可以在需要以高于令牌流速率发送数据流的时候消耗掉,这种情况下会发生突发传输.
  C.数据流以大于令牌流的速率到达TBF.这意味着桶里的令牌很快就会被耗尽.导致TBF中断一段时间,称为"越限".如果数据包持续到来,将发生丢包. 此种情况最重要,因为它可以用来对数据通过过滤器的速率进行整形. 令牌的积累可以导致越限的数据进行短时间的突发传输而不必丢包,但是持续越限的话会导致传输延迟直至丢包.

  以下示例是在网卡建立TBF:

    #tc qd add dev eth1 root handle 1: tbf rate 256kbit burst 10000 latency 50ms

                                           速率256kbit  突发传输10k  最大延迟50ms

    #tc -s qd sh dev eth1 统计

    #tc qd del dev eth1 root 删除

  rate 限制的传输速率 用位来计算 

  latency 确定了一个包在TBF中等待传输的最长等待时间.
  burst 桶的大小,以字节计.指定了最多可以有多少个令牌能够即刻被使用.

    注:管理的带宽越大,需要的缓冲器就越大.在Intel体系上,10兆bit/s的速率需要至少10k字节的缓冲区

  才能达到期望的速率. 缓冲区太小导致潜在的丢包.

 

  无类算法除这二种队列以处,另有pfifo_fast(网卡出口默认根队列规定)..经常使用的也就是SFQ/TBF..这二种用法如下:

    单纯地降低出口速率,使用令牌桶过滤器.调整桶的配置后可用于控制很高的带宽. 
    链路已经塞满,保证不会有某一个会话独占出口带宽,使用随机公平队列.

  当然最要的还是工作中得来的经验,就其应用方面只要能满足需求即可..要做到灵活应用还得大量的实践..

  本文档理论说明部分根据HOWTO中文版整理而得,加以工作实践,仅作学习笔记用..呵呵..

 

Linux流量控制II---分类算法PRIO/CBQ/HTB

 

 

Linux流量控制II---分类算法PRIO/CBQ/HTB

  分类算法主要作用是可以对多种数据流区别对待.一旦数据包进入一个分类的队列规定,它就得被送到某一个类中分类,对数据包进行分类的工具是过滤器.过滤器会返回一个决定,队列规定就根据这个决定把数据包送入相应的类进行排队.每个子类都可以再次使用它们的过滤器进行进一步的分类.直到不需要进一步分类时,数据包才进入该类包含的队列规定排队. 除了能够包含其它队列规定之外,绝大多数分类的队列规定能够流量整形

  注:过滤器对数据包进行分类的工具,是从队列规定内部调用的,而不是从别处.(用在分叉的分支上)

列规定家族:根,句柄,兄弟和父辈
  每块网卡都有一个出口"根队列规定",缺省情况下是前面提到的pfifo_fast队列规定.每个队列规定都指定一个句柄,以便以后的配置语句能够引用这个队列规定.除了出口队列规定之外,每块网卡还有一个入口,以便policies进入的数据流.
  队列规定的句柄有两个部分:一个主号码和一个次号码.习惯上把根队列规定称为"1:",等价于"1:0".队列规定的次号码永远是0.类的主号码必须与它们父辈的主号码一致.

数据包如何出队并交给硬件
  当内核决定把一个数据包发给网卡的时候,根队列规定1:会得到一个出队请求,然后把它传给1:1,然后依次传给10:,12:和13:(子类自定义),然后试图从它们中进行dequeue()操作.也就是说,内核需要遍历整颗树, 换句话说,类及其兄弟仅仅与其"父队列规定"进行交谈,而不会与网卡进行交谈.只有根队列规定才能由内核进行出队操作!更进一步,任何类的出队操作都不会比它们的父类更快.我们可以把SFQ作为一个子类,放到一个可以进行流量整形的父类中,从而能够同时得到SFQ的调度功能和其父类的流量整形功能.

 

1.队列控制的分类算法 PRIO

  PRIO分类优先算法(从左至右优先发包),队列规定并不进行整形,它仅仅根据你配置的过滤器把流量进一步细分.你可以认为PRIO队列规定是pfifo_fast的一种衍生物,区别在每个频道都是一个单独的类,而非简单的FIFO.
  当数据包进入PRIO队列规定后,将根据你给定的过滤器设置选择一个类.缺省情况下有三个类,这些类仅包含纯FIFO队列规定而没有更多的内部结构.你可以把它们替换成你需要的任何队列规定. 每当有一个数据包需要出队时,首先处理:1类.只有当标号更小的类中没有需要处理的包时,才会标号大的类.

  PRIO配置范例: 
  root 1: prio
  /   |   
  1:1 1:2 1:3
  |   |   |
  10: 20: 30:
  sfq tbf sfq
  band 0 1 2
  大批量数据使用30:,交互数据使用20:或10:.
  命令如下:
  #tc qdisc add dev eth0 root handle 1: prio
  #此命令立即创建了类: 1:1, 1:2, 1:3 (缺省三个子类)
  #tc qdisc add dev eth0 parent 1:1 handle 10: sfq
  #tc qdisc add dev eth0 parent 1:2 handle 20: tbf rate 20kbit buffer 1600 limit 3000

    注:此为TBF限速的另一写法,前文有讲解.
  #tc qdisc add dev eth0 parent 1:3 handle 30: sfq

  主要参数有:(后续有实例)

    bands 创建频道的数目.每个频道实际上就是一个类 跟priomap参数配合使用

      注:频道是类,缺省情况下命名为主标号:1到主标号:3.如果你的PRIO队列规定是12:,把数据包过滤到

        12:1将得到最高优先级. 0频道的次标号是1!1频道的次标号是2,以此类推. 
    priomap 给tc提供过滤器,如不提供PRIO队列规定将参考TC_PRIO的优先级来决定如何给数据包入队.

 

2.流量整形的分类算法 CBQ

  CBQ的工作机制是确认链路的闲置时间足够长,以达到降低链路实际带宽的目的.为此,它要计算两个数据包的平均发送间隔.操作期间,有效闲置时间的测量使用EWMA(exponential weighted moving average,指数加权移动均值)算法,也就是说最近处理的数据包的权值比以前的数据包按指数增加.UNIX的平均负载也是这样算出来的. 计算出来的平均时间值减去EWMA测量值,得出的结果叫做"avgidle".最佳的链路负载情况下,这个值应当是0:数据包严格按照计算出来的时间间隔到来. 在一个过载的链路上,avgidle值应当是负的.如果这个负值太严重,CBQ就会暂时禁止发包,称为"overlimit"(越限). 相反地,一个闲置的链路应该有很大avgidle值,这样闲置几个小时后,会造成链路允许非常大的带宽通过.为了避免这种局面,我们用maxidle来限avgidle
的值不能太大.
  理论上讲,如果发生越限,CBQ就会禁止发包一段时间(长度就是事先计算出来的传输数据包之间的时间间隔),然后通过一个数据包后再次禁止发包.

  配置范例:WEB服务器的流量控制为5Mbps,SMTP流量控制在3Mbps上.而且二者一共不得超过6Mbps,互相之间允许借用带宽 

  #tc qdisc add dev eth0 root handle 1:0 cbq bandwidth 100Mbit avpkt 1000 cell 8
  #tc class add dev eth0 parent 1:0 classid 1:1 cbq bandwidth 100Mbit rate 6Mbit weight  

    0.6Mbit prio 8 allot 1514 cell 8 maxburst 20 avpkt 1000 bounded

    这部分按惯例设置了根为1:0,并且绑定了类1:1.也就是说整个带宽不能超过6Mbps.
  #tc class add dev eth0 parent 1:1 classid 1:3 cbq bandwidth 100Mbit rate 5Mbit weight

    0.5Mbit prio 5 allot 1514 cell 8 maxburst 20 avpkt 1000
  #tc class add dev eth0 parent 1:1 classid 1:4 cbq bandwidth 100Mbit rate 3Mbit weight

    0.3Mbit prio 5 allot 1514 cell 8 maxburst 20 avpkt 1000
    建立了2个类.注意我们如何根据带宽来调整weight参数的.两个类都没有配置成"bounded",但它们都连

  接到了类1:1上,而1:1设置了"bounded".所以两个类的总带宽不会超过6Mbps.别忘了,同一个CBQ下面的子

  类的主号码都必须与CBQ自己的号码相一致!
  #tc qdisc add dev eth0 parent 1:3 handle 30: sfq
  #tc qdisc add dev eth0 parent 1:4 handle 40: sfq
    缺省情况下,两个类都有一个FIFO队列规定.但是我们把它换成SFQ队列,以保证每个数据流都公平对待.
  #tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip sport 80 0xffff flowid

    1:3
  #tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip sport 25 0xffff flowid

    1:4

  CBQ流量整形算法相对比较复杂,工作中还常用...示例中的各参数请参阅:HOWTO中文文档..Linux流量控制II---分类算法PRIO/CBQ/HTB

        

3.流量整形的分类算法 HTB

  HTB(Hierarchical Token Bucket)分层的令牌桶一个分类的令牌桶过滤器,工作原理和相关配置同于TBF..拥有TBF的各项性能,可参阅TBF的工作细节...

  配置范例:环境与要求同上述CBQ的例子
  #tc qdisc add dev eth0 root handle 1: htb default 30
  #tc class add dev eth0 parent 1: classid 1:1 htb rate 6mbit burst 15k
  #tc class add dev eth0 parent 1:1 classid 1:10 htb rate 5mbit burst 15k
  #tc class add dev eth0 parent 1:1 classid 1:20 htb rate 3mbit ceil 6mbit burst 15k
  #tc class add dev eth0 parent 1:1 classid 1:30 htb rate 1kbit ceil 6mbit burst 15k
  #tc qdisc add dev eth0 parent 1:10 handle 10: sfq perturb 10
  #tc qdisc add dev eth0 parent 1:20 handle 20: sfq perturb 10
  #tc qdisc add dev eth0 parent 1:30 handle 30: sfq perturb 10
  #添加过滤器,直接把流量导向相应的类:
  #U32="tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32"
  #$U32 match ip dport 80 0xffff flowid 1:10
  #$U32 match ip sport 25 0xffff flowid 1:20

 

  以下实例是我工作中HTB的应用..

  1.网关限速

    #!/bin/sh

    PWD=/home/huaying/net

    TC=/sbin/tc 

    $TC class ls dev eth0

    $TC qdisc del dev eth0 root

    $TC qdisc add dev eth0 root handle 1: htb r2q 1

    U32="$TC filter add dev eth0 parent 1: protocol ip prio 16 u32" 

    while read line
    do
            ip=`echo $line | awk '{print $1}'`
            limit=`echo $line | awk '{print $2}'`
            $TC class add dev eth0 parent 1: classid 1:$ip htb rate "$limit"kbit burst 1k
            $U32  match ip dst 192.168.1.$ip/32 flowid 1:$ip
    done < $PWD/ip_limit

      注:ip_limit分行记录,第一列为ip,第二列为限制的带宽,二列以tables分开..   

  2.服务器限速

    #!/bin/sh

    /sbin/tc qdisc del dev eth0 root
    /sbin/tc qdisc add dev eth0 root handle 1:0 htb r2q 1
    /sbin/tc class add dev eth0 parent 1:0 classid 1:1 htb rate 75mbit burst 10k
    /sbin/tc filter add dev eth0 parent 1: protocol ip prio 16

                                                    u32  match ip dst 0.0.0.0/0 flowid 1:1
    /sbin/tc class ls dev eth0

      最大限制服务器eth0流量在75Mbit/s

 

本文档理论说明部分根据HOWTO中文版整理而得,加以工作实践,仅作学习笔记用...呵呵.

 

Linux流量控制III---过滤规则/U32

 

 

Linux流量控制III---过滤规则/U32

  过滤器是对数据包进行分类工具,过滤器用与把数据包分类并放入相应的子队列,这些过滤器在分类的队列规定内部被调用.为了决定用哪个类处理数据包,必须调用所谓的"分类器链" 进行选择. 这个链中包含了这个分类队列规定所需的所有过滤器.常用到的为U32过滤器..,  下图为分类的一示例图:

      根1:
        |
       1:1     <-----加过滤器位置
      / |
    10: 11: 12:    <-----加过滤器位置
    /       /  
  10:1 10:2 12:1 12:2
  当一个数据包入队的时候,每一个分支处都会咨询过滤器链如何进行下一步.典型的配置是在1:1处有一个过滤器把数据包交给12:,然后12:处的过滤器在把包交给12:2.你可以把后一个过滤器同时放在1:1处,而得到效率的提高.
  另外,你不能用过滤器把数据包向"上"送.而且,使用HTB的时候应该把所有的规则放到根上..

    注:数据包只能向"下"进行入队操作!只有处队的时候才会上到网卡所在的位置来.他们不会落到树的最

  底层后送到网卡...

 

过滤器过滤示例:

  #tc filter add dev eth0 protocol ip parent 10: prio 1 u32 match ip dport 22 0xffff flowid 10:1 在10:节点添加一个过滤规则,优先权1:凡是去往22口(精确匹配)的IP数据包,发送到频道10:1..
  #tc filter add dev eth0 protocol ip parent 10: prio 1 u32 match ip sport 80 0xffff flowid 10:1 在10:节点添加一个过滤规则,优先权1:凡是来自80口(精确匹配)的IP数据包,发送到频道10:1..
  #tc filter add dev eth0 protocol ip parent 10: prio 2 flowid 10:2 在eth0上的10:节点添加一个过滤规则,它的优先权是2:凡是上二句未匹配的IP数据包,发送到频道10:2..
  #tc filter add dev eth0 parent 10:0 protocol ip prio 1 u32 match ip dst 4.3.2.1/32 flowid 10:1 去往4.3.2.1的包发送到频道10:1 其它参数同上例
  #tc filter add dev eth0 parent 10:0 protocol ip prio 1 u32 match ip src 1.2.3.4/32 flowid 10:1 来自1.2.3.4的包发到频道10:1
  #tc filter add dev eth0 protocol ip parent 10: prio 2 flowid 10:2 凡上二句未匹配的包送往10:2
  #tc filter add dev eth0 parent 10:0 protocol ip prio 1 u32 match ip src 4.3.2.1/32 match ip sport 80 0xffff flowid 10:1 可连续使用match,匹配来自1.2.3.4的80口的数据包

 

常用到的过滤命令一览
  #tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 -------
  根据源/目的地址
    源地址段 'match ip src 1.2.3.0/24'
    目的地址段 'match ip dst 4.3.2.0/24'
    单个IP地址 'match ip 1.2.3.4/32'
  根据源/目的端口,所有IP协议
    源 'match ip sport 80 0xffff' 0xffff表所有数据包
    目的 'match ip dport 80 0xffff'
    根据IP协议 (tcp, udp, icmp, gre, ipsec) 
      icmp是1:'match ip protocol 1 0xff' 1是根据/etc/protocols协议号来定
    根据fwmark

      #iptables -A PREROUTING -t mangle -i eth0 -j MARK --set-mark 6
      #tc filter add dev eth1 protocol ip parent 1:0 prio 1 handle 6 fw flowid 1:1

        注:handle根据过滤器的不同,含义也不同      
    按TOS字段
      #tc filter add dev ppp0 parent 1:0 protocol ip prio 10 u32 match ip tos 0x10 0xff

    flowid 1:4  选择交互和最小延迟的数据流 匹配大量传输,使用"0x08 0xff".

      #tc filter add dev eth0 protocol ip parent 1:0 pref 10 u32 match u32 00100000 00ff0000

    at 0 flowid 1:10 匹配那些TOS字段带有'最小延迟'属性的数据包

  U32过滤器相对比较繁琐,一般不常用,感兴趣的朋友可以参考HOWTO中文档...推荐iptables打标记的方式来实现tc过滤器的功能...

 

Linux流量控制IV---实例解析

 

Linux流量控制IV---实例解析

  以下二例是工作中用到的,贴出来算对流量控制的一种理解吧..呵呵.

1.PRIO 分类优先算法(从左至右优先发包)

           eth0 1:

               / |

              1:1 1:2 1:3

             / |

          11: 12: 13:    

  #tc ad add dev eth0 root handle 1: prio hands 3 priomap 1---1 16个1(tos比特) 表示所有数据包

    注:此命令自动在1:下创建三子类 1:1 1:2 1:3 此例中只用到 1:1

  #tc qd add dev eth0 parent 1:1 handle 11:sfq

  #tc qdisc add dev eth0 parent 1:1 handle 12: tbf rate 20kbit buffer 1600 limit 3000

  #tc qd add dev eth0 parent 1:1 handle 13:sfq

  #tc filter add dev eth0 parent 1:1 prio 1003 protocol ip

                       u32 match ip src 192.168.1.0/24 flowid 1:13

  #tc filter add dev eth0 parent 1:1 prio 1001 protocol ip

                       u32 match ip src 10.0.0.0/8 flowid 1:12

  #tc filter add dev eth0 parent 1:1 protocol ip prio 1001

                        u32 match ip tos 0x10 0xff flowid 1:11  交互和最小延迟的数据流

 

2.HTB分层令牌桶

      eth1    1:

              |

             1:1            1:1 2Mbit 1000个包   1:12默认

            

         11: 12: 13:        1:11 512kbit 100   1:12 1Mbit 100   1:13 2Mbit 100

  #tc qd del dev eth1 root

  #tc qdisc add dev eth1 root handle 1: htb default 12

  #tc class add dev eth1 parent 1: classid 1:1 htb rate 2Mbit burst 1500000 在1:下定义子类1:1

  #tc class add dev eth1 parent 1:1 classid 1:11 htb rate 512kbit burst 150000 ceil 1Mbit

  #tc qd add dev eth1 parent 1:11 handle 111: sfq

  #tc class add dev eth1 parent 1:1 classid 1:12 htb rate 1Mbit burst 150000 ceil 1Mbit

  #tc qd add dev eth1 parent 1:12 handle 122: sfq 注:亦可不在1:12 class下定义122: qd

  #tc class add dev eth1 parent 1:1 classid 1:13 htb rate 2Mbit burst 150000 ceil 2Mbit

  #tc qd add dev eth1 parent 1:13 handle 133: sfq

  #tc filter add dev eth1 parent 1: prio 10001 protocol ip

      u32 match ip src 192.168.1.0/24 flowid 1:12  其它二类亦如此..   

 

2.ADSL上网流量限控脚本

  ADSL带宽是下行3200Kbit,上行只有320Kbit

    eth 1:

      /

    1:1 1.2

    / / | |

    1:11 1: 12 1:21 1:22 1:23 1:24

  优先顺序是1:11 1:12 1:21 1:22 1:23 1:24  脚本大致内容下:                                  

  tc qdisc add dev eth0 root handle 1: htb default 24
  tc class add dev eth0 parent 1: classid 1:1 htb rate 300kbit ceil 300kbit prio 0

  tc class add dev eth0 parent 1: classid 1:2 htb rate 150kbit prio 3 
  tc class add dev eth0 parent 1:1 classid 1:11 htb rate 300kbit ceil 300kbit prio 1
  tc class add dev eth0 parent 1:1 classid 1:12 htb rate 150kbit ceil 250kbit prio 2  
  tc class add dev eth0 parent 1:2 classid 1:21 htb rate 100kbit ceil 150kbit prio 4
  tc class add dev eth0 parent 1:2 classid 1:22 htb rate 30kbit ceil 140kbit prio 5
  tc class add dev eth0 parent 1:2 classid 1:23 htb rate 15kbit ceil 130kbit prio 6
  tc class add dev eth0 parent 1:2 classid 1:24 htb rate 5kbit ceil 50kbit prio 7
  tc qdisc add dev eth0 parent 1:11 handle 111: sfq perturb 5
  tc qdisc add dev eth0 parent 1:12 handle 112: sfq perturb 5
  tc qdisc add dev eth0 parent 1:21 handle 121: sfq perturb 10
  tc qdisc add dev eth0 parent 1:22 handle 122: sfq perturb 10
  tc qdisc add dev eth0 parent 1:23 handle 133: sfq perturb 10
  tc qdisc add dev eth0 parent 1:24 handle 124: sfq perturb 10
  tc filter add dev eth0 parent 1:0 protocol ip prio 1 handle 1 fw classid 1:11
  tc filter add dev eth0 parent 1:0 protocol ip prio 2 handle 2 fw classid 1:12
  tc filter add dev eth0 parent 1:0 protocol ip prio 3 handle 3 fw classid 1:21
  tc filter add dev eth0 parent 1:0 protocol ip prio 4 handle 4 fw classid 1:22
  tc filter add dev eth0 parent 1:0 protocol ip prio 5 handle 5 fw classid 1:23
  tc filter add dev eth0 parent 1:0 protocol ip prio 6 handle 6 fw classid 1:24

  1:11 最高优先级的数据包通道优先通过,主要为一些ACK SYN确认包..必要时全部占用..全速

  1:12 是很重要的数据道,给多点,最少给一半,但需要时可以再多一点.
    rate 规划 1:2 = 1:21 + 1:22 + 1:23 + 1:24 一般总数在50%-80%左右
  1:21 http,pop最常用,人数较多,易导致堵塞,不能给得太多,但不益太少.
  1:22 smtp通道,优先低于1:21 以防发大的附件大量占用带宽
  1:23 ftp-data数据通道可能大量上传文件,rate不能给得太多,ceil设置大些(其它通道剩余带宽应用)
  1:24 无所谓通道,就是一般不是平时工作上需要的通道了,给小点,防止这些人在妨碍有正常工作需要的人

  其次的工作即在iptables端对相应数据包打上标记...

 

3.Linux+NAT+TC

  脚本是Linux NAT网关实例,根据此脚本思路,可进一步细致的进行针对于数据包的限制..

  echo 1 > /proc/sys/net/ipv4/ip_forward
  iptables -F
  iptables -t nat -F
  iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j SNAT --to-source 124.42.97.36
  iptables -t nat -A POSTROUTING -s 192.168.1.0/24 -o eth0 -j SNAT --to-source 124.42.97.36 

  iptables -I PREROUTING -t mangle -p tcp -s 192.168.0.0/24 -j MARK --set-mark 1
  iptables -I PREROUTING -t mangle -p tcp -s 192.168.1.0/24 -j MARK --set-mark 2

    注:可分数据包类型标记
  tc qdisc del dev eth0 root
    #加一个根队列,速率用网卡的速率10Mbit,也可用上传的速率
  tc qdisc add dev eth0 root handle 100: cbq bandwidth 10Mbit avpkt 1000
    #加一个根类
  tc class add dev eth0 parent 100:0 classid 100:1 cbq bandwidth 10Mbit

                   rate 10Mbit allot 1514 weight 1Mbit prio 8 maxburst 8 avpkt 1000 bounded
    #加一个子类用于内网1速率限制为300Kbit
  tc class add dev eth0 parent 100:1 classid 100:2 cbq bandwidth 10Mbit

                   rate 300Kbit allot 1513 weight 30Kbit prio 5 maxburst 8 avpkt 1000 bounded
    #加一个子类用于内网2速率限制为320Kbit
  tc class add dev eth0 parent 100:1 classid 100:3 cbq bandwidth 10Mbit

                   rate 320Kbit allot 1513 weight 32Kbit prio 6 maxburst 8 avpkt 1000 bounded
    #设置队列规则
  tc qdisc add dev eth0 parent 100:2 sfq quantum 1514b perturb 15
  tc qdisc add dev eth0 parent 100:3 sfq quantum 1514b perturb 15
    #将队列和fw过滤器映射起来 其中hand 1的1是开始用iptables做的标记hand 2的2也是开始用

  iptables 做的标记
  tc filter add dev eth0 parent 100:0 protocol ip prio 1 handle 1 fw classid 100:2
  tc filter add dev eth0 parent 100:0 protocol ip prio 2 handle 2 fw classid 100:3 

  流量监测相关命令:

     tc -s qdisc/class ls dev eth0
     tc -s qdisc/class ls dev eth1

 

  上述几例有在工作中用到的,也有网络整理的.对以后的流量控制可以起个参考作用..当然,例子不足以完全体现tc的强大功能,一句话iptables+tc的应用,只有你想不到的,没有做不到的...Linux流量控制IV---实例解析

  推荐一实例详细讲解文档: http://svn.itpub.net/post/34106/359131

最后

以上就是称心黑夜为你收集整理的Linux流量控制的全部内容,希望文章能够帮你解决Linux流量控制所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(43)

评论列表共有 0 条评论

立即
投稿
返回
顶部