Linux
使用 TC 的 Linux 流量整形
我的網際網路連接是這樣的:
Internet <-128kbps 連結-> Cisco 路由器(公共 IP)<-LAN-> Linux 路由器/伺服器(公共 IP)<-LAN-> 普通 PC(公共 IP)
思科路由器:
- 第一個分配給我機構的公共 IP (/29)
- 被程式為通過 Linux 路由器發送所有數據包
Linux 路由器
- 分配給我機構的第二個公共 IP
- 被程式為在普通 PC 和 Cisco 路由器之間轉發數據包
- 也充當伺服器(郵件、網路等)
普通 PC(其中 4 台):
- 其餘公共 IP
- 使用 Linux 路由器作為網關
我在 Linux 路由器上啟用了 iptables 數據包日誌記錄,有時我發現:
- 有些數據包很大,大於 20KB。這正常嗎?(是的,這很正常。這些不是數據包,這些是 IP 數據報,正如 Some Guy 好心解釋的那樣)
- 傳輸的數據(發送到網際網路)超過 16KB 的次數太多。例如,在特定的一秒內,輸入了 10572 個字節(沒問題),輸出了 63521 個字節(到 Cisco 路由器)。通過 128kbps 連結發送 64KB 至少需要 4 秒。與此同時,Linux 路由器正在向 Cisco 路由器發送更多數據,從而阻塞其緩衝區。不好。
現在,我如何配置 Linux 路由器以通過以下方式調整流量:
- 當流量在這些普通 PC 和 Linux 伺服器之間時,將傳輸速度保持在最大。
- 使用所有(或幾乎所有)可用頻寬(128 kbps)減慢到外部世界的流量以避免堵塞“輸出”線路。跟踪上不再有“>16KB out seconds”。
- 隨時保證每台普通 PC 24kbps 輸出,Linux 伺服器 24kbps 輸出。(如有必要,剩餘 8bkps 用於成本)。IOW,5 個(偽)“波段”,每個 24kbps。
- 如果有任何 PC 未使用其全頻段,則在其餘傳輸 PC 之間公平共享空閒頻寬
- 優先考慮某些數據包(DNS 查找,控制數據包),優先於其他數據包(洪流!!!),在每個頻段內,並且不影響其他頻段。
我已經標記(使用 IP 表 –set-xmark 選項)每台 PC 的每個傳出數據包:
- Linux路由器對外,高優先級
- Linux路由器對外,正常prio
- Linux路由器對外,低優先級
- 第一檯面向外界的普通PC,高優先級
… 等等。
每個傳入的數據包也使用從 16 開始的此方案進行標記。
對於這個冗長的問題,我很抱歉,但我已經放棄使用 tc 命令進行設置,關於流量整形的文件太少,我不知道下一步該去哪裡。
假設 eth0 是到 Cisco 路由器的 100mbit 乙太網連接,它應該是這樣的(不是嗎?):
tc qdisc add dev eth0 root handle 1: htb default 2 # 100 mbps tc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit # To LAN traffic tc class add dev eth0 parent 1:1 classid 1:2 htb rate 99000kbit ceil 100mbit # IN traffic tc class add dev eth0 parent 1:1 classid 1:3 htb rate 120kbit # OUT traffic tc class add dev eth0 parent 1:1 classid 1:4 htb rate 120kbit # IN “bands” (one for each PC) tc class add dev eth0 parent 1:3 classid 1:10 htb rate 24kbit ceil 120kbit tc class add dev eth0 parent 1:3 classid 1:11 htb rate 24kbit ceil 120kbit tc class add dev eth0 parent 1:3 classid 1:12 htb rate 24kbit ceil 120kbit tc class add dev eth0 parent 1:3 classid 1:13 htb rate 24kbit ceil 120kbit tc class add dev eth0 parent 1:3 classid 1:14 htb rate 24kbit ceil 120kbit # OUT “bands” (one for each PC) tc class add dev eth0 parent 1:4 classid 1:15 htb rate 24kbit ceil 120kbit tc class add dev eth0 parent 1:4 classid 1:16 htb rate 24kbit ceil 120kbit tc class add dev eth0 parent 1:4 classid 1:17 htb rate 24kbit ceil 120kbit tc class add dev eth0 parent 1:4 classid 1:18 htb rate 24kbit ceil 120kbit tc class add dev eth0 parent 1:4 classid 1:19 htb rate 24kbit ceil 120kbit
會給我這樣的東西:
+-----------------------------------------------------------+ | 100 mbits (1:1) | +---------+------------------------+------------------------+ | 99mbits | 120 kbits In (1:3) | 120 kbits Out(1:4) | + (1:2) +----+----+----+----+----+----+----+----+----+----+ +---------+ PC1| PC2| PC3| PC4| PC5| PC1| PC2| PC3| PC4| PC5| |1:10|1:11|1:12|1:13|1:14|1:15|1:16|1:17|1:18|1:19| +----+----+----+----+----+----+----+----+----+----+
對於每個樂隊:
# PC1, IN tc qdisc add dev eth0 parent 1:10 handle 20: prio tc qdisc add dev eth0 parent 20:1 handle 22: sfq perturb 10 tc qdisc add dev eth0 parent 20:2 handle 23: sfq perturb 10 tc qdisc add dev eth0 parent 20:3 handle 24: sfq perturb 10 # PC1, OUT tc qdisc add dev eth0 parent 1:15 handle 21: prio tc qdisc add dev eth0 parent 21:1 handle 25: sfq perturb 10 tc qdisc add dev eth0 parent 21:2 handle 26: sfq perturb 10 tc qdisc add dev eth0 parent 21:3 handle 27: sfq perturb 10 +--------------------++--------------------+ | PC1 IN || PC1 OUT | +--------------------++--------------------+ | PRIO (20:0) || PRIO (21:0) | | | | || | | | | Prio | Prio | Prio || Prio | Prio | Prio | | 1 | 2 | 3 || 1 | 2 | 3 | |(20:1)|(20:2)|(20:3)||(21:1)|(21:2)|(21:3)| +------+------+------++------+------+------+ | SFQ | SFQ | SFQ || SFQ | SFQ | SFQ | |(22:0)|(23:0)|(24:0)||(25:0)|(26:0)|(27:0)| +------+------+------++------+------+------+
等等。
規則應該是這樣的
# PC1, OUT tc filter add dev eth0 protocol ip parent 1:0 prio 1 handle 1 fw flowid 21:1 tc filter add dev eth0 protocol ip parent 1:0 prio 1 handle 2 fw flowid 21:2 tc filter add dev eth0 protocol ip parent 1:0 prio 1 handle 3 fw flowid 21:3 # PC1, IN tc filter add dev eth0 protocol ip parent 1:0 prio 1 handle 16 fw flowid 20:1 tc filter add dev eth0 protocol ip parent 1:0 prio 1 handle 17 fw flowid 20:2 tc filter add dev eth0 protocol ip parent 1:0 prio 1 handle 18 fw flowid 20:3
等等。
有什麼建議、意見等嗎?(我沒有該領域的經驗)