中小企業服務器出口帶寬有限(如 10Mbps),Web 大流量下載易擠佔 SSH、管理端口導致運維失聯。本文基於 **tc (Traffic Control) + HTB (Hierarchical Token Bucket)** 實現:HTTP (80/443) 限速 512kbps、SSH (22) 保障 100kbps、其餘流量共享剩餘帶寬,配合 iptables 标記分類,含監控驗證命令,可直接套用生產環境。
burst、令牌生成速率 rate、峰值速率 peakrate。有令牌即可發送,無令牌排隊/丟包。rate(保障帶寬)與 ceil(上限帶寬),prio 決定借用父類剩餘帶寬的優先級。tc qdisc del dev eth0 root 2>/dev/null
tc qdisc add dev eth0 root handle 1: htb default 10
# handle 1: 根句柄,default 10 未匹配流量進入類別 1:10
tc class add dev eth0 parent 1: classid 1:1 htb rate 1024kbit
# 假設出口總帶寬 1Mbps,根類別限制總流量不超過此值
# 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
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 # 持久化
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,實現帶寬的精細化治理。