用 Linux `tc` 指令做網絡流量控制:入門到實戰教學
做 IT 嘅朋友成日會遇到一個問題:同一部伺服器上面,有人行緊大 file 備份,有人要開視像會議,條 bandwidth 就咁俾個 backup 食曬,其他人全部 lag 到喊。想解決?唔一定要買幾十萬嘅 QoS 硬件,Linux 本身已經有個好強嘅工具叫 `tc`(Traffic Control),今日就帶大家由零開始,學識點樣用 `tc` 做流量控制。
咩係 tc?
`tc` 係 Linux kernel 入面 `netem` 同排隊規則(qdisc)嘅控制工具。佢可以幫你做幾樣嘢:
– 限速(rate limiting):限制某啲流量用幾多 bandwidth
– 優先次序(prioritization):保證 VoIP、視像會議行先
– 模擬網絡狀況:延遲、packet loss、jitter(測試用)
簡單講,`tc` 就係你部機嘅網絡流量警察。
第一步:認識 qdisc 結構
`tc` 嘅核心概念係 qdisc(queueing discipline)。一個 qdisc 決定 packet 點樣排隊同送出。最常用嘅係:
– `htb`(Hierarchical Token Bucket):做限速同分層管理,最常用
– `pfifo`:簡單先入先出
– `netem`:模擬網絡問題
HTB 係分層結構,一個 root class 下面可以有好多 child class,每個 class 可以有自己嘅保證頻寬(rate)同爆衝上限(ceiling)。
第二步:加一個簡單限速規則
假設你部機嘅網絡介面係 `eth0`,你想限制總出站流量去 10Mbit:
# 刪除舊規則(重新開始)
tc qdisc del dev eth0 root 2>/dev/null
建立 root HTB qdisc
tc qdisc add dev eth0 root handle 1: htb default 30
建立 root class,限制總頻寬 10Mbit
tc class add dev eth0 parent 1: classid 1:1 htb rate 10mbit
呢度 `handle 1:` 係 qdisc 嘅 ID,`classid 1:1` 係 class 嘅 ID。
第三步:建立子 class 做分層限速
想將 bandwidth 分俾唔同服務?可以建立子 class:
# 子 class 1:10 保證 6Mbit,最多可爆到 10Mbit
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 6mbit ceil 10mbit
子 class 1:20 保證 3Mbit,最多爆到 8Mbit
tc class add dev eth0 parent 1:1 classid 1:20 htb rate 3mbit ceil 8mbit
`rate` 係保證頻寬,`ceil` 係可以借到嘅上限。當有剩餘 bandwidth 時,child class 可以向上借。
第四步:加 filter 將流量分類
而家要話俾 `tc` 知,邊啲流量去邊個 class。最簡單用 IP 做 filter:
# 用 tc filter 將某個 IP 嘅流量送去 1:10
tc filter add dev eth0 parent 1: protocol ip prio 1 u32 \
match ip dst 192.168.1.100/32 flowid 1:10
又或者用 port:
# HTTP 流量送去 1:20
tc filter add dev eth0 parent 1: protocol ip prio 1 u32 \
match ip dport 80 0xffff flowid 1:20
第五步:驗證結果
# 睇下而家有咩規則
tc qdisc show dev eth0
tc class show dev eth0
tc filter show dev eth0
你可以用 `iperf3` 或者 `wget` 去測試,睇下係咪真係限咗速。
實際應用場景
場景一:公司 VoIP 優先
將 SIP 流量(port 5060)放去高優先 class,保證通話質素,就算有人狂 download 都唔會斷線。
場景二:備份限速
夜間備份流量限到 20Mbit,唔影響日間正常業務。
場景三:測試網絡容忍度
用 `netem` 模擬 packet loss,測試你嘅 app 喺差網絡下嘅表現:
tc qdisc add dev eth0 root netem loss 5% delay 100ms
總結
🔗 參考資料:NVD NIST 漏洞資料庫
`tc` 係一個免費、強勁嘅流量控制工具,關鍵係理解 qdisc → class → filter 三層結構。記住每次改動前先 `tc qdisc del dev eth0 root` 清場,避免規則重疊搞亂。掌握咗呢個技能,你就唔使再俾人話「點解個網絡咁慢」喇。
#Linux #backup #技術分享 #IT教學 #備份




