解決策 1:
選択された回答は正しくない/不完全です。同様の問題に直面しました。選択した回答はいくらか助けになりましたが、十分ではありませんでした。
まず、次のコマンドは実際には必要ありません。
<ブロック引用>tc qdisc del dev eth0 ルート
ルートqdiscを「削除」しますが、すぐにpfifo_fastのものに置き換えられます(接続が失われないようにするため)。
2 番目のコマンド:
<ブロック引用>tc qdisc add dev eth0 ルート ハンドル 1:prio
pfifo_fast qdisc を prio のものに置き換えます。デフォルトでは、prio キューには 3 つのバンド (0、1、2) があり、それぞれが 1 つのクラス (1:1、1:2、および 1:3) によって管理されます。
パケットは、IP パッケージの TOS フィールドを使用して、これらの帯域の 1 つに送信されます。この構成は、次を実行すると表示されます:
<ブロック引用>tc qdisc ls
「priomap」の値を見てください。
次に、netem qdisc を追加します:
<ブロック引用>tc qdisc add dev eth0 親 1:1 ハンドル 2:netem 遅延 500ms
このコマンドを使用すると、1:1 帯域に向かうすべてのトラフィックを (フィルターが配置されるまで) 遅らせることができます。
ただし、注意点が 2 つあります:
- トラフィックの TOS 値が異なり、別の帯域に送信される場合があります。
- prio qdisc は、トラフィックが別の帯域に移動するように構成できます。
以下は、フィルターが適用されていないときにnetemの影響を受けないように問題を解決しました。上記の手順の代わりに、次のことを行いました:
<ブロック引用>tc qdisc add dev eth0 ルート ハンドル 1:prio priomap 2 2 2 2 2 2 2 2 2 2 2 2 2 2
これにより、デフォルトですべてのトラフィックが帯域 1:3 に送信されます。
次に、トラフィックを遅延させるルールを追加しました:
<ブロック引用>tc qdisc add dev eth0 親 1:1 ハンドル 10:netem 遅延 100ms 10ms
これによりバンド 0 に qdisc が作成されますが、すべてのトラフィックがバンド 3 に送られるため、影響はありませんでした。
その後、フィルターを追加しました:
<ブロック引用>tc filter add dev eth0 protocol ip parent 1:0 prio 1 u32 match ip dst 10.0.0.1/32 match ip dport 80 0xffff flowid 1:1
フィルターを使用すると、選択したトラフィックを帯域 0 にリダイレクトするため、選択した IP/ポートのみが影響を受けます。
バンド 3 に流れ続けるため、他のすべてのトラフィックは影響を受けません。
解決策 2:
わかりました、私は自分の問題を解決しました。上記の最初の 3 行 ("tc qdisc" の行) を実行すると、フィルタがまだないため、すべてのパケットが遅延することがわかります。 4 行目は、その単一の IP アドレスからのパケットのみを遅延させるように変更します。追加のフィルター行を追加して、追加の IP アドレスを「遅延」リストに追加できます。したがって、フィルターが指定されていない「netem delay」行を作成しないでください。