使用 TC 的 Linux 流量整形

Yan*_*rez 7 linux traffic-management traffic-shaping

我的互联网连接是这样的:

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 数据报)
  • 太多次传输的数据(到互联网)大于 16KB。例如,在特定的秒内,有 10572 个字节进入(没问题),63521 个字节(到 Cisco 路由器)出去。通过 128kbps 链接发送 64KB 至少需要 4 秒。与此同时,Linux 路由器正在向 Cisco 路由器发送更多数据,从而堵塞其缓冲区。不好。

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

  1. 当这些普通 PC 和 Linux 服务器之间有流量时,将传输速度保持在最大。
  2. 使用所有(或几乎所有)可用带宽 (128 kbps) 减慢到外部世界的流量以避免阻塞“输出”线路。跟踪中不再有“>16KB 输出秒”。
  3. 保证 24kbps 到每台普通 PC,24kbps 到 Linux 服务器随时。(如有必要,8bkps 留作开销)。IOW,5 个(伪)“频段”,每个频段 24kbps。
  4. 如果有任何 PC 未使用其全频带,则在其余传输 PC 之间公平共享空闲带宽
  5. 优先处理某些数据包(DNS 查找、控制数据包),优先处理其他数据包(洪流!!!),在每个频段内,不影响其他频段。

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

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

... 等等。

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

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

Yan*_*rez 4

假设 eth0 是到 Cisco 路由器的 100mbit 以太网连接,它应该是这样的(是 n\xe2\x80\x99t 吗?):

\n\n
tc qdisc add dev eth0 root handle 1: htb default 2\n# 100 mbps\ntc class add dev eth0 parent 1: classid 1:1 htb rate 100mbit\n# To LAN traffic\ntc class add dev eth0 parent 1:1 classid 1:2 htb rate 99000kbit ceil 100mbit\n# IN traffic\ntc class add dev eth0 parent 1:1 classid 1:3 htb rate 120kbit\n# OUT traffic\ntc class add dev eth0 parent 1:1 classid 1:4 htb rate 120kbit\n\n# IN \xe2\x80\x9cbands\xe2\x80\x9d (one for each PC)\ntc class add dev eth0 parent 1:3 classid 1:10 htb rate 24kbit ceil 120kbit\ntc class add dev eth0 parent 1:3 classid 1:11 htb rate 24kbit ceil 120kbit\ntc class add dev eth0 parent 1:3 classid 1:12 htb rate 24kbit ceil 120kbit\ntc class add dev eth0 parent 1:3 classid 1:13 htb rate 24kbit ceil 120kbit\ntc class add dev eth0 parent 1:3 classid 1:14 htb rate 24kbit ceil 120kbit\n\n# OUT \xe2\x80\x9cbands\xe2\x80\x9d (one for each PC)\ntc class add dev eth0 parent 1:4 classid 1:15 htb rate 24kbit ceil 120kbit\ntc class add dev eth0 parent 1:4 classid 1:16 htb rate 24kbit ceil 120kbit\ntc class add dev eth0 parent 1:4 classid 1:17 htb rate 24kbit ceil 120kbit\ntc class add dev eth0 parent 1:4 classid 1:18 htb rate 24kbit ceil 120kbit\ntc class add dev eth0 parent 1:4 classid 1:19 htb rate 24kbit ceil 120kbit\n
Run Code Online (Sandbox Code Playgroud)\n\n

会给我这样的东西:

\n\n
+-----------------------------------------------------------+\n|                      100 mbits (1:1)                      |\n+---------+------------------------+------------------------+\n| 99mbits |   120 kbits In (1:3)   |  120 kbits Out(1:4)    |\n+  (1:2)  +----+----+----+----+----+----+----+----+----+----+\n+---------+ PC1| PC2| PC3| PC4| PC5| PC1| PC2| PC3| PC4| PC5|\n          |1:10|1:11|1:12|1:13|1:14|1:15|1:16|1:17|1:18|1:19|\n          +----+----+----+----+----+----+----+----+----+----+\n
Run Code Online (Sandbox Code Playgroud)\n\n

对于每个乐队:

\n\n
# PC1, IN\ntc qdisc add dev eth0 parent 1:10 handle 20: prio\ntc qdisc add dev eth0 parent 20:1 handle 22: sfq perturb 10\ntc qdisc add dev eth0 parent 20:2 handle 23: sfq perturb 10\ntc qdisc add dev eth0 parent 20:3 handle 24: sfq perturb 10\n\n# PC1, OUT\ntc qdisc add dev eth0 parent 1:15 handle 21: prio\ntc qdisc add dev eth0 parent 21:1 handle 25: sfq perturb 10\ntc qdisc add dev eth0 parent 21:2 handle 26: sfq perturb 10\ntc qdisc add dev eth0 parent 21:3 handle 27: sfq perturb 10\n\n+--------------------++--------------------+\n|       PC1 IN       ||      PC1 OUT       |\n+--------------------++--------------------+\n|     PRIO (20:0)    ||     PRIO (21:0)    |\n|      |      |      ||      |      |      |\n| Prio | Prio | Prio || Prio | Prio | Prio |\n|   1  |   2  |   3  ||   1  |   2  |   3  |\n|(20:1)|(20:2)|(20:3)||(21:1)|(21:2)|(21:3)|\n+------+------+------++------+------+------+\n|  SFQ |  SFQ |  SFQ ||  SFQ |  SFQ |  SFQ |\n|(22:0)|(23:0)|(24:0)||(25:0)|(26:0)|(27:0)|\n+------+------+------++------+------+------+\n
Run Code Online (Sandbox Code Playgroud)\n\n

等等。

\n\n

规则应该是这样的

\n\n
# PC1, OUT\ntc filter add dev eth0 protocol ip parent 1:0 prio 1 handle 1 fw flowid 21:1\ntc filter add dev eth0 protocol ip parent 1:0 prio 1 handle 2 fw flowid 21:2\ntc filter add dev eth0 protocol ip parent 1:0 prio 1 handle 3 fw flowid 21:3\n\n# PC1, IN\ntc filter add dev eth0 protocol ip parent 1:0 prio 1 handle 16 fw flowid 20:1\ntc filter add dev eth0 protocol ip parent 1:0 prio 1 handle 17 fw flowid 20:2\ntc filter add dev eth0 protocol ip parent 1:0 prio 1 handle 18 fw flowid 20:3\n
Run Code Online (Sandbox Code Playgroud)\n\n

等等。

\n\n

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

\n