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还需进一步的加强学习和实践的应用...希望感兴趣的朋友能和我一起学习,在实际工作应用中得到发展...

  另推荐一篇透明式防火墙的网络文档: 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中文文档..

        

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中文版整理而得,加以工作实践,仅作学习笔记用...呵呵.

转载地址: http://blog.csdn.net/liuzhenhua_andy/article/details/7018462