Linuxブリッジで構築された、ハッシュフィルタリングを備えたNiceシェーパーを持っています。つまり、br0
はexternal
およびinternal
物理インターフェースを接続し、VLANタグ付きパケットは「透過的に」ブリッジされます(つまり、VLANインターフェースがあります)。
現在では、カーネルによって方法が異なります。カーネルバージョンの正確な範囲が間違っている可能性があります。ご容赦ください。ありがとう。
したがって、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パケットの先頭を「ゼロ位置」としてカウントします(少し不明確な場合は、私の英語では申し訳ありません)。
繰り返しますが、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)。それは私にとっては大丈夫です、より論理的なようです。
これは機能します--- 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タグを照合する方法が見つからなかったことです。
以前は次のようにすることができます。
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 0
、at -2
、at -4
、at -6
などと一致させることができなくなりました。私がゼロにしている主な問題hitscount---このフィルタは、「間違ったプロトコル」、つまり、まったくチェックされていません。
誰か、助けてください:-)
ありがとう!
最近のカーネルでは、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
私はまさにこれをしなければなりませんでした。 @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
私は、wiresharkを使用して、ユーザー空間に表示されるようにインターフェイスを通過するものをキャプチャし、それを使用してフィルターを作成することをお勧めします。インターフェイスが何らかの理由でVLANタグを削除しているのではないかと思います(透過的にブリッジするように構成されているにもかかわらず)。おそらく、追加のタグか何かを追加していますか?
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は同じマーキングを共有します。
これはまだ自分で行っていません。したがって、かなり直感的です。