1、網絡拓撲html
2、環境介紹linux
服務器系統是centos6.5,內核:2.6.32-431.el6.x86_64centos
Server:兩張網卡eth0:10.0.0.100緩存
eth1:192.168.0.1服務器
PC:一張網卡eth0:192.168.0.10,gw:192.168.0.1網絡
3、tc介紹tcp
在linux中,tc有二種控制方法CBQ和HTB。HTB是設計用來替換CBQ的,HTB比CBQ更加靈活,可是CPU 開銷也更大,一般高速的鏈路會使用CBQ,通常而言HTB使用的更加普遍咱們對tc中的 HTB的規則本質上是一個樹形結構,包括三個基本的構成塊:隊列規定qdisc(queueing discipline) ,類(class)和分類器(Classifiers).ide
qdisc 隊列規則(queueing discipline):spa
用來實現控制網絡的收發速度.經過隊列,linux能夠將網絡數據包緩存起來,而後根據用戶的設置,在儘可能不中斷鏈接(如 tcp)的前提下來平滑網絡流量.須要注意的是,linux 對接收隊列的控制不夠好,因此咱們通常只用發送隊列,即"控發不控收".它封裝了其餘兩個主要 tc 組件(類和分類器).內核若是須要經過某個網絡接口發送數據包,它都須要按照爲這個接口配置的 qdisc 隊列規則把數據包加入隊列.而後,內核會盡量多地從 qdisc裏面取出數據包,把它們交給網絡適配器驅動模塊..net
最簡單的QDisc是pfifo它不對進入的數據包作任何的處理,數據包採用先入先出的方式經過隊列.不過,它會保存網絡接口一時沒法處理的數據包.常有的隊列規則包括 FIFO 先進先出,RED 隨機早期探測,SFQ隨機公平隊列和令牌桶 Token Bucket,類基隊列 CBQ,CBQ 是一種超級隊列,即它可以包含其它隊列,甚至其它CBQ.
Class類
class 用來表示控制策略.很顯然,不少時候,咱們極可能要對不一樣的IP實行不一樣的流量控制策略,這時候咱們就得用不一樣的class來表示不一樣的控制策略了.
Filter規則
filter 用來將用戶劃入到具體的控制策略中(即不一樣的 class 中).好比,如今,咱們想對xxa,xxb兩個IP實行不一樣的控制策略(A,B),這時,咱們可用 filter 將 xxa 劃入到控制策略 A,將 xxb 劃入到控制策略 B,filter 劃分的標誌位可用 u32 打標功能或 IPtables 的 set-mark (大多使用iptables 來作標記)功能來實現.目前,tc能夠使用的過濾器有:fwmark分類器,u32 分類器,基於路由的分類器和 RSVP 分類器(分別用於IPV6、IPV4)等;其中,fwmark 分類器容許咱們使用 Linux netfilter 代碼選擇流量,而 u32 分類器容許咱們選擇基於 ANY 頭的流量 .須要注意的是,filter (過濾器)是在QDisc 內部,它們不能做爲主體.
實施步驟
主要是創建隊列、分類、過濾器三步。
1 給物理設備創建一個隊列qdisc
2 在相關隊列上創建分類,通常是在該qdisc上創建一個根分類,而後在此根分類上創建子類。
3 爲每個分類創建基於路由的過濾器,並把過濾規則與特定的路由結合。通常只須要針對根分類提供一個過濾器,而後爲每一個子類提供路由映射。
4、實施
Server端
sed -i 's#net.ipv4.ip_forward = 0#net.ipv4.ip_forward = 1#g' /etc/sysctl.conf
sysctl -p
作nat命令以下:
iptables -F
iptables -t nat -F
iptables -t nat -A POSTROUTING -s 192.168.0.0/24 -o eth0 -j SNAT --to 10.0.0.100
爲流量控制作基於fw過濾器的標記
iptables -t mangle -I PREROUTING -o eth0 -s 192.168.0.0/24 -j MARK --set-mark 0x11
上傳速率作流量控制
tc 只能控制網卡發送包的速率,因此上傳速率的限制要在eth0上作
刪除舊有隊列
tc qdisc del dev eth0 root 2>/dev/null
加一個根隊列
tc qdisc add dev eth0 root handle 1:0 htb default 60
加一個根類
tc class add dev eth0 parent 1:0 classid 1:1 htb rate 100Mbit ceil 100Mbit prio 0
加一個子類用於內網速率限制爲10Mbit
tc class add dev eth0 parent 1:1 classid 1:11 htb rate 10Mbit ceil 10Mbit prio 1 burst 96kbit
設置隊列規則
tc qdisc add dev eth0 parent 1:11 handle 111:0 sfq perturb 10
將隊列和fw過濾器映射起來 其中hand 0x11 的0x11是開始用iptables 作的標記
tc filter add dev eth0 parent 1:0 protocol ip prio 1 handle 0x11 fw classid 1:11
作下載限制,過濾器是用u32
tc qdisc del dev eth1 root 2>/dev/null
根隊列
tc qdisc add dev eth1 root handle 2:0 htb default 30
根類
tc class add dev eth1 parent 2:0 classid 2:1 htb rate 10Mbit ceil 10Mbit prio 0
子類
tc class add dev eth1 parent 2:1 classid 2:11 htb rate 1Mbit ceil 1Mbit prio 1
設置隊列規則
tc qdisc add dev eth1 parent 2:11 sfq perturb 10
tc filter add dev eth1 parent 2:0 protocol ip prio 2 u32 match ip dst 192.168.0.0/24 flowid 2:11
用如下命令監視流量
tc -s qdisc ls dev eth0
tc -s qdisc ls dev eth1
tc -s class ls dev eth0
tc -s class ls dev eth1
參考:
http://lartc.org/howto/lartc.qdisc.classful.html
https://blog.csdn.net/eydwyz/article/details/53320612