web-dev-qa-db-ja.com

トラフィックシェーピング:HTBクラスに接続されたtcフィルター?

TcフィルターをHTBqdiscではなくHTBクラスにアタッチできますか?

例えば:

tc class add dev $IF_LAN parent 1:100 classid 1:180 htb rate 19kbit ceil 2000kbit prio 4

どこ:

 1:100 -> Is an HTB inner class.

この質問は、エラーをスローせずにクラスにtc filterをアタッチできるという事実から生じますが、後でtc統計を見ると、フィルタリングが行われていないことに気付きました。

前もって感謝します。

EDIT: tc手動tc-filter構文で見つかりました:

tc  filter  [  add  |  change  | replace ] dev DEV [ parent qdisc-id | root ] protocol prootocol prio priority filtertype [ filtertype specific parameters ] flowid flow-id

(関連する部分は親qdisc-id

だから、私はqdiscにフィルターを取り付けることしかできませんか、それとも回避策がありますか?

4
diosney

可能であれば、次のものを使用します。

/sbin/tc qdisc add dev $DEV root handle 1: htb default 1
/sbin/tc class add dev $DEV parent 1: classid 1:3 htb rate $RATE burst $BURST
/sbin/tc filter add dev $DEV parent 1:0 protocol ip prio 1 u32 match ip src $IP flowid 1:3

3行目は、2行目で定義されたクラスにフィルターをアタッチします(classid 1:3およびflowid 1:3)。

3
Christoph Wurm

可能です。 tc(8)manは包括的ではないと思います。

man7.org/tc(8) からの引用:

tcフィルター
tcフィルターがクラスにアタッチされている場合、関連する手順について最初に参照されます。フィルタは、パケットヘッダーのすべてのフィールド、およびipchainsまたはiptablesによって適用されるファイアウォールマークに一致する可能性があります。

Linux 5.0.3-zen1-2-zenラップトップをチェックしたところ、動作します。

lang-bash
Sudo tc qdisc add dev enp3s0 root handle 1: htb default 10
# inner class
Sudo tc class add dev enp3s0 parent 1: classid 1:1 htb rate 100kbps
# leaf classes
Sudo tc class add dev enp3s0 parent 1:1 classid 1:10 htb rate 100kbps
Sudo tc class add dev enp3s0 parent 1:1 classid 1:20 htb rate 100kbps
Sudo tc class add dev enp3s0 parent 1:1 classid 1:30 htb rate 100kbps

Sudo tc filter add dev enp3s0 parent 1: protocol ip matchall flowid 1:1
Sudo tc filter add dev enp3s0 parent 1:1 u32 match ip dst 192.168.1.6 flowid 1:30

ping -c1 192.168.1.6
ping -c2 192.168.1.1
Sudo tc -s -g class show dev enp3s0 
Sudo tc -s filter show dev enp3s0 parent 1:
Sudo tc -s filter show dev enp3s0 parent 1:1

最初のフィルターの親はqdiscであり、flowidを内部クラス1:1に設定します。 2番目のフィルターの親は内部クラス1:1であり、リーフクラス1:30を選択して最終的な判定を行います。

最後の3つのコマンドの出力:

$ Sudo tc -s -g class show dev enp3s0 
+---(1:1) htb rate 800Kbit ceil 800Kbit burst 1600b cburst 1600b 
     |    Sent 294 bytes 3 pkt (dropped 0, overlimits 0 requeues 0) 
     |    backlog 0b 0p requeues 0
     |
     +---(1:10) htb prio 0 rate 800Kbit ceil 800Kbit burst 1600b cburst 1600b 
     |          Sent 196 bytes 2 pkt (dropped 0, overlimits 0 requeues 0) 
     |          backlog 0b 0p requeues 0
     |     
     +---(1:20) htb prio 0 rate 800Kbit ceil 800Kbit burst 1600b cburst 1600b 
     |          Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) 
     |          backlog 0b 0p requeues 0
     |     
     +---(1:30) htb prio 0 rate 800Kbit ceil 800Kbit burst 1600b cburst 1600b 
                Sent 98 bytes 1 pkt (dropped 0, overlimits 0 requeues 0) 
                backlog 0b 0p requeues 0


$ Sudo tc -s filter show dev enp3s0 parent 1:
filter protocol ip pref 49152 matchall chain 0 
filter protocol ip pref 49152 matchall chain 0 handle 0x1 flowid 1:1 
  not_in_hw
$ Sudo tc -s filter show dev enp3s0 parent 1:1
filter protocol all pref 49152 u32 chain 0 
filter protocol all pref 49152 u32 chain 0 fh 800: ht divisor 1 
filter protocol all pref 49152 u32 chain 0 fh 800::800 order 2048 key ht 800 bkt 0 flowid 1:30 not_in_hw  (rule hit 3 success 1)
  match c0a80106/ffffffff at 16 (success 1 ) 

See: resulting qdisc represented as graph

注:内部クラスでペアレント化されたフィルターを機能させるには、内部クラスを参照する必要があります(classidまたはflowidを使用)上位レベルの内部クラスまたはqdiscからのフィルターによって、つまりチェーンqdisc --filter--> inner class --filter--> leaf classを保持します。

また、htb defaultがリーフクラスに設定されていることを確認してください。

1
Dawer