为什么这个 TC 脚本不起作用

为什么这个 TC 脚本不起作用

我们的应用有三类流量,每类流量涉及三个端口。我们想通过 TC 按端口号限制流量,所以我写了一个简单的 TC 脚本进行测试,但是脚本并没有像我预期的那样工作。

下面是我设置TC的shell命令,预期的结果是SecureCRT和Apache(SecureCRT使用22端口,Apache使用80端口)的下载速度会被限制在100K/S,但实际的结果是下载速度没有变化,大概在5MB/s左右。

   tc qdisc del dev eth0 root
   tc qdisc add dev eth0 root handle 1:0 cbq bandwidth 1Mbit avpkt 1000 cell 8

   tc class add dev eth0 parent 1:0 classid 1:1 cbq bandwidth 1Mbit rate 1Mbit 
   weight 100kbit prio 5 allot 1514 cell 8 maxburst 20 avpkt 1000 bounded

   tc class add dev eth0 parent 1:0 classid 1:2 cbq bandwidth 1Mbit rate 1Mbit
   weight 100kbit prio 5 allot 1514 cell 8 maxburst 20 avpkt 1000 bounded

   tc class add dev eth0 parent 1:0 classid 1:3 cbq bandwidth 1Mbit rate 1Mbit
   weight 100kbit prio 5 allot 1514 cell 8 maxburst 20 avpkt 1000 bounded


   tc class add dev eth0 parent 1:1 classid 1:1001 cbq bandwidth 1Mbit rate 
   800kbit weight 80kbit prio 8 allot 1514 cell 8 maxburst 20 avpkt 1000
   tc qdisc add dev eth0 parent 1:1001 handle 1001: sfq

   tc class add dev eth0 parent 1:1 classid 1:1002 cbq bandwidth 1Mbit rate
   800kbit weight 80kbit prio 8 allot 1514 cell 8 maxburst 20 avpkt 1000
   tc qdisc add dev eth0 parent 1:1002 handle 1002: sfq

   tc class add dev eth0 parent 1:1 classid 1:1003 cbq bandwidth 1Mbit rate 
   800kbit weight 80kbit prio 8 allot 1514 cell 8 maxburst 20 avpkt 1000
   tc qdisc add dev eth0 parent 1:1003 handle 1003: sfq


   tc class add dev eth0 parent 1:2 classid 1:2001 cbq bandwidth 1Mbit rate
    800kbit weight 80kbit prio 8 allot 1514 cell 8 maxburst 20 avpkt 1000
   tc qdisc add dev eth0 parent 1:2001 handle 2001: sfq

   tc class add dev eth0 parent 1:2 classid 1:2002 cbq bandwidth 1Mbit rate
      800kbit weight 80kbit prio 8 allot 1514 cell 8 maxburst 20 avpkt 1000
   tc qdisc add dev eth0 parent 1:2002 handle 2002: sfq

   tc class add dev eth0 parent 1:2 classid 1:2003 cbq bandwidth 1Mbit rate 
      800kbit weight 80kbit prio 8 allot 1514 cell 8 maxburst 20 avpkt 1000
   tc qdisc add dev eth0 parent 1:2003 handle 2003: sfq


   tc class add dev eth0 parent 1:3 classid 1:3001 cbq bandwidth 1Mbit rate
      800kbit weight 80kbit prio 8 allot 1514 cell 8 maxburst 20 avpkt 1000
   tc qdisc add dev eth0 parent 1:3001 handle 3001: sfq

   tc class add dev eth0 parent 1:3 classid 1:3002 cbq bandwidth 1Mbit rate
     800kbit weight 80kbit prio 8 allot 1514 cell 8 maxburst 20 avpkt 1000
   tc qdisc add dev eth0 parent 1:3002 handle 3002: sfq

   tc class add dev eth0 parent 1:3 classid 1:3003 cbq bandwidth 1Mbit rate
     800kbit weight 80kbit prio 8 allot 1514 cell 8 maxburst 20 avpkt 1000
   tc qdisc add dev eth0 parent 1:3003 handle 3003: sfq

   tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip sport 
             80 0xffff flowid 1:3001
   tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip sport
             22 0xffff flowid 1:3002

答案1

您不能对流量进行分类,然后使用整形或延迟“传入”流量或ingress这也是人们经常称呼它的原因。此图取自LARTC 文件

 Userspace programs
                     ^
                     |
     +---------------+-----------------------------------------+
     |               Y                                         |
     |    -------> IP Stack                                    |
     |   |              |                                      |
     |   |              Y                                      |
     |   |              Y                                      |
     |   ^              |                                      |
     |   |  / ----------> Forwarding ->                        |
     |   ^ /                           |                       |
     |   |/                            Y                       |
     |   |                             |                       |
     |   ^                             Y          /-qdisc1-\   |
     |   |                            Egress     /--qdisc2--\  |
  --->->Ingress                       Classifier ---qdisc3---- | ->
     |   Qdisc                                   \__qdisc4__/  |
     |                                            \-qdiscN_/   |
     |                                                         |
     +----------------------------------------------------------+

Linux 有简单的入口队列规定,但由于没有入口队列,因此功能非常有限。但可以使用IMQ device(中间队列设备)来解决这个问题,它可以“模拟”入口排队。

此外,当您的服务器充当路由器(启用 IP 转发)时,您可以调整/延迟传入流量。如果服务器有两个网络接口 - 例如用于 Internet 访问的 eth0 和用于本地网络访问的 eth1 - 并且来自本地网络的客户端正在下载某些内容,那么此流量在 eth0 接口上传入/进入,在 eth1 接口上传出/传出。因此,如果您在 eth1 接口上定义 QoS 策略,它将起作用。

最后,我建议您切换到htbqdisc,因为cbq它更准确(它使用TBF或不依赖于接口特性的令牌桶过滤器)。

相关内容