Linux

使用 TC 的 Linux 流量整形

  • November 3, 2009

我的網際網路連接是這樣的:

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 路由器以通過以下方式調整流量:

  1. 當流量在這些普通 PC 和 Linux 伺服器之間時,將傳輸速度保持在最大。
  2. 使用所有(或幾乎所有)可用頻寬(128 kbps)減慢到外部世界的流量以避免堵塞“輸出”線路。跟踪上不再有“>16KB out seconds”。
  3. 隨時保證每台普通 PC 24kbps 輸出,Linux 伺服器 24kbps 輸出。(如有必要,剩餘 8bkps 用於成本)。IOW,5 個(偽)“波段”,每個 24kbps。
  4. 如果有任何 PC 未使用其全頻段,則在其餘傳輸 PC 之間公平共享空閒頻寬
  5. 優先考慮某些數據包(DNS 查找,控制數據包),優先於其他數據包(洪流!!!),在每個頻段內,並且不影響其他頻段。

我已經標記(使用 IP 表 –set-xmark 選項)每台 PC 的每個傳出數據包:

  1. Linux路由器對外,高優先級
  2. Linux路由器對外,正常prio
  3. Linux路由器對外,低優先級
  4. 第一檯面向外界的普通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

等等。

有什麼建議、意見等嗎?(我沒有該領域的經驗)

引用自:https://serverfault.com/questions/70042