web-dev-qa-db-ja.com

tcを使用して単一のIPアドレスのみへのパケットを遅延させる

tc および netem を使用するのは初めてです。特定のIPアドレスに送信されるパケットを遅延させたい。ただし、次のコマンドを実行すると、IPアドレス1.2.3.4だけでなく、システム上のすべてのパケットが遅延します。

tc qdisc del dev eth0 root
tc qdisc add dev eth0 root handle 1: prio
tc qdisc add dev eth0 parent 1:1 handle 2: netem delay 500ms
tc filter add dev eth0 parent 1:0 protocol ip pref 55 handle ::55 u32 match ip dst 1.2.3.4 flowid 2:1

私の推測では、残りのすべてのトラフィックがnetemを通過しないように指定するために、最後になんらかのキャッチオールフィルターが必要だと思います。しかし、何も動作しません。これを機能させるにはどうすればよいですか?

20
Matt White

はい、私は自分の問題を解決しました。上記の最初の3行( "tc qdisc"の行)を実行すると、まだフィルターがないため、すべてのパケットが遅延することがわかります。 4行目では、その単一のIPアドレスからのパケットのみを遅延させるように変更しています。追加のフィルター行を追加して、「遅延」リストにIPアドレスを追加できます。だから:それを指すフィルターなしで「ネット遅延」ラインを作成しないでください。

14
Matt White

選択した答えは正しくない/不完全です。私は同様の問題に直面しました、選ばれた答えはいくつかの助けを与えましたが、十分ではありませんでした。

まず、次のコマンドは実際には必要ありません。

tc qdisc del dev eth0ルート

これはルートqdiscを「削除」しますが、すぐにpfifo_fastに置き換えられます(接続が失われないようにします)。

2番目のコマンド:

tc qdisc add dev eth0 root handle 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 parent 1:1 handle 2:netem delay 500ms

このコマンドを使用すると、1:1バンドに向かうすべてのトラフィックを遅延させます(フィルターが配置されるまで)。

ただし、2つの注意点があります。

  • トラフィックに別のTOS値を設定して、別の帯域に送信することができます。
  • Prio qdiscは、トラフィックが別の帯域に送られるように構成できます。

以下は、フィルターが適用されていない間、netemの影響を受けないように私の問題を解決しました。上記の手順の代わりに、私はしました:

tc qdisc add dev eth0 root handle 1:prio priomap 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2 2

これにより、デフォルトですべてのトラフィックが帯域1:3に送信されます。

次に、トラフィックを遅延させるルールを追加しました。

tc qdisc add dev eth0 parent 1:1 handle 10:netem delay 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に流れ続けるため、影響を受けずに続行されます。

13
Telegrapher

https://wiki.linuxfoundation.org/networking/netem の簡単な例では、設定中でも、他のトラフィックに影響を与えることなく、特定のIPへのパケットを遅延させることができます。

tc qdisc del dev eth0 root # Ensure you start from a clean slate
tc qdisc add dev eth0 root handle 1: prio
tc qdisc add dev eth0 parent 1:3 handle 30: netem delay 500ms
tc filter add dev eth0 protocol ip parent 1:0 prio 3 u32 \
   match ip dst 192.168.1.2 flowid 1:3
1
NeilenMarais

このスレッドで説明されている方法で、あるIPへのトラフィックを他のIPに正常に保ちながら、1つのIPへのトラフィックを遅延させることができませんでした。

ただし、以下のコマンドを使用してなんとかします。

tc qdisc add dev eth0 root handle 1: prio priomap 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 
tc qdisc add dev eth0 parent 1:2 handle 20: netem delay 0ms
tc filter add dev eth0 parent 1:0 protocol ip u32 match ip src `hostname -I` flowid 1:2
tc qdisc add dev eth0 parent 1:1 handle 10: netem delay 15001ms
tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip dst 1.2.3.4 flowid 1:1

コマンドが実行されるホストからIP 15001msへの1.2.3.4トラフィックを遅延させるため。コマンドhostname -IはホストのメインIPを取得するために使用されますが、値はコマンド内で直接置き換えることができます。

ホストからのトラフィックと一致するように、0ms遅延のある別のフィルターを追加する必要がありました。確かにそれはエレガントではありませんが、私はより良い何かを動作させることができませんでした。

最後のコマンドは、単一のポートに一致するように置き換えることができます。

tc filter add dev eth0 parent 1:0 protocol ip prio 1 u32 match ip dport 18583 0xffff flowid 1:1

IP 18583ではなくポート1.2.3.4へのトラフィックを遅延させるため。


他のトラフィックに影響を与えることなく1.2.3.4:18583へのトラフィックを遅らせるために、この answer2番目の方法も見つけました。

tc qdisc add dev eth0 root handle 1: prio
tc filter add dev eth0 protocol ip  parent 1: prio 1 u32 match ip dst 1.2.3.4 match ip dport 18583 0xffff flowid 1:1
tc filter add dev eth0 protocol all parent 1: prio 2 u32 match ip dst 0.0.0.0/0 flowid 1:2
tc filter add dev eth0 protocol all parent 1: prio 2 u32 match ip protocol 1 0xff flowid 1:2
tc qdisc add dev eth0 parent 1:1 handle 10: netem delay 10ms
tc qdisc add dev eth0 parent 1:2 handle 20: sfq
0