使用 TC 进行 Linux 流量整形

使用 TC 进行 Linux 流量整形

我的网络连接如下:

互联网 <-128kbps 链路-> Cisco 路由器(公共 IP)<-LAN-> Linux 路由器/服务器(公共 IP)<-LAN-> 普通 PC(公共 IP)

思科路由器:

  • 分配给我所在机构的第一个公共 IP (/29)
  • 被编程为通过 Linux 路由器发送所有数据包

Linux 路由器

  • 分配给我机构的第二个公共 IP
  • 被编程用于在普通 PC 和 Cisco 路由器之间转发数据包
  • 也充当服务器(邮件、网络等)

普通PC(共4台):

  • 其余公共 IP
  • 使用 Linux 路由器作为网关

我在 Linux 路由器上启用了 iptables 数据包日志记录,有时我发现:

  • 有些数据包很大,大于 20KB。这正常吗?(是的,这很正常。这些不是数据包,而是 IP 数据报,正如某人解释的那样)
  • 传输的数据(向互联网传输)超过 16KB 的次数太多。例如,在某一秒内,传输了 10572 字节(没有问题),传输了 63521 字节(到 Cisco 路由器)。通过 128kbps 链路发送 64KB 至少需要 4 秒钟。与此同时,Linux 路由器正在向 Cisco 路由器发送更多数据,导致其缓冲区堵塞。这可不是什么好事。

现在,如何配置 Linux 路由器以按照以下方式调整流量:

  1. 当这些常规PC和Linux服务器之间进行通讯时,保持最大的传输速度。
  2. 减慢与外界的通信速度,以避免堵塞“出站”线路,使用所有(或几乎所有)可用带宽(128 kbps)。跟踪中不再有“>16KB 出站秒数”。
  3. 保证每台普通 PC 的出网速度为 24kbps,Linux 服务器的出网速度随时为 24kbps。(如有必要,留出 8bkps 作为开销)。换句话说,5 个(伪)“频带”,每个频带为 24kbps。
  4. 如果任何 PC 未使用其全部带宽,则在其余传输 PC 之间公平共享空闲带宽
  5. 在每个频段内,优先考虑某些数据包(DNS 查找、控制数据包),而其他数据包(torrent!!!)则不予优先考虑,并且不影响其他频段。

我已经标记了(使用 IP 表 --set-xmark 选项)每台 PC 的每个传出数据包:

  1. Linux路由器对外开放,优先级高
  2. Linux路由器对外开放,正常优先级
  3. Linux路由器对外开放,优先级低
  4. 第一台普通PC向外界开放,优先级高

... 等等。

每个传入数据包也使用此方案进行标记,从 16 开始。

很抱歉这个问题太长了,但我已经放弃使用 tc 命令进行设置,关于流量整形的文档太少,我不知道下一步该怎么做。

答案1

假设 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

等等。

有什么建议、意见等吗?(我没有该领域的经验)

答案2

看一看这里- 这是关于如何使用 htb qos 机制的相当简单的教程。本质上,您在 iptables 上标记数据包,然后根据标记分配给不同的队列。

或者你也可以看看高频散射,虽然我从未使用过它,但它实际上可能在如此慢的互联网连接下工作得更好。

关于数据包大小-我无法想象20kB的大数据包。即使以太网中的巨型帧也更短[9kB]。

编辑:正如某人解释的那样 - LEN 是碎片整理后的 IP 数据包的长度,而不是线路上帧的大小。

答案3

这是哪种 Cisco?通常,您也可以在 IOS 上进行整形,它可能比 Linux tc 更容易配置。

相关内容