ロジカルネットワークにて仮想サーバー上のリソースで一部のパケットが欠落する事象

ロジカルネットワーク

2019年5月21日 (2023年6月2日:更新)

事象概要

本事象では同一の5tupleを持つパケットがロジカルネットワークに対して短時間に複数送信された場合に、ロジカルネットワークにてパケットの4番目以降が正常に転送されず、破棄されます。

一例としてパケットがMTUを上回り4つ以上に分割された場合は宛先サーバにて復元(リアセンブル)に失敗し、パケットが破棄されます。

破棄されるのは短時間に複数送信されたパケットのみであり、その後に同一の5tupleのパケットが届いた場合は、正常に転送され、通信できます。

本事象は仮想サーバー上のリソース(サーバーインスタンス、ファイアウォール、ロードバランサーなど)でのみ発生いたします。ベアメタルサーバーでは発生いたしません。

5tupleとは、送信元IPアドレス、送信元ポート番号、宛先IPアドレス、宛先ポート番号、プロトコル番号の組み合わせを指します。

 

対象リージョン

全リージョン

 

出力例

以下はMTUの4倍以上の大きさのパケットを送信した場合の例です。

この他にも同一5tupleで短時間に複数パケットを送信した場合には同様の事象が発生します。

<MTUの4倍以上の大きさのpingを実行した場合の出力例(DF flag off)>

VMのインターフェイスMTUの3倍以上の大きさのパケットを送信して分割された場合、1パケット目が廃棄されることが確認できます。

(-l はWindowsでパケットサイズを指定するオプションです。)

C:\Users\Administrator>ping 192.168.1.1 -l 9000

Pinging 192.168.1.1 with 9000 bytes of data:

Request timed out.

Reply from 192.168.1.1: bytes=9000 time<1ms TTL=64

Reply from 192.168.1.1: bytes=9000 time<1ms TTL=64

Reply from 192.168.1.1: bytes=9000 time<1ms TTL=64

Reply from 192.168.1.1: bytes=9000 time<1ms TTL=64

Ping statistics for 192.168.1.1:

   Packets: Sent = 5, Received = 4, Lost = 1 (20% loss),

Approximate round trip times in milli-seconds:

   Minimum = 0ms, Maximum = 0ms, Average = 0ms

Windows Serve 2016などpingの実行毎にIdentifierが変わらないOSの場合、一定期間内に同じ送信元IPアドレス、宛先IPアドレスの組み合わせでpingを実行した場合、全パケットが転送されることが確認できます。

なお、Linuxなどpingの実行毎にIdentifierが変わるOSの場合、一定期間内に再度pingを実行しても1パケット目が破棄されます。こちらの動作はOSの実装によって異なります。

C:\Users\Administrator>ping 192.168.1.1 -l 9000

Pinging 192.168.1.1 with 9000 bytes of data:

Reply from 192.168.1.1: bytes=9000 time<1ms TTL=64

Reply from 192.168.1.1: bytes=9000 time<1ms TTL=64

Reply from 192.168.1.1: bytes=9000 time<1ms TTL=64

Reply from 192.168.1.1: bytes=9000 time<1ms TTL=64

Reply from 192.168.1.1: bytes=9000 time<1ms TTL=64

Ping statistics for 192.168.1.1:

   Packets: Sent = 5, Received = 5, Lost = 0 (0% loss),

Approximate round trip times in milli-seconds:

   Minimum = 0ms, Maximum = 0ms, Average = 0ms

<MTUの4倍以上の大きさのpingを実行した場合の出力例(DF flag on)>

分割されずに転送できるMTUサイズを確認するには、Don’t Fragment flag(DF flag)をonとしてpingを実行する必要があります。

IF MTUより大きい場合、下記の通りfragmentが必要で転送できないことが確認できます。

(-f はWindowsでDon’t Flagment flagをsetするオプションです。)

C:\Users\Administrator>ping 192.168.1.1 -l 9000 -f

Pinging 192.168.1.1 with 9000 bytes of data:

Packet need to be fragmented but DF set.

Packet need to be fragmented but DF set.

Packet need to be fragmented but DF set.

Packet need to be fragmented but DF set.

Packet need to be fragmented but DF set.

Ping statistics for 192.168.1.1:

   Packets: Sent = 5, Received = 0, Lost = 5 (100% loss),

Approximate round trip times in milli-seconds:

   Minimum = 0ms, Maximum = 0ms, Average = 0ms

 

対処方法

同一5tupleのパケットを短時間に複数送信しないように設定する必要があります。
アプリケーションの実装によって対処方法は異なりますが、以下のような方法が考えられます。

  • パケット単位で5tupleが異なるものになるように設定する
  • 送信頻度を減らし、短時間に複数送信しないようにする

また、本事象は仮想サーバー上のリソースでのみ発生するため、ベアメタルサーバーをご利用いただくことで回避できます。

出力例で用いたMTUの4倍以上の大きさのパケットを送信していた場合では、MTUサイズ内で通信することで事象が改善します。

これはIPパケットの分割を防ぐことにより、フラグメントが発生しなくなることによるものです。
ロジカルネットワークに接続するリソースのMTUは下記の値に設定してください。

データプレーン  :MTU 1500バイト

ストレージプレーン:MTU 9000バイト

データプレーンに接続するリソースで、MTUを1500バイトより大きくしたい場合、セグメントに接続する全てのリソースのMTUを同じ値に設定してください。同一セグメントに接続するリソース間でMTUが異なると、通信ができなくなる場合がありますので、値を変更する場合はご注意ください。

各メニューのMTU値の推奨値・初期値などは下記のページをご確認ください。

https://sdpf.ntt.com/services/docs/logical-network/service-descriptions/common.html