サーバーでトラフィックシェーピングを設定しようとしていますが、IPv4またはIPv6のいずれかで設定している場合は、問題ありません。その特定のプロトコルのすべてのフィルタールールがインストールされています。ただし、両方を整形しようとするとエラーが発生し、一部のフィルタールールが拒否されて次のエラーメッセージが表示されます。
Error: Filter with specified priority/protocol not found.
We have an error talking to the kernel, -1
Tcルールを少しいじってみると、次のような特徴があります。IPv4またはIPv6シェーピングのいずれかをアクティブにしている場合、他のプロトコルの優先度が最も高いフィルターを有効にできますが、それでも機能しますが、すぐに機能します。さらに追加しようとすると、優先度の低いものは前述のエラーメッセージで拒否されます。
したがって、これがアタッチできるフィルターの数のあいまいな制限になる可能性があると考えて、各プロトコルの優先度が最も低い2つのルールをコメントアウトし、優先度が最も高い2つのルールを有効のままにしましたが、それも役に立ちませんでした。 。他のブロックで優先度が最も高いルール(IPv4のルールが最初にインストールされるためIPv6)のみがインストールされ、優先度が低いルールは拒否されます。
次に、逆の方法でそれを試み、一方のプロトコルのすべてのルールのコメントを解除し、最低優先度のルールを除く他のプロトコルのすべてをコメントアウトしましたが、それも拒否されました。
TL; DR:IPv4とIPv6の両方でネットワークトラフィックを形成しようとすると失敗します。ハンドルと優先度が異なる複数のフィルターをインストールしようとすると、明らかに、最も高い優先度のフィルターのみをインストールできるような衝突が発生するためです。
スクリプトの関連部分は次のとおりです。
/sbin/tc qdisc add dev eth0 root handle 1:0 htb default 16
/sbin/tc class add dev eth0 parent 1:0 classid 1:20 htb rate 102000kbit ceil 102000kbit
/sbin/tc class add dev eth0 parent 1:20 classid 1:1 htb rate 25kbit ceil 102000kbit prio 0 quantum 3000
/sbin/tc class add dev eth0 parent 1:20 classid 1:2 htb rate 25kbit ceil 102000kbit prio 1 quantum 3000
/sbin/tc class add dev eth0 parent 1:20 classid 1:3 htb rate 10200kbit ceil 102000kbit prio 2 quantum 3000
/sbin/tc class add dev eth0 parent 1:20 classid 1:4 htb rate 20400kbit ceil 102000kbit prio 3 quantum 3000
/sbin/tc class add dev eth0 parent 1:20 classid 1:16 htb rate 71350kbit ceil 102000kbit prio 4 quantum 3000
/sbin/tc qdisc add dev eth0 parent 1:4 hhf
/sbin/tc qdisc add dev eth0 parent 1:16 hhf
/sbin/tc filter add dev eth0 parent 1:0 prio 0 protocol ip handle 1/0xF fw flowid 1:1
/sbin/tc filter add dev eth0 parent 1:0 prio 1 protocol ip handle 2/0xF fw flowid 1:2
/sbin/tc filter add dev eth0 parent 1:0 prio 2 protocol ip handle 3/0xF fw flowid 1:3
/sbin/tc filter add dev eth0 parent 1:0 prio 3 protocol ip handle 4/0xF fw flowid 1:4
/sbin/tc filter add dev eth0 parent 1:0 prio 0 protocol ipv6 handle 1/0xF fw flowid 1:1
/sbin/tc filter add dev eth0 parent 1:0 prio 1 protocol ipv6 handle 2/0xF fw flowid 1:2
/sbin/tc filter add dev eth0 parent 1:0 prio 2 protocol ipv6 handle 3/0xF fw flowid 1:3
/sbin/tc filter add dev eth0 parent 1:0 prio 3 protocol ipv6 handle 4/0xF fw flowid 1:4
Iptablesを使用して、ネットワークパケットをフィルターに適切にマークしています。
今、私はここで何がうまくいかないのか途方に暮れています。ここで間違えた場合、現在、木々の森は見えません。
フィルタの優先度はファミリ固有ではありません。
したがって、フィルターを作成するコマンドは次のようになります。
/sbin/tc filter add dev eth0 parent 1:0 prio 1 protocol ip handle 1/0xF fw flowid 1:1
/sbin/tc filter add dev eth0 parent 1:0 prio 2 protocol ip handle 2/0xF fw flowid 1:2
/sbin/tc filter add dev eth0 parent 1:0 prio 3 protocol ip handle 3/0xF fw flowid 1:3
/sbin/tc filter add dev eth0 parent 1:0 prio 4 protocol ip handle 4/0xF fw flowid 1:4
/sbin/tc filter add dev eth0 parent 1:0 prio 5 protocol ipv6 handle 1/0xF fw flowid 1:1
/sbin/tc filter add dev eth0 parent 1:0 prio 6 protocol ipv6 handle 2/0xF fw flowid 1:2
/sbin/tc filter add dev eth0 parent 1:0 prio 7 protocol ipv6 handle 3/0xF fw flowid 1:3
/sbin/tc filter add dev eth0 parent 1:0 prio 8 protocol ipv6 handle 4/0xF fw flowid 1:4