Linux流量控制2 過濾器 分類

2021-05-09 22:33:36 字數 2681 閱讀 2240

使用過濾器分類

每塊網絡卡都有乙個出口根排隊規則,預設情況下是pfifo_fast 排隊規則。每個排隊規則都指定乙個控制代碼,控制代碼有兩個部分,乙個主號碼和乙個次號碼。習慣上把根佇列規定稱為「1:」,等價於「1:0」。類的主號碼必須與它們父輩的主號碼一致。如下圖。

資料報是在根佇列規定處入隊和出隊的,而核心只同根打交道。乙個資料報可能是按照下面這個鏈狀流程進行分類的:1: -> 1:1 -> 12: -> 12:2,資料報現在應該處於12:2 下屬的某個佇列規定中的某個佇列中。在這個例子中,樹的每個節點都附帶著乙個過濾器,用來選擇下一步進入哪個分支。然而,這樣也是允許的:1: -> 12:2,也就是說,根所附帶的乙個過濾器要求把資料報直接交給12:2。

當核心決定把乙個資料報發給網絡卡的時候,根佇列規定1:會得到乙個出隊請求,然後把它傳給1:1,然後依次傳給10:、11:和12:,然後試圖從它們中進行dequeue()操作。也就是說,核心需要遍歷整顆樹,因為只有12:2 中才有這個資料報。換句話說,類及其兄弟僅僅與其「父佇列規定」進行交談,而不會與網絡卡進行交談。只有根排隊規則才能由核心進行出隊操作。而且,任何類的出隊操作都不會比它們的父類更快。

為了決定用哪個類處理資料報,必須呼叫所謂的「分類器鏈」

進行選擇。這個鏈中包含了這個分類佇列規定所需的所有過濾器。

linux下可用的分類器有fw、u32、route等。fw根據防火牆如何對這個資料報做標記進行判斷;u32根據資料報中的各個字段進行判斷;route根據資料如何被路由進行判斷。rsvp、rsvp6根據資料報的rsvp 情況進行判斷,它只能用於自己的網路,網際網路並不遵守rsvp;tcindex用於dsmark排隊規則。

分類器一般都能接受幾個引數,如下:

protocol

分類器所接受的協議。一般來說只會接受ip 資料。必要引數。

parent

分類器附帶在哪個控制代碼上。控制代碼必須是乙個已經存在的類。必要引數。

prio

分類器的優先權值。優先權值低的優先。

handle

對於不同過濾器,它的意義不同。

fw

fw分類器要依靠防火牆把需要引導的封包標識起來。所以必須先設定好防火牆,使用ipchains/iptables給資料報打標籤。

例如:iptables -t mangle -a prerouting -p udp -m udp --dport 53 -j mark --set-mark 1

它的意思是把發往目的埠為53(dns)的udp資料報都打上標記1。

tc filter add dev eth0 parent 10: protocol ip prio 1 handle 1 fw classid 10:1

它的意思是打上標記為1的資料報優先順序為1,並放入10:1佇列中。

u32

u32分類器是當前很先進的過濾器。全部基於雜湊表實現,所以當有很多過濾器的時候仍然能夠保持健壯。u32 過濾器最簡單的形式就是一系列記錄,每條記錄包含兩個部分:乙個選擇器和乙個動作。

u32 選擇器包含了能夠對當前通過的資料報進行匹配的特徵定義。它其實只是定義了ip 包頭中某些位的匹配而已,但這種看似簡單的方法卻非常有效。

例如:# tc filter add dev eth0 protocol ip parent 1:0 pref 10 u32 /

match u32 00100000 00ff0000 at 0 flowid 1:10

它的意思是匹配那些tos 字段帶有『最小延遲』屬性的資料報。

普通選擇器定義了要對資料報進行匹配的特徵、掩碼和偏移量。使用普通選擇器,可以匹配ip(或者上層協議)頭部的任意乙個bit。一般選擇器的語法是:

match [ u32 | u16 | u8 ] pattern mask [ at offset | nexthdr+offset]

利用u32、u16 或u8 三個關鍵字中的乙個來指明特徵的bit 數。然後pattern和mask 應該按照它定義的長度緊挨著寫。offset 引數是開始進行比較的偏移量(以位元組計)。如果給出了「nexthdr+」關鍵字,偏移量就移到上層協議頭部開始的位置。

例如:# tc filter add dev eth0 parent 10: prio 3 u32 /

match ip protocol 6 0xff /

match u8 0x10 0xff at nexthdr+13 /

flowid 10:1

它的意思是匹配帶有ack 位的tcp 資料報,並將其放入10:1的佇列中。

route

路由分類器基於路由表的路由結果進行過濾。當乙個資料報穿越乙個類,並到達乙個標有「route」的過濾器的時候,它就會按照路由表內的資訊進行**。

例如:# ip route add 192.168.10.0/24 via 192.168.10.1 dev eth1 realm 10

tc filter add dev eth1 parent 1:0 protocol ip prio 100 route to 10 classid 1:10

目標網路192.168.10.0 定義為realm 10,凡是去往192.168.10.0 子網的資料報匹配到類1:10。

置頂 Linux 流量控制

在如今的網路界,也許tc知道的人並不多了,這篇文章做留戀吧。以前研究tc時記錄下的講解與配置檔案。tc filter add dev eth0 parent 1 0 protocol ip prio 4 handle 4 fw classid 1 14 tc filter add dev eth0 ...

版本控制與過濾器設計

2013年的第一篇部落格,祝大家新年快樂。有段時間沒維護部落格了,太懶了,也不知道該寫些什麼,寫學習心得感覺不如看書來的直接,寫技術應用吧又沒那麼多貨。最近不是很忙,前天抽空把過濾部分的 剝離了個原型出來,談不上覆雜高深,權當拋磚引玉,大家有好的想法歡迎交流學習。之前我部落格中談到關於過濾器與快取,...

十五 jinja2過濾器之實現自定義過濾器

過濾器的本質就是函式,如果在模板中呼叫這個過濾器,那麼就會將這個變數的值作為第乙個引數傳給過濾器函式,然後將函式的返回值作為濾器的返回值 實現乙個把 hello 替換成 的過濾器 也可以改為模板裡面自己設定要替換的內容 實現時間處理過濾器 返回time距離現在的時間是多久 1 如果時間間隔小於1分鐘...