使用Linux htb进行stream量优先化不起作用,为什么?

我是一个Linux的QoS新手,我试图通过使用lartc.org的文档作为参考来了解它是如何工作的。

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

这是我目前的进展:

#!/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”显示统计信息之外,还有其他方法可以debugginghtb规则吗?

你的界面走哪条路? 你有你的HTB队列应用到eth0,这是有道理的,如果eth0是你的外部接口。 但是,您将iptables的fwmark附加到到达eth0的数据包,而不是出去 – 您可能需要在iptables行中交换-i作为-o。 否则,你正在对数据包进行单向标记,并寻找标记,以便以另一种方式过滤数据包。 显然,传入的数据包将永远不会到达传出filter,所以这就是为什么你的计数器都是零。