GNU/Linux >> Linux の 問題 >  >> Linux

tc を使用してパケットを 1 つの IP アドレスだけに遅延させる

解決策 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」行を作成しないでください。


Linux
  1. Arpwatchを使用してLinuxでイーサネットアクティビティを監視する方法

  2. SQLを使用してphpmyadminでWordPressサイトのアドレスを変更する方法

  3. シェル スクリプトを使用して MAC アドレスを取得する

  1. N 個のパケットに対してのみ Ping コマンドを実行する方法

  2. Fail2Ban Howto:Fail2ban と IPTables を使用して IP アドレスをブロックする

  3. ネットワークのトラブルシューティングに tcpdump コマンドを使用する例

  1. bash / 標準の Linux コマンドのみを使用して、文字列内の一重引用符と二重引用符を削除する

  2. Cを使用して特定のメモリアドレスを取得する方法

  3. C プログラムを使用してマシンの MAC アドレスを取得する方法は?