ESP Tunnel Mode + NAT traversal のパケットフォーマット
- ESP Header
Security Parameters Index (SPI) : 4 byte
Sequence Number : 4 byte
サイズは固定。 - ESP IV (Initial Vector)
暗号化アルゴリズムによりサイズが異なる。暗号化アルゴリズム サイズ DES/3DES 8 byte AES(-CBC) 16 byte AES-GCM 8 byte ChaCha20 8 byte - ESP Trailer
Padding : 0~255 byte
Padding Length : 1 byte
Next Header : 1 byte
Paddingは、暗号化アルゴリズムが要求するバイト数に調整するため変動する。
上図のEncryptedの合計サイズが以下になるよう調整される。暗号化アルゴリズム Encryptedの合計サイズ Paddingの取りうる範囲 DES/3DES 8 byte の整数倍 0~7 byte AES(-CBC) 16 byte の整数倍 0~15 byte AES-GCM 4 byte の整数倍 0~3 byte ChaCha20 4 byte の整数倍 0~3 byte - ESP Authentication
完全性アルゴリズムによりサイズが異なる。完全性アルゴリズム サイズ MD5/SHA1 12 byte SHA256 16 byte SHA384 24 byte SHA512 32 byte AES-GCM with a 16 octet ICV(IANA 20) 16 byte Poly1305 16 byte
最適MTU/MSS
ESP Trailerに挿入されるPadding
上記の情報を元に、回線の推奨MTUからヘッダやトレーラを引いていけば、最適なMTUを計算できるが、挿入されるPaddingに注意する必要がある。Paddingは、DES/3DESであれば8バイト、AES(-CBC)であれば16バイトというように整数倍になるように挿入される。
この整数倍を考慮しないと、Paddingが挿入され、MTUを超え、フラグメントされて非効率な通信となってしまう。
そのため、回線のMTUを超えない整数倍になるよう内部のMTUを調整する必要がある。
計算方法
- 暗号化対象(上図のEncriptedの部分)が回線MTUを超えない最大の整数倍になる値を出す
- そこからPaddingが0となるよう Padding Length、Next Headerのバイト数を引く
- 回線MTUから暗号化対象以外のバイト数を引く
- その値を超えない暗号化アルゴリズムが要求する整数倍を出す
- その値から Padding Length、Next Headerのバイト数を引いて、最適MTUを出す
- 最適MTUからIP Header、TCP Header分の40を引いて、最適MSSを出す
IPsec最適MTU/MSS計算機
IPsecの最適MTU/MSS計算機を作成した。各項目を選択して、Calculateボタンを押すと、最適MTU/MSSが表示される。
回線のMTUを手動で入力したい場合は、"インターネット/回線の種類"で"手動入力"を選択し、"インターネット回線/WAN MTU"に手動でバイト数を入力する。
方式では、PCからIKEv2接続する場合は、Remote Access Clientを選択する。
GREを使わないVTI方式も、リモートアクセスと同じと思われるため併記している。
VTI、L2TP/IPsec、GRE over IPsec は、実機で確認が出来ていない。
参考
- The Use of HMAC-MD5-96 within ESP and AH
- The Use of HMAC-SHA-1-96 within ESP and AH
- The AES-CBC Cipher Algorithm and Its Use with IPsec
- The Use of Galois/Counter Mode (GCM) in IPsec Encapsulating Security Payload (ESP)
- Using HMAC-SHA-256, HMAC-SHA-384, and HMAC-SHA-512 with IPsec
- ChaCha20, Poly1305, and Their Use in the Internet Key Exchange Protocol (IKE) and IPsec