Linux流量控制III---過濾規則(接着上文)

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

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章