web-dev-qa-db-ja.com

この「tcフィルター」ルールがトラフィックを意図したとおりに分類しないのはなぜですか?

ローカルネットワーク内のすべてのマシンの最大入力帯域幅を3Mbpsに制限するように、いくつかの基本的なトラフィック分類を構成しようとしています。ゲートウェイ192.168.2.1を操作しています。ここでは、インターフェイスeth1がスイッチに接続され、192.168.2.0/24のホストにインターネット接続を提供しています。

分類は単純です。入力トラフィックは2つのクラスに分類され、最初のクラス1:20はデフォルトでフォールバックとして未分類のトラフィック用であり、2番目のクラス1:30は入力帯域幅を3Mbpsに制限します。次に、tc filterを使用して、すべてのホストから発信されたトラフィックをクラス1:30として分類します。

# Clear the qdisc first.
tc qdisc del root dev eth1

# Set a HTB qdisc on the root, and use class 1:20 by default
tc qdisc add dev eth1 root handle 1: htb default 20

# Create class 1:1, limit the total ingress bandwidth to 8 Mbps.
tc class add dev eth1 parent 1: classid 1:1 htb rate 8mbit burst 15k

# Class 1:20
tc class add dev eth1 parent 1:1 classid 1:20 htb rate 5mbit ceil 5.5mbit burst 15k

# Class 1:30
tc class add dev eth1 parent 1:1 classid 1:30 htb rate 3mbit ceil 4mbit burst 15k

# Attach fq_codel w/ ECN on each class to control latency / bufferbloat.
tc qdisc add dev eth1 parent 1:20 handle 20: fq_codel ecn
tc qdisc add dev eth1 parent 1:30 handle 30: fq_codel ecn

# Match the LAN range and classify them as class 1:30
tc filter add dev eth1 parent 1: protocol ip prio 2 u32 match ip src 192.168.2.0/24 flowid 1:30

ただし、ルールは意図したとおりに機能しません。ホストのダウンロード速度は、1:20ではなく、1:30で指定されたより高い帯域幅です。私の間違いは何ですか?

1
ConfusedUser001

あなたのカーネルバージョンは何ですか?

私は似たようなものを設定しようとしていますが、カーネルdebian4.15.0-23-genericが壊れていると強く感じています。問題はHTB自体ではなく、正しいclassidフローのパケットの分類にあります。

この教育的な例でさえ失敗します:

tc qdisc add dev int0 root handle 1:0 htb r2q 100000 default 13
tc class add dev int0 parent 1:0 classid 1:1 htb rate 10Gbit
tc class add dev int0 parent 1:1 classid 1:11 htb rate 1Gbit ceil 2Gbit
tc class add dev int0 parent 1:1 classid 1:12 htb rate 1Gbit ceil 2Gbit
tc class add dev int0 parent 1:1 classid 1:13 htb rate 1Gbit ceil 2Gbit

いつ

tc -s -d filter show dev int0

ご覧のとおり、すべてのパケットが1:13を正しく通過します

しかし、あなたがそうするなら

iptables -t mangle -A POSTROUTING -j MARK --set-mark 11
tc filter add dev int0 parent 1:0 protocol ip handle 11 fw flowid 1:12

奇妙な方法で動作し、数分ごとに数パケットだけが期待どおりに通過し、他のパケットは依然としてデフォルトを通過します

分類しようとする次の例:

ipset create SHAPER4 hash:net family inet skbinfo
ipset add SHAPER4 10.0.0.0/8 skbprio 1:12
iptables -t mangle -A POSTROUTING -j SET --map-set SHAPER4 src,dst --map-prio

同じように機能します(前の例よりも統計的に多くのパケットが正しく処理されるようです)

ログにエラーや警告はありません。このように機能します

tc -s -d class show dev int0

class htb 1:13 parent 1:1 prio 0 quantum 1250 rate 1Gbit ceil 10Gbit 
linklayer ethernet burst 1375b/1 mpu 0b overhead 0b cburst 0b/1 mpu 0b 
overhead 0b level 0
 Sent 74139067325 bytes 53655936 pkt (dropped 0, overlimits 48986938 requeues 0)
backlog 0b 0p requeues 0
lended: 41808373 borrowed: 11847563 giants: 0
tokens: -81 ctokens: -4

class htb 1:11 parent 1:1 prio 0 quantum 1000 rate 10Mbit ceil 100Mbit 
linklayer ethernet burst 1600b/1 mpu 0b overhead 0b cburst 1600b/1 mpu 0b overhead 0b level 0
Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0)
backlog 0b 0p requeues 0
lended:  borrowed: 0 giants: 0
tokens: 20000 ctokens: 20000

class htb 1:12 parent 1:1 prio 0 quantum 1000 rate 5Mbit ceil 30Mbit 
linklayer ethernet burst 1600b/1 mpu 0b overhead 0b cburst 1593b/1 mpu 0b 
overhead 0b level 0
Sent 4704 bytes 48 pkt (dropped 0, overlimits 0 requeues 0)
backlog 0b 0p requeues 0
lended: 48 borrowed: 0 giants: 0
tokens: 37550 ctokens: 6247

ここにカーネルネットワーク開発者がいますか?

私はそれを報告する前に他のバージョンを試します:)

2
Tomáš Šimek

tcはアップロード時に動作しています。したがって、入力トラフィックを形成する場合は、LANインターフェイスにルールを配置する必要があります。

それがあなたがしていることであると仮定すると、あなたのルールはソースではなく宛先192.168.2.0/24と一致するはずです。

0
Sanael