web-dev-qa-db-ja.com

tc u32 ---最近のカーネルでL2プロトコルを一致させる方法は?

Linuxブリッジで構築された、ハッシュフィルタリングを備えたNiceシェーパーを持っています。つまり、br0externalおよびinternal物理インターフェースを接続し、VLANタグ付きパケットは「透過的に」ブリッジされます(つまり、VLANインターフェースがあります)。

現在では、カーネルによって方法が異なります。カーネルバージョンの正確な範囲が間違っている可能性があります。ご容赦ください。ありがとう。

2.6.26

したがって、debianでは2.6.26以上(2.6.32まで、と思います)---これは機能します。

tc filter add dev internal protocol 802.1q parent 1:0 prio 100 \
    u32 ht 1:64 match ip dst 192.168.1.100 flowid 1:200

ここで、「カーネル」は「プロトコル」フィールドの2バイトと0x8100を照合しますが、IPパケットの先頭を「ゼロ位置」としてカウントします(少し不明確な場合は、私の英語では申し訳ありません)。

2.6.32

繰り返しますが、debianでは(私はVanillaカーネルを構築していません)、2.6.32-5 ---これは機能します。

tc filter add dev internal protocol 802.1q parent 1:0 prio 100 \
    u32 ht 1:64 match ip dst 192.168.1.100 at 20 flowid 1:200

ここで、「カーネル」はプロトコルと同じに一致しますが、このプロトコルのヘッダーの先頭からのオフセットをカウントします---オフセットに4バイトを追加する必要があります(dstアドレスの16ではなく20)。それは私にとっては大丈夫です、より論理的なようです。

3.2.11、最新の安定版

これは機能します--- 802.1qタグがまったくないかのように:

tc filter add dev internal protocol ip parent 1:0 prio 100 \
    u32 ht 1:64 match ip dst 192.168.1.100 flowid 1:200

問題は、今のところ802.1qタグを照合する方法が見つからなかったことです。

過去の802.1qタグとの一致

以前は次のようにすることができます。

tc filter add dev internal protocol 802.1q parent 1:0 prio 100 \
    u32 match u16 0x0ed8 0x0fff at -4 flowid 1:300

これで、802.1qタグをat 0at -2at -4at -6などと一致させることができなくなりました。私がゼロにしている主な問題hitscount---このフィルタは、「間違ったプロトコル」、つまり、まったくチェックされていません。

誰か、助けてください:-)

ありがとう!

12
brownian

最近のカーネルでは、VLANタグはskbから削除されています。 skbでメタマッチを行うには、次のようなものを試してください。

tc filter add dev internal protocol all parent 1:0 prio 100 basic match 'meta(vlan mask 0xfff eq 0x0ed8)' flowid 1:300
4
Thusitha

私はまさにこれをしなければなりませんでした。 @Thusithaによって提案された答えは、新しいカーネルに対してそれを行う正しい方法であることがわかりました。

Debian wheezyカーネル3.2.0-4およびiproute(tcコマンドの取得元)バージョン20120521-3 + b3でテスト済み

これが完全なスクリプト、tc filter行は、@ Thusithaによって指定されたものとほぼ同じです。

function qos() {
    if="$1"
    vlan1="$2"
    vlan2="$3"

    # delete previous
    tc qdisc del dev $if root >/dev/null 2>&1
    tc qdisc del dev $if ingress >/dev/null 2>&1

    # Root HTB for $if
    tc qdisc add dev $if root handle 1: htb r2q 1 default 1

    # Root class to borrow from
    tc class add dev $if parent 1: classid 1:1 htb quantum 1000000 rate 500mbit ceil 500mbit burst 64k prio 2
    tc qdisc add dev $if parent 1:1 handle 101 sfq perturb 10

    # class for vlan1
    tc class add dev $if parent 1:1 classid 1:106 htb quantum 1000000 rate 1.00mbit ceil 1.00mbit burst 6k
    tc qdisc add dev $if parent 1:106 handle 107 sfq perturb 10
    tc filter add dev $if protocol all parent 1: prio 100 basic match "meta(vlan mask 0xfff eq ${vlan1})" flowid 1:106

    # class for vlan2
    tc class add dev $if parent 1:1 classid 1:108 htb quantum 1000000 rate 1.00mbit ceil 10.00mbit burst 6k
    tc qdisc add dev $if parent 1:108 handle 108 sfq perturb 10
    tc filter add dev $if protocol all parent 1: prio 100 basic match "meta(vlan mask 0xfff eq ${vlan2})" flowid 1:108

}

qos eth1 1234 1235
qos eth2 2345 2346
3
Nick Craig-Wood

私は、wiresharkを使用して、ユーザー空間に表示されるようにインターフェイスを通過するものをキャプチャし、それを使用してフィルターを作成することをお勧めします。インターフェイスが何らかの理由でVLANタグを削除しているのではないかと思います(透過的にブリッジするように構成されているにもかかわらず)。おそらく、追加のタグか何かを追加していますか?

1
Falcon Momot

Vlan packtesは ebtables でマークできます。

# mark packets according to the vlan id
ebtables -i br0 -A PREROUTING -p 802_1Q --vlan-id 1 -j mark --mark-set 1
ebtables -i br0 -A PREROUTING -p 802_1Q --vlan-id 5 -j mark --mark-set 2

次に、マーキングに基づいてシェーピングを適用します。 ebtablesとiptablesは同じマーキングを共有します。

これはまだ自分で行っていません。したがって、かなり直感的です。

1
rhasti