Linux htb 的流量优先级不起作用,为什么?

Linux htb 的流量优先级不起作用,为什么?

我是 Linux QoS 新手,我正在尝试通过参考 lartc.org 上的文档来了解它的工作原理。

我的第一个目标很简单:我想为 UDP 传出流量分配更高的优先级,但由于某种原因,它不起作用。

这是我目前的进展:

#!/bin/bash

IPTABLES=/usr/sbin/iptables
TC=/usr/sbin/tc

# All traffic is given an iptables MARK depending on its type:
#   * 10 for low latency traffic (all UDP traffic)
#   * 20 anything else

# all traffic
$IPTABLES -t mangle -A PREROUTING -i eth0 -j MARK --set-mark 20
# udp 
$IPTABLES -t mangle -A PREROUTING -i eth0 -p udp -j MARK --set-mark 10

# root qdisc
$TC qdisc add dev eth0 root handle 1: htb
# overall rate limits (1Mbps outgoing)
$TC class add dev eth0 parent 1: classid 1:1 htb rate 1Mbit
# UDP
$TC class add dev eth0 parent 1:1 classid 1:10 htb rate 512kbit ceil 1Mbit prio 0
# everything else
$TC class add dev eth0 parent 1:1 classid 1:20 htb rate 512kbit ceil 1Mbit prio 1

# do fair shaping in each class
$TC qdisc add dev eth0 parent 1:10 handle 10: sfq perturb 10
$TC qdisc add dev eth0 parent 1:20 handle 20: sfq perturb 10

# divert traffic marked by iptables into each class
$TC filter add dev eth0 parent 1:0 protocol ip handle 10 fw flowid 1:10
$TC filter add dev eth0 parent 1:0 protocol ip handle 20 fw flowid 1:20 

iptables 规则似乎没有问题:

$ sudo /usr/sbin/iptables -L -t mangle
Chain PREROUTING (policy ACCEPT)
target     prot opt source               destination         
MARK       all  --  anywhere             anywhere            MARK set 0x14 
MARK       udp  --  anywhere             anywhere            MARK set 0xa 

但据我所知,我没有得到预期的结果。这是我的检查方法:

$ sudo /usr/sbin/tc -s qdisc show     
qdisc htb 1: dev eth0 root refcnt 2 r2q 10 default 0 direct_packets_stat 190646
 Sent 73059945 bytes 190646 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0 
qdisc sfq 10: dev eth0 parent 1:10 limit 127p quantum 1514b perturb 10sec 
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0 
qdisc sfq 20: dev eth0 parent 1:20 limit 127p quantum 1514b perturb 10sec 
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0 

看到已发送字节数的计数器为0。

因此,要么我的脚本存在一些问题,要么它可以工作,但我使用了错误的方式来显示统计数据。

以下是我的问题:

  1. 我的脚本有什么问题?
  2. 除了使用“tc show”显示统计数据之外,还有其他方法可以调试 htb 规则吗?

答案1

您的接口通向哪个方向?您已将 HTB 队列应用于 eth0,如果 eth0 是您的外部接口,这很有意义。但是,您使用 iptables 将 fwmark 附加到到达 eth0 的数据包,而不是传出的数据包——您可能需要在 iptables 行中将 -i 替换为 -o。否则,您将标记应用于一个方向的数据包,并寻找标记来过滤另一个方向的数据包。显然,传入的数据包永远不会到达传出过滤器,所以这就是您的计数器全部显示零的原因。

相关内容