ipp2p中使用tc+iptables限速(指令碼)

來源:互聯網
上載者:User

tc限速:

ipp2p只能識別p2p串連請求,而不能識別所有p2p包,必須和CONNMARK目標結合在一起使用(目前只支援TCP協議標識)

 

#通過iptables給資料包打標記

#結果:每一個標記為P2P串連的包被標記為“1”

#從MARK目標中恢複標記

iptables -A PREROUTING -t mangle -p tcp -j CONNMARK --restore-mark

#接收所有非0標記的包

iptables -A PREROUTING -t mangle -p tcp -m mark ! --mark 0 -j ACCEPT

#將ipp2p串連標記為“1”

iptables -A PREROUTING -t mangle -p tcp -m ipp2p --xltest -j MARK --set-mark 1

#儲存所有標記為“1”的包到CONNMARK中

iptables -A PREROUTING -t mangle -p tcp -m mark --mark 1 -j CONNMARK --save-mark

 

#清空已有的隊列(清空tc規則)

tc qdisc del dev eth0 root

 

#定義一個根,預設匹配通道 1(這條命令分配了HTB隊列規定給eth0並且指定了一個名稱為(handle 控制代碼1:),這個名稱用於標識它下面的子類,default 1的意思是沒有被分類的流量被分配到類1:1)

註:一般(不僅僅是HTB其他所有TC的隊列和類),控制代碼都被寫成X:Y,這裡X、Y都是隊列規定的整數型的標識符,而隊列規定的控制代碼標識符的Y必須是0,控制代碼的類的標識符的數值必須是一個非零的整數,“1:”等同於“1:0”

tc qdisc add dev eth0 root handle 1: htb default 1

 

#下載通道限速在20kbps,對符合標記1的使用者使用定義的類1:2通道(特定的FWMARK標記值(hanlde x fw))

第一行:在隊列1:下建立了一個根類1:1,並且定義了HTB隊列規定作為這個根類的父類。一個根類的子類可以相互借用頻寬,但是根類之間不能相互借用頻寬。

第二行:建立子類1:2,並分配20kbps的頻寬。。

第三行:通過filter(過濾器)為資料包分類。

註:重複dev eth0描述,是因為本地介面比如eth0 和 eth1 他們各自都可能會有類的控制代碼表示為1:1。參數ceil指定了一個類可以用的最大頻寬,用來限制類可以借用多少頻寬,其數值應該至少和它所在的類的速率一樣高。

tc class add dev eth0 parent 1: classid 1:1 htb rate 1000Kbps ceil 1000Kbps

tc class add dev eth0 parent 1:1 classid 1:2 htb rate 20Kbps ceil 20Kbps

tc filter add dev eth0 parent 1:0 protocol  ip handle 1 fw classid 1:2

 

查看用tc命令設定網卡流量的情況:

tc –s qdisc ls dev eth1

tc –s class ls dev eth1

(dos下查看網路狀態命令netstat –n)

 

查看包是否被打上標記:

cat /proc/net/ip_conntrack [|grep “192.168.9.6”] 

or

cat /proc/net/ip_conntrack [|grep  “mark=2”]

 

完整指令碼:

#!/bin/bash

echo "recompile ipp2p"

 

make uninstall && make && make install -C /home/liuxl/sources/ipp2p-0.99.15

echo "reset iptables'rules and insmod ipt_ipp2p"

iptables -t mangle -F

iptables -F

rmmod ipt_ipp2p

insmod /home/liuxl/sources/ipp2p-0.99.15/ipt_ipp2p.o

 

#iptables -A FORWARD -m ipp2p --xltest -j DROP

 

iptables -A PREROUTING -t mangle -p tcp -j CONNMARK --restore-mark

iptables -A PREROUTING -t mangle -p tcp -m mark ! --mark 0 -j ACCEPT

iptables -A PREROUTING -t mangle -p tcp -m ipp2p --xltest -j MARK --set-mark 1

iptables -A PREROUTING -t mangle -p tcp -m mark --mark 1 -j CONNMARK --save-mark

 

tc qdisc del dev eth0 root

tc qdisc add dev eth0 root handle 1: htb default 1

tc class add dev eth0 parent 1: classid 1:1 htb rate 1000Kbps ceil 1000Kbps

tc class add dev eth0 parent 1:1 classid 1:2 htb rate 20Kbps ceil 20Kbps

tc filter add dev eth0 parent 1:0 protocol  ip handle 1 fw classid 1:2

 

 

PS:tc中的流量處理由三種對象控制:

Qdisc(排隊規則):

      它是queueing discipline的簡寫。無論何時,核心如果需要通過某個網路介面發送資料包,它都需要按照為這個介面配置的qdisc把資料包排入佇列。然後,核心會儘可能多地從qdisc裡面取出資料包,把它們交給網路介面卡驅動模組。最簡單的qdisc是pfifo它不對進入的資料包做任何的處理,資料包採用先入先出的方式通過隊列。不過它會保持網路介面一時無法處理的資料包。

Class(類)

      某些qdisc可以包含一些類別,不同的類別中可以包含更深入的qdisc,通過這些細分的qdisc還可以為進入的隊列的資料包排隊。通過設定各種類別資料包的離隊次序,qdisc可以為設定網路資料流量的優先順序。

Filter(過濾器)

      用於為資料包分類,決定它們按照何種qdisc進入隊列。無論何時資料包進入一個劃分子類的類別中,都需要進行分類。使用filter分類時,核心會調用附屬於這個類(class)的所有過濾器,直到返回一個判決。如果沒有判決返回,就作進一步的處理,而處理方式和qdisc有關。(filter是在QDisc內部,它們不能作為主體)

 

本文來自CSDN部落格,轉載請標明出處:http://blog.csdn.net/ast_224/archive/2008/11/06/3225073.aspx

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.