無論是為了保證服務質量(QoS),限制帶寬,還是模擬網絡條件,Linux內核中的TC(Traffic Control)工具都為我們提供了強大的功能
本文將詳細介紹TC的基本概念、使用方法、以及實際案例,幫助你更好地理解和運用這一工具
一、TC的基本概念 TC(Traffic Control)是Linux內核中提供的一個用于控制和管理網絡流量的強大工具
它基于內核的隊列規則(qdisc)和流量類別(class)體系結構,允許對進入或離開網絡接口的數據流進行復雜的整形和過濾
TC通過以下三個核心組件實現流量控制: 1.隊列規則(qdisc):定義數據包的排隊和發送方式
常見的隊列規則包括pfifo_fast、htb(層次令牌桶)、tbf(令牌桶過濾器)和prio(優先級隊列)
2.類別(class):對不同類型的流量應用不同的策略
每個類別可以包含其他類別,形成層次結構,從而實現更復雜的流量管理
3.過濾器(filter):根據指定的條件將流量分配到不同的類別中
過濾器可以基于IP地址、端口、協議等屬性進行匹配
二、TC的基本使用方法 TC命令的基本格式如下: tc 【OPTIONS】 OBJECT ACTION【FILTER】 - OPTIONS:可選參數,如-s顯示統計數據,-d刪除對象等
- OBJECT:操作對象,可以是qdisc(隊列規則)、class(流量類別)或filter(過濾器)
- ACTION:針對對象的操作,如add(添加)、change(更改)、replace(替換)、delete(刪除)等
- FILTER:對象的具體參數,如接口名稱(dev eth0)、父級分類ID(parent ...)、qdisc類型(htb、pfifo_fast等)、速率限制(rate ...)等
1. 添加和刪除隊列規則 添加一個根隊列規則,使用htb調度策略: tc qdisc add dev eth0 root handle 1: htb default 1 刪除隊列規則: tc qdisc del dev eth0 root 2. 添加和刪除類別 創建一個類別,限制帶寬為1Mbps: tc class add dev eth0 parent 1: classid 1:1 htb rate 1mbit 刪除類別: tc class del dev eth0 parent 1: classid 1:1 3. 添加和刪除過濾器 創建一個過濾器,匹配目的IP地址為192.168.1.2的流量,并將其分配到類別1:10中: tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dst 192.168.1.2 flowid 1:10 刪除過濾器: tc filter del dev eth0 protocol ip parent 1:0 prio 1 handle 1:10 三、TC的實際應用案例 1. 模擬網絡延遲 增加100毫秒的延遲: tc qdisc add dev eth0 root netem delay 100ms 刪除延遲設置: tc qdisc del dev eth0 root netem delay 100ms 2. 模擬網絡丟包 設置10%的丟包率: tc qdisc add dev eth0 root netem loss 10% 刪除丟包設置: tc qdisc del dev eth0 root netem loss 10% 3. 模擬網絡抖動 增加100毫秒的基礎延遲,并允許±10毫秒的波動: tc qdisc add dev eth0 root netem delay 100ms 10ms 刪除抖動設置: tc qdisc del dev eth0 root netem delay 100ms 10ms 4. 限制特定IP的帶寬 限制IP為1.1.1.3的上傳速度: 1. 創建虛擬網卡并啟用,暫定虛擬網卡名為ifb0
2. 創建Ingress隊列并進行導流
3. 對ifb0進行限速
限制IP為1.1.1.3的下載速度: 1. 設置根qdisc(隊列規則)
2. 創建子類進行帶寬限制
3. 創建過濾器以識別特定流量
具體步驟如下: 創建虛擬網卡并啟用 ip link add name ifb0 type ifb ip link set dev ifb0 up 將ifb0添加到橋接或路由配置中(視情況而定) 例如,將其橋接到eth0 brctl addif br0 ifb0 創建Ingress隊列并進行導流 tc qdisc add dev ifb0 handle ffff: ingress tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip src 1.1.1.3 action mirred egress redirect dev ifb0 對ifb0進行限速 tc qdisc add dev ifb0 root handle 1: htb default 30 tc class add dev ifb0 parent 1: classid 1:1 htb rate 1mbit tc filter add dev ifb0 protocol ip parent 1:0 prio 1 u32 match ip src 1.1.1.3 flowid 1:1 5. 限制特定端口的帶寬 限制源端口為2049的流量帶寬: 設置根qdis