Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

Linux 流量整形實戰:tc + HTB 限制 HTTP 出站帶寬、保障 SSH 優先級

編輯:Linux 教學

中小企業服務器出口帶寬有限(如 10Mbps),Web 大流量下載易擠佔 SSH、管理端口導致運維失聯。本文基於 **tc (Traffic Control) + HTB (Hierarchical Token Bucket)** 實現:HTTP (80/443) 限速 512kbps、SSH (22) 保障 100kbps、其餘流量共享剩餘帶寬,配合 iptables 标記分類,含監控驗證命令,可直接套用生產環境。

核心概念:令牌桶 (TB) 與 HTB

  • TB:桶容量 burst、令牌生成速率 rate、峰值速率 peakrate。有令牌即可發送,無令牌排隊/丟包。
  • HTB:分層類別樹,父類分配總帶寬,子類設定 rate(保障帶寬)與 ceil(上限帶寬),prio 決定借用父類剩餘帶寬的優先級。
  • 分類器:tc filter + iptables fwmark 將數據包導入對應類別。

部署步驟

1. 清空現有規則

tc qdisc del dev eth0 root 2>/dev/null

2. 創建根隊列規則

tc qdisc add dev eth0 root handle 1: htb default 10
# handle 1: 根句柄,default 10 未匹配流量進入類別 1:10

3. 定義根類別(總帶寬上限)

tc class add dev eth0 parent 1: classid 1:1 htb rate 1024kbit
# 假設出口總帶寬 1Mbps,根類別限制總流量不超過此值

4. 定義業務子類別

# HTTP 類別:保障 512k,上限 640k,優先級 1(較高)
tc class add dev eth0 parent 1:1 classid 1:10 htb rate 512kbit ceil 640kbit prio 1

# SSH 類別:保障 100k,上限 160k,優先級 0(最高)
tc class add dev eth0 parent 1:1 classid 1:20 htb rate 100kbit ceil 160kbit prio 0

# 默認類別:其餘流量共享剩餘
tc class add dev eth0 parent 1:1 classid 1:30 htb rate 200kbit ceil 1024kbit prio 2

5. iptables 標記數據包

iptables -A OUTPUT -t mangle -p tcp --sport 80  -j MARK --set-mark 10
iptables -A OUTPUT -t mangle -p tcp --sport 443 -j MARK --set-mark 10
iptables -A OUTPUT -t mangle -p tcp --sport 22  -j MARK --set-mark 20
# 其他流量無標記,走 default 1:30
iptables-save > /etc/sysconfig/iptables  # 持久化

6. tc filter 綁定標記到類別

tc filter add dev eth0 parent 1: protocol ip prio 1 handle 10 fw flowid 1:10
tc filter add dev eth0 parent 1: protocol ip prio 0 handle 20 fw flowid 1:20
# prio 數值越小優先級越高,handle 對應 iptables MARK 值

驗證與監控

# 查看類別統計
tc -s -d class show dev eth0

# 實時監控
watch -n 1 'tc -s -d class show dev eth0'

# 查看 iptables 標記計數
iptables -t mangle -n -v -L

# 端到端測速
lftp -e "pget -n 5 https://speedtest.example.com/100M.bin; bye"
wget --limit-rate=200k https://speedtest.example.com/100M.bin

參數調優建議

  • rate:設為業務**最低保障帶寬**,總和 ≤ 父類 rate。
  • ceil:設為業務**允許突發上限**,總和可 > 父類 rate(借用機制)。
  • prio:數值越小優先級越高,**關鍵管理流量 (SSH、監控) 設 0**。
  • burst / cburst:可在 class 添加 burst 10kb cburst 20kb 控制突發桶大小。
  • 測試時先用 netem 模擬延遲/丟包:tc qdisc add dev eth0 root netem delay 50ms loss 1%

常見坑點

現象原因解決
限速不生效iptables MARK 值與 tc filter handle 不匹配核對 --set-mark 與 handle 數值
SSH 依然卡頓SSH 類別 rate 過小 / prio 不夠高調大 rate、設 prio 0、檢查是否被 default 類別搶佔
規則重啟失效未持久化將 tc 命令寫入 /etc/rc.local 或 network-scripts/ifup-local
內網流量被誤限速OUTPUT 鏈匹配所有出站添加 -d ! 192.168.0.0/16 排除內網段

總結

tc + HTB 是 Linux 內核級流量整形標準方案,**無需額外硬件、靈活分層、性能損耗極低**。掌握「根類別定總量、子類別定保障/上限/優先級、iptables 標記分流、filter 綁定」五步法,即可在 10Mbps 出口上同時跑 Web 下載、保障 SSH 運維、承載業務 API,實現帶寬的精細化治理。

Copyright © Windows教程網 All Rights Reserved