web-dev-qa-db-ja.com

Linux htbを使用したトラフィックの優先順位付けが機能しないのはなぜですか?

私はLinuxQoSの初心者であり、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. 統計を表示するために「tcshow」を使用する以外に、htbルールをデバッグする他の方法はありますか?
2
SteveBarr

あなたのインターフェースはどちらに向かっていますか? HTBキューがeth0に適用されています。これは、eth0が外部インターフェイスである場合に意味があります。ただし、出力ではなくeth0に到着するパケットに、iptablesを使用してfwmarkをアタッチします。おそらく、iptables行で-iを-oに交換する必要があります。それ以外の場合は、一方向に進むパケットにマークを適用し、反対方向に進むパケットをフィルタリングするためのマークを探します。明らかに、着信パケットが発信フィルターにヒットすることはないため、カウンターはすべてゼロと表示されます。

1
techieb0y