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


12

ハッシュフィルタリングを備えた、Linuxブリッジで構築された素晴らしいシェーパーがあります。要するに、br0接続externalinternal物理インターフェース、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

ここで、「カーネル」は0x8100の「プロトコル」フィールドの2バイトに一致しますが、IPパケットの先頭を「ゼロ位置」としてカウントします(少し不明瞭な場合は英語でごめんなさい)。

2.6.32

繰り返しますが、debian(私はバニラカーネルを構築していません)では、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またはそのような。ヒットがゼロであるという主な問題---このフィルターはまったくチェックされていません。つまり、「間違ったプロトコル」です。

誰でも助けてください:-)

ありがとう!

回答:


4

最近のカーネルでは、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

ルートフィルタを追加しようとすると、protocol all私に与えますRTNETLINK answers: Invalid argument(ここでは3.3.4カーネルを)。これを新しいカーネルでテストします。ありがとうございました。
ブラウニアン

これは、debian wheezyカーネル3.2.0でうまくいきました。完全な詳細を含む別の回答を追加しました。
ニッククレイグウッド

3

私はまさにこれをしなければなりませんでした。@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

奇妙なことに、protocol allバニラカーネルでエラーが発生しました。もっと確認する必要があります。ありがとうございました。
ブラウニアン

1

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


いいえ、VLANタグを除去するわけではありません。シェーパーのフィルターを除き、すべてが機能します(トラフィックはハードウェアスイッチのトランクを介して切り替えられます)。ただし、詳しく見ていきます。VLANタグオフロード機能を調べましたが、これらのドライバーはvidオフロードを実行できません。
ブラウニアン

tcpdumpすべてのインターフェイスbridgeとポートでVLAN IDを表示します。
ブラウニアン

今、私の素敵なシェイパーは、Linuxカーネル3.3.4で動作します。8021qタグフィルタリングを除き、すべてが正常に動作します(これなしでも動作します)。問題は未解決のままです。ともあれ、ありがとう。
ブラウニアン

1

vlan packtesでマークできます 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は同じマーキングを共有します。

まだ自分でやっていません。だから、むしろ予感。


10Gbリンクではスムーズに動作するのではないかと思います。*テーブルは避けたいと思います。とにかく提案をありがとう。
ブラウニアン

@brownianは、iproute2でまったく同じフィルタリングを行うとパフォーマンスが向上すると思いますか?同じカーネル、同じコードパス、同じアルゴリズムです。誤って接続追跡を有効にするようなことをしない限り、違いは見られないはずです。*テーブル多くの複雑な処理を実行できるため、パフォーマンスに影響を与える可能性があります。しかし、それはそれがあることを意味しないでしょう
タイラー

私は実際にので@tylerl フィルタに持って iproute2を(同じVLAN内の顧客の何百、フィルターハッシュの束)と-すべてのパケットのための任意の他の余分なチェックがされます、私は信じていない、パフォーマンスに影響を与えます。
ブラウニアン

0

reorder_hdrVLANインターフェイスのオプションをオフにしてみてください。ヘッダーの並べ替えオプションが有効な場合、フレームのタグは削除されます。コマンドで確認してくださいip -d link list dev vlan_iface


1
削除されたときと、挿入されたときを明確にてください。つまり、タグ付きフレームはLinuxブリッジに入り、その後、別のインターフェースから離れます-これらのタグ操作が発生したとき/場所、およびフィルターが呼び出されたとき/場所?マップへのリンクなどはありますか?ありがとう!tc
ブラウニアン

別の考えてください:どの VLANインターフェイスを意味しますか?そのブリッジには、vlanインターフェイスが1つもありません(最初の段落で「つまり、VLANインターフェイスはありません」と書きました)。
ブラウニアン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.