不幸的是,我在系统管理和配置 Linux 系统方面没有太多经验,所以请不要对我太苛刻;我还在学习;)

网络设置:

172.21.0.1-具有流量整形的服务器。

172.21.0.2-第二台服务器,存储客户端通过 HTTP 请求的文件。

172.21.0.6 和 172.21.0.7 – 两个客户端设备。

我正在尝试为 WireGuard 客户端配置流量整形:

tc qdisc add dev wg0 parent root handle 1:0 hfsc default 10

# Root class
tc class add dev wg0 parent 1: classid 1:1 hfsc sc rate 1gbit ul rate 1gbit

# Reserved traffic
# Guaranteed bandwidth of 500 Mbit/s and a maximum of 1 Gbit/s
tc class add dev wg0 parent 1:1 classid 1:10 hfsc sc rate 500mbit ul rate 1gbit

# Client traffic
# Guaranteed bandwidth of 500 Mbit/s and a maximum of 1 Gbit/s
tc class add dev wg0 parent 1:1 classid 1:20 hfsc sc rate 500mbit ul rate 1gbit

# Shaping for individual client 6
tc class add dev wg0 parent 1:20 classid 1:3006 hfsc sc rate 100kbit ul rate 100kbit
tc filter add dev wg0 protocol ip parent 1:0 prio 1 u32 match ip dst 172.21.0.6/32 flowid 1:3006

# Shaping for individual client 7
tc class add dev wg0 parent 1:20 classid 1:3007 hfsc sc rate 100kbit ul rate 100kbit
tc filter add dev wg0 protocol ip parent 1:0 prio 1 u32 match ip dst 172.21.0.7/32 flowid 1:3007

tc -pretty 过滤器显示 dev wg0

filter parent 1: protocol ip pref 2 u32 chain 0
filter parent 1: protocol ip pref 2 u32 chain 0 fh 800: ht divisor 1
filter parent 1: protocol ip pref 2 u32 chain 0 fh 800::801 order 2049 key ht 800 bkt 0 *flowid 1:3006 not_in_hw
  match IP dst 172.21.0.6/32
filter parent 1: protocol ip pref 2 u32 chain 0 fh 800::802 order 2050 key ht 800 bkt 0 *flowid 1:3007 not_in_hw
  match IP dst 172.21.0.7/32

tc-graph 类显示 dev wg0

+---(1:) hfsc
     +---(1:1) hfsc sc m1 0bit d 0us m2 1Gbit ul m1 0bit d 0us m2 1Gbit
          +---(1:10) hfsc sc m1 0bit d 0us m2 500Mbit ul m1 0bit d 0us m2 1Gbit
          +---(1:20) hfsc sc m1 0bit d 0us m2 500Mbit ul m1 0bit d 0us m2 1Gbit
               +---(1:3007) hfsc sc m1 0bit d 0us m2 100Kbit ul m1 0bit d 0us m2 100Kbit
               +---(1:3006) hfsc sc m1 0bit d 0us m2 100Kbit ul m1 0bit d 0us m2 100Kbit
          |
     |    |

当尝试同时从两个客户端下载文件时,只有一个获得 100kbit,而另一个获得 0kbit 🙁

我做错了什么?服务器:在 KVM 上运行的 Debian 12。

PS:100kbit/s 的限制只是为了测试流量整形器的功能。

我也希望得到有关如何重写配置的建议。也许我的做法完全错误,也许有更优化的方法(例如为整个子网设置一个类,这样所有 WireGuard 客户端都会获得单独的 100kbit 限制)。

6

  • 在我看来,表面上看起来还不错。尝试将 -s 传递给 gets stats,看看您的数据包是否确实传递到了正确的类别。此外,是否有任何一个客户端都在获取带宽?即,如果您只使用其中一个客户端,它们会获得 100kbit 的带宽,而另一个则不会?如果您分别尝试两个客户端,它们会起作用吗?


    – 


  • @MatthewIfe class hfsc 1:3007 发送了 238792 字节,class hfsc 1:3006 发送了 21319698 字节。根据这些信息,一切似乎都很好。但是,我尝试在第一个配置文件上开始下载文件:显示速度为 100 kbps。我在第二个配置文件上开始下载:第一个配置文件上的速度消失了,第二个配置文件上显示 100 kbps。


    – 

  • 现在我注意到,即使我删除所有 TC 规则,整个可用通道也只会分配给一个最先开始下载的客户端。但在一个客户端中的多个下载之间,带宽是均等共享的。


    – 


  • 通过将网络服务器替换为另一个来排除该服务。


    – 

  • @MatthewIfe 你说得完全正确。问题不在于 tc 那边。我的规则是正确的,我认为这个帖子可以帮助某些人。


    – 


最佳答案
1

在我看来,您的规则表面上看起来没有问题。

尝试传递-stc获取统计数据并查看您的数据包是否实际传递到正确的类别。

您应该测试整个网络链的行为,看看是否可以隔离发生问题的条件。

  • 如果您只使用一个客户端,他们会获得 100kbit 位,而另一个却不会?
  • 如果您分别尝试这两种方法,它们会起作用吗?

考虑更换您的棒子的其他区域来消除这些问题,比如任何具有其自身限制的网络服务器。