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を通過しないように指定するために、最後になんらかのキャッチオールフィルターが必要だと思います。しかし、何も動作しません。これを機能させるにはどうすればよいですか?
はい、私は自分の問題を解決しました。上記の最初の3行( "tc qdisc"の行)を実行すると、まだフィルターがないため、すべてのパケットが遅延することがわかります。 4行目では、その単一のIPアドレスからのパケットのみを遅延させるように変更しています。追加のフィルター行を追加して、「遅延」リストにIPアドレスを追加できます。だから:それを指すフィルターなしで「ネット遅延」ラインを作成しないでください。
選択した答えは正しくない/不完全です。私は同様の問題に直面しました、選ばれた答えはいくつかの助けを与えましたが、十分ではありませんでした。
まず、次のコマンドは実際には必要ありません。
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つの注意点があります。
以下は、フィルターが適用されていない間、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に流れ続けるため、影響を受けずに続行されます。
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
このスレッドで説明されている方法で、ある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
へのトラフィックを遅らせるために、この answer に2番目の方法も見つけました。
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