![为什么这个 TC 脚本不起作用](https://linux22.com/image/804399/%E4%B8%BA%E4%BB%80%E4%B9%88%E8%BF%99%E4%B8%AA%20TC%20%E8%84%9A%E6%9C%AC%E4%B8%8D%E8%B5%B7%E4%BD%9C%E7%94%A8.png)
我们的应用有三类流量,每类流量涉及三个端口。我们想通过 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 策略,它将起作用。
最后,我建议您切换到htb
qdisc,因为cbq
它更准确(它使用TBF
或不依赖于接口特性的令牌桶过滤器)。