tcpdump 履歴に Tc qdisc 遅延が表示されない

tcpdump 履歴に Tc qdisc 遅延が表示されない

veth-pairを介して接続された2つのLinuxコンテナがあります。コンテナの veth インターフェイスで tc qdisc netem 遅延を設定し、ここから別のコンテナにトラフィックを送信します。 tcpdump / wiresharkを使用して両方のトラフィックを観察すると、送信者と受信者の同じパケットのタイムスタンプが選択した遅延によって変わらないことがわかります。

libpcapがtc qdiscに対応する送信トラフィックにタイムスタンプを挿入するタイミングをもっと詳しく知りたいです。インターネットでスキーム/画像を検索しましたが、何も見つかりませんでした。このトピックを見つけました(Wiresharkパケットキャプチャポイント)しかし、1つ以上のコンテナ/インタフェースを介して間接参照を導入することをお勧めします。これは私の状況では考えられる解決策ではありません。追加の中間インターフェイスを導入せずに(つまり、トポロジを変更せずに)既に提供されている veth インターフェイスにロギングするだけで待機時間が表示されるようにこの問題を解決する方法はありますか?

修正する:

早すぎてミスをしました。下記の私の解決策(@ABの答えの最初の解決策と同じ)と@ABのIFBソリューション(私が確認したもの)はどちらも私の問題を解決しませんでした。問題は、a1-eth0トポロジで送信者インターフェイスの送信キューがオーバーフローすることです。

[a1-br0 ---3Gbps---a1-eth0]---100Mbps---r1---100Mbps---r2

私は速すぎて、a1-eth010ミリ秒の待ち時間の間だけルーターへのリンクをチェックしましたr1。今日、私は遅延時間を100ms、200msに増やしました。結果(私が得た遅延時間とパケットあたりの速度グラフ)は、上記のトポロジと通常のトポロジで変化し始めました。

[a1-eth0]---100Mbps---r1---100Mbps---r2

したがって、もちろん、正確なテストのために追加のリンクを持つことはできません。 Linux ブリッジ、またはこの IFB または他の第 3 システムで導入されていないリンク。輻輳制御方式をテストします。特定のトポロジでこれを実行したいと思います。単にフローティングのためにトポロジを変更することはできません。つまり、速度と待機時間の結果/プロットが同時に変更されることを意味します。

アップデート2:

それで、以下のように解決策を見つけたようです(NFLOGソリューション)。

アップデート3:

NFLOGソリューションのいくつかの欠点がここに説明されています(ペイロードがゼロの送信TCPパケットの大きなリンク層ヘッダーと無効なTCPチェックサム)。これらの問題を経験しないより良いNFQUEUEソリューションが提案されている。長さゼロの送信パケットのTCPチェックサムエラー(iptablesを使用してキャプチャされます)。しかし、私の仕事(輻輳制御方式テスト)にはNFLOGとNFQUEUEの両方が適していません。同じリンクで説明されているように、カーネルのiptablesからパケットをキャプチャすると、転送速度が制限されます(私は理解しています)。したがって、インターフェイスでキャプチャして(つまり定期的に)送信者側にログオンすると2 GBのダンプが得られますが、iptablesでキャプチャされて送信者側にログオンすると1 GBのダンプが得られます。大まかに言えば。

アップデート4:

最後に、私のプロジェクトは私の答えで説明されているLinuxブリッジングソリューションを使用します。

答え1

~によると一般ネットワークのNetfilterとパケットフロー回路図、tcpdumpキャプチャ(AF_PACKET) 後ろにエクスポート(qdisc)。したがって、tcpdumpで遅延が表示されないのは正常です。遅延は、初期キャプチャ時点に既に存在する。

一歩先にこれを捉える必要があるので、3番目のシステムが必要です。

S1:system1、発信インターフェイスでtcpdumpを実行する
R:ルータ(または利便性によってブリッジ、何も変わらない)、qdisc netemを
実行

 __________________     ________________     __________________
|                  |   |                |   |                  |
| (S1) -- tcpdump -+---+- (R) -- netem -+---+- tcpdump -- (S2) |
|__________________|   |________________|   |__________________|

これは3つのネットワークを意味します。スタック物理かどうかに関係なく、仮想マシン、ネットワークネームスペース(含む)IPネットワーク,LXC,...)


または、なりすましを使用してルーター(またはブリッジ)の各特殊設定を移動するIFBとインターフェースフロー:トリックを介して送信の代わりに受信後にnetemを挿入できます(この場合のみ)。

 _______     ______________________________________________     _______
|       |   |                                              |   |       |         
| (S1) -+---+- tcpdump -- ifb0 -- netem -- (R) -- tcpdump -+---+- (S2) |
|_______|   |______________________________________________|   |_______|

基本的なIFBの使用例があります。TCミラーマンページ:

ifb インターフェイスを使用すると、sfq インスタンスを介して着信トラフィックを送信できます。

# modprobe ifb
# ip link set ifb0 up
# tc qdisc add dev ifb0 root sfq
# tc qdisc add dev eth0 handle ffff: ingress
# tc filter add dev eth0 parent ffff: u32 \
  match u32 0 0 \
  action mirred egress redirect dev ifb0

ただ使用ネテムsfqの代わりにifb0で(そして初期ではないネットワークネームスペースではip link add name ifbX type ifbmodprobeなしでうまく動作します)。

正しく機能するには、まだ3つのネットワークスタックが必要です。


使用ニューラルネットワークログ

JenyaKhの提案の後、以下を使用してパケットをキャプチャできることがわかりました。TCPダンプ今後終了時(したがってqdiscより前)終了時(qdisc以降):次を使用してiptables(またはnftables) パケット全体をネットリンクロギングインフラストラクチャに記録し、引き続き使用するにはTCPダンプ、その後再利用TCPダンプ送信インターフェイスで。これにはS1でのみ設定が必要で、ルーター/ブリッジは不要になります。

だからiptablesS1では次のようになります。

iptables -A OUTPUT -o eth0 -j NFLOG --nflog-group 1

おそらく、実行されたテストと一致するように特定のフィルタを追加する必要があります。TCPダンプフィルタはnflogインタフェースに制限されています(wiresharkはそれをよりよく処理する必要があります)。

回答をキャプチャする必要がある場合(ここは別のグループで実行されるため、追加TCPダンプ):

iptables -A INPUT -i eth0 -j NFLOG --nflog-group 2

必要に応じて次に進むこともできます。生/出力そしてソース/事前ルーティング代わりに。

そしてTCPダンプ:

# tcpdump -i nflog:1 -n -tt ...

別のグループ(= 2)を入力として使用する場合:

# tcpdump -i nflog:2 -n -tt ...

その後、いつものように同時に次のことを行います。

# tcpdump -i eth0 -n -tt ...

答え2

修正する:

それで結局このソリューションを使うようになりました。私の解決策に存在します。結局それは私にとってうまくいきます。


私(トピックの開始者)はLinuxブリッジを使用して問題を解決しました。ここ[https://www.linuxquestions.org/questions/linux-networking-3/transferring-all-traffic-through-an-extra-interface-4175656515] 私はLinuxブリッジを使用できると書いていますが、これらの可能性は排除しました。しかし、このソリューションは実際にはh1-br0とh1-eth0インターフェースの間に追加のEthernetリンクがあるため、私の要件には適していません。これはソリューションブリッジが追加のリンクを導入し、トポロジを台無しにします」

       a1
-----------------
|a1-br0---a1-eth0|---------local network
------------------

当初、私がこのソリューションを拒否したのはなぜですか?最初に私のトポロジーは次のとおりです。

a1---3Gbps---r1---100Mbps---r2

リンクのネットワーク速度を100 Mbpsに設定しましたが、r1---r2リンクにa1---r1速度制限はありません。r1接続しているルータの送信キューは1000個のパケットであるため、トラフィックをr2送信するときにキューオーバーフロー(一部のパケットが破棄される)の影響を受けています。それは問題ではありません。これは、ボトルネックリンクが発生したときにルーターキューがオーバーフローしたときに現実の世界で発生することです。a1r2

今、私は遅延と速度制限を追加するためにこのすべての研究を行いましたa1---r1。だから私はLinux Bridgeを使ってこのソリューションを考えました。しかし、私はこの解決策がうまくいかないと思います。以下では、Linuxブリッジの新しいトポロジを見ることができます。

[a1-br0 ---3Gbps---a1-eth0]---100Mbps---r1---100Mbps---r2

したがって、私のソリューションの問題は、キューオーバーフローがインターフェイスのトランスポートキューに現れると予想していることですa1-eth0。つまり、上の図r1の接続インターフェイスでのオーバーフローと同じですr2。同様に。

私はこのオーバーフローをしたくありません。遅延時間の測定にLinuxブリッジを使用しない通常のトポロジでは、トランスポートキューオーバーフローは発生しませんa1-eth0

[a1-eth0]---100Mbps---r1---100Mbps---r2

しかし、昨日はLinux Bridge(上記の3番目のトポロジ)を使用してトポロジを再作成し、トポロジa1からトラフィックを開始しましたr2a1-eth0500ms間隔でループでコマンドを呼び出すトランスポートキューのバックログ(現在キューにあるパケット数)に似たコマンドを使用して、トランスポートキューのバックログを確認しました。tc -s qdisc show dev a1-eth0a1-br0

これは私が見るものとa1-eth0私が受け取るメッセージです:

qdisc netem 8112: root refcnt 2 limit 1000 delay 10.0ms
 Sent 9461862 bytes 6393 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 133380b 90p requeues 0 

qdisc netem 8112: root refcnt 2 limit 1000 delay 10.0ms
 Sent 15280534 bytes 10323 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 133380b 90p requeues 0 

qdisc netem 8112: root refcnt 2 limit 1000 delay 10.0ms
 Sent 21110722 bytes 14257 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 118560b 80p requeues 0 

qdisc netem 8112: root refcnt 2 limit 1000 delay 10.0ms
 Sent 26952766 bytes 18199 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 102258b 69p requeues 0 

qdisc netem 8112: root refcnt 2 limit 1000 delay 10.0ms
 Sent 32788882 bytes 22137 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 103740b 70p requeues 0 

qdisc netem 8112: root refcnt 2 limit 1000 delay 10.0ms
 Sent 38635372 bytes 26082 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 102258b 69p requeues 0 

qdisc netem 8112: root refcnt 2 limit 1000 delay 10.0ms
 Sent 44477416 bytes 30024 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 102258b 69p requeues 0 

qdisc netem 8112: root refcnt 2 limit 1000 delay 10.0ms
 Sent 50332798 bytes 33975 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 102258b 69p requeues 0 

qdisc netem 8112: root refcnt 2 limit 1000 delay 10.0ms
 Sent 56157058 bytes 37905 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 125970b 85p requeues 0 

qdisc netem 8112: root refcnt 2 limit 1000 delay 10.0ms
 Sent 61969532 bytes 41828 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 133380b 90p requeues 0 

qdisc netem 8112: root refcnt 2 limit 1000 delay 10.0ms
 Sent 67784900 bytes 45752 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 133380b 90p requeues 0 

qdisc netem 8112: root refcnt 2 limit 1000 delay 10.0ms
 Sent 73600268 bytes 49676 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 133380b 90p requeues 0 

qdisc netem 8112: root refcnt 2 limit 1000 delay 10.0ms
 Sent 79415636 bytes 53600 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 133380b 90p requeues 0 

qdisc netem 8112: root refcnt 2 limit 1000 delay 10.0ms
 Sent 85244342 bytes 57533 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 120042b 81p requeues 0 

qdisc netem 8112: root refcnt 2 limit 1000 delay 10.0ms
 Sent 91080458 bytes 61471 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 102258b 69p requeues 0 

qdisc netem 8112: root refcnt 2 limit 1000 delay 10.0ms
 Sent 96923984 bytes 65414 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 102258b 69p requeues 0 

qdisc netem 8112: root refcnt 2 limit 1000 delay 10.0ms
 Sent 102761582 bytes 69353 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 102258b 69p requeues 0 

qdisc netem 8112: root refcnt 2 limit 1000 delay 10.0ms
 Sent 108606590 bytes 73297 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 103740b 70p requeues 0 

これは私が見るものとa1-br0私が受け取るメッセージです:

qdisc noqueue 0: root refcnt 2 
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0 

qdisc noqueue 0: root refcnt 2 
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0 

qdisc noqueue 0: root refcnt 2 
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0 

qdisc noqueue 0: root refcnt 2 
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0 

qdisc noqueue 0: root refcnt 2 
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0 

qdisc noqueue 0: root refcnt 2 
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0 

qdisc noqueue 0: root refcnt 2 
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0 

qdisc noqueue 0: root refcnt 2 
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0 

qdisc noqueue 0: root refcnt 2 
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0 

qdisc noqueue 0: root refcnt 2 
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0 

qdisc noqueue 0: root refcnt 2 
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0 

qdisc noqueue 0: root refcnt 2 
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0 

qdisc noqueue 0: root refcnt 2 
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0 

qdisc noqueue 0: root refcnt 2 
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0 

qdisc noqueue 0: root refcnt 2 
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0 

qdisc noqueue 0: root refcnt 2 
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0 

qdisc noqueue 0: root refcnt 2 
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0 

qdisc noqueue 0: root refcnt 2 
 Sent 0 bytes 0 pkt (dropped 0, overlimits 0 requeues 0) 
 backlog 0b 0p requeues 0 

ご覧のとおり、オーバーフローは発生しません。実際には送信されていますが、実際には送信されるようにa1-eth0「見えません」。a1-br0したがって、a1-broとの間のリンクは、vethとルータの間のリンク(vethペアリンク)a1-eth0とは異なります。なぜこれが必要なのかわかりません。 netem 遅延設定を次に設定できることを確認したので、これは奇妙です。したがって、通常のインターフェースと同じです。a1r1a1-br0

とにかく、ブリッジソリューションが私の要件をすべて満たしていることを確認しました。私はそれがなぜ機能するのかを探していませんでした(上記の意味では、キューオーバーフローなどを意味します)。


参照用にホストで実行したコマンドは次のとおりですa1。しかし、文脈がなければ、完全に理解するのは難しいことを知っています。しかし、おそらく将来的に誰かに役立つでしょう。

brctl addbr a1-br0
brctl addif a1-br0 a1-eth0
ip link set dev a1-br0 up
ip addr add dev a1-br0 11.0.0.1/30
ip addr flush dev a1-eth0
route add default gw 11.0.0.2 dev a1-br0
ifconfig a1-eth0 0.0.0.0 up
ethtool -K a1-br0 tx off sg off tso off ufo off

コマンドを適用したIPアドレスを含むトポロマップもここに表示されます。Linux ルーターの 1 つのインターフェースをルーターの別のインターフェースに ping。トポロジは次のとおりです。

------                           ------                            ------
| a1 |                           | r1 |                            | r2 |
|    | a1-eth0-----------r1-eth0 |    |r1-eth1--------------r2-eth1|    |
-----(11.0.0.1/30)   (11.0.0.2/30)----(11.0.0.9/30)   (11.0.0.10/30)----- 

関連情報