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


20

tcnetemを使うのは初めてです。特定の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を通過しないように指定するには、最後に何らかのキャッチオールフィルターが必要です。しかし、何も機能しません。これをどのように機能させるのですか?

回答:


14

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


戻ってきて答えを投稿してくれてありがとう。奇妙なことに、どちらの方法でもうまく機能することがわかりましたが、とにかく。私はちょうど私がしようと思いました、テストを支援するために、これら3つのコマンドのラッパースクリプトを書いた小さなお返し :)
アランCudbardベル

13

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

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

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 parent 1:1 handle 2:netem delay 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 2 2 2

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

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

tc qdisc add dev eth0 parent 1:1 handle 10:netem delay 100ms 10ms

これにより、バンド0にqdiscが作成されますが、すべてのトラフィックがバンド3に送られるため、影響はありませんでした。

その後、フィルターを追加しました。

tcフィルターadd dev eth0プロトコル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に流れ続けるため、影響を受けません。


「ip dst 10.0.0.1/32」とは何ですか?それは宛先IPですか?「ip src xxx.yyy.zz.www / aa」があるということですか?
ザックフォルウィック

はい、それは私の例では宛先IPです。はい、「ip src」オプションがあります。
電信

最初のコマンド(tc qdisc del)の理由は、以前の状態をクリアするためです-この機能を試そうとしている場合のように。FWIW受け入れられた答えWorked For Me。
ダンプリッツ

おかげで、この答えは本当に役に立ちました。
PepeHands

1

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

警告を追加する必要があります。後で、予想よりも広範囲に遅延が適用されたように思われ、その根本に到達することができませんでした。ただし、すべてのトラフィックが遅延しているわけではありません。
NeilenMarais

0

このスレッドで説明されている方法を使用して、1つのIPへのトラフィックを遅延させ、他の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

コマンドが実行されるホスト15001msからIP へのトラフィックを遅延させるため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

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


また、他のトラフィックに影響を与えずにトラフィックを遅延させるために、この回答2つ目の方法を見つけました。1.2.3.4:18583

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
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.