KUSONEKOの見る世界

IPsec VPN AES-CBC/GCM/ChaCha20 の実効速度を測定してみた

 以前、AES-GCMのパフォーマンスが高いという記事を書きましたが、実際の通信速度はどれほどなのでしょうか。

今回は、AES-CBC、AES-GCM、ChaCha20-Poly1305 のそれぞれでIPsecを張った状態で、iperf3を使い測定しました。

測定対象

測定対象は以下の通りです。


OS CPU ネットワーク VPNソフトウェア
VPNサーバ CentOS 8.2.2004 Intel Celeron N3150 1000Base-T strongSwan
VPNクライアント Windows 10 2004 Intel Core i7 3930K C2 1000Base-T 標準機能
iPhone XS iOS14.1 Apple A12 IEEE802.11ac 80MHz
2ストリーム 833Mbps
標準機能
iPhone 12 Pro iOS14.1 Apple A14

我が家にIEEE802.11ax (Wi-Fi 6) 対応APが無いため、iPhone 12 ProもIEEE802.11acでの測定です。

測定方法

  • VPNクライアントとVPNサーバでIPsecを張り、iPerf3で測定し10回の平均を取る
  • 結果がばらつきやすいインターネットは使用せず、LAN内で実施
  • VPNクライアントとVPNサーバは同一セグメントで、そのままではVPNトンネルを使用しないため、VPNサーバに別セグメントのループバックアドレスを設定し、そこに向けてiPerf3を実施 
    (VPN無しのiPerf3では物理NICとループバックで速度の差分は見られませんでした。)
  • TCPのMSSはどのアルゴリズムでも1334バイトとなるようnftablesで書き換える

暗号化アルゴリズムについて

AES-NI機能があるCPUでは、AES-CBCよりAES-GCMの方が速いと言われていますが、それぞれ測定を行います。

今回は、AES-NIが無いCPUにおいて、AESより速いと言われるChaCha20-Poly1305についても測定を行うことにしました。
ChaCha20-Poly1305は、Windows標準VPN機能では使えないようなので、iPhoneでのみ測定を行います。

AES-NIについて

今回使用するIntel CPUにはAES-NI機能がありますが、Apple A12、A14にもAESハードウェアアクセラレーション機能があります。

どうやらARMv8-Aアーキテクチャ以降では、AESハードウェアアクセラレーションがあるようで、iPhoneではA7 CPU(iPhone 5s、iPad Air (第1世代)、iPad mini (第2世代)、iPad mini 3)以降であれば対応しているようです。

Androidでも最近のCPUであれば、対応しているはずです。

設定内容

strongSwan

アルゴリズムの設定は以下としました。

     ike=aes256gcm16-sha384-ecp384,aes256-sha256-ecp384,chacha20poly1305-sha384-ecp384!
     esp=aes256gcm16,aes256-sha256,chacha20poly1305!

IPsecを張ったあとに速度測定を行うので、ikeの方は通信速度には影響が無いと思われます。
espは、aes256gcm16とchacha20poly1305の認証が16バイトなので、それに合わせてAES-CBCも16バイトとなるようsha256にしました。

Windows10

Windows10はECDSAのクライアント証明書を使用します。
アルゴリズム設定はPowerShellで以下のように行いました。

AES-CBC

Set-VpnConnectionIPsecConfiguration `
 -Name "VPN" `
 -CipherTransformConstants AES256 `
 -EncryptionMethod AES256 `
 -IntegrityCheckMethod SHA256 `
 -DHGroup ECP384 `
 -AuthenticationTransformConstants SHA256128 `
 -PfsGroup None `
 -Force

AES-GCM

Set-VpnConnectionIPsecConfiguration `
 -Name "VPN" `
 -CipherTransformConstants GCMAES256 `
 -EncryptionMethod GCMAES256 `
 -IntegrityCheckMethod SHA384 `
 -DHGroup ECP384 `
 -AuthenticationTransformConstants GCMAES256 `
 -PfsGroup None `
 -Force

iPhone

iPhoneもECDSAのクライアント証明書を使用します。
p-listでの設定になりますが、アルゴリズム部分のみを以下に記載します。
その他の部分はブログに何度も記載しているため割愛します。

AES-CBC

<key>IKESecurityAssociationParameters</key>
<dict>
    <key>EncryptionAlgorithm</key>
    <string>AES-256</string>
    <key>IntegrityAlgorithm</key>
    <string>SHA2-384</string>
    <key>DiffieHellmanGroup</key>
    <integer>20</integer>
</dict>
<key>ChildSecurityAssociationParameters</key>
<dict>
    <key>EncryptionAlgorithm</key>
    <string>AES-256</string>
    <key>IntegrityAlgorithm</key>
    <string>SHA2-256</string>
    <key>DiffieHellmanGroup</key>
    <integer>20</integer>
</dict>

AES-GCM

<key>IKESecurityAssociationParameters</key>
<dict>
    <key>EncryptionAlgorithm</key>
    <string>AES-256-GCM</string>
    <key>IntegrityAlgorithm</key>
    <string>SHA2-384</string>
    <key>DiffieHellmanGroup</key>
    <integer>20</integer>
</dict>
<key>ChildSecurityAssociationParameters</key>
<dict>
    <key>EncryptionAlgorithm</key>
    <string>AES-256-GCM</string>
    <key>IntegrityAlgorithm</key>
    <string>SHA2-256</string>
    <key>DiffieHellmanGroup</key>
    <integer>20</integer>
</dict>

ChaCha20-Poly1305

<key>IKESecurityAssociationParameters</key>
<dict>
    <key>EncryptionAlgorithm</key>
    <string>ChaCha20Poly1305</string>
    <key>IntegrityAlgorithm</key>
    <string>SHA2-384</string>
    <key>DiffieHellmanGroup</key>
    <integer>20</integer>
</dict>
<key>ChildSecurityAssociationParameters</key>
<dict>
    <key>EncryptionAlgorithm</key>
    <string>ChaCha20Poly1305</string>
    <key>IntegrityAlgorithm</key>
    <string>SHA2-256</string>
    <key>DiffieHellmanGroup</key>
    <integer>20</integer>
</dict>

測定結果

結果を表にまとめます。
理由は分かりませんが、iPhone は上りと下りで速度が違ったため、両方載せておきます。

10回平均(単位:Mbps)

暗号化なし AES-CBC AES-GCM ChaCha20-Poly1305
Windows10 922 170 341 -
iPhone XS(下り) 363 199 289 229
iPhone XS(上り) 446 241 309 284
iPhone 12 Pro(下り) 349 202 292 238
iPhone 12 Pro(上り) 564 227 377 330

 各機器でAES-GCMが一番速く、次にChaCha20-Poly1305でした。
VPNサーバのCPUにAES-NI機能が無い場合は、ChaCha20-Poly1305が良いでしょう。

またiPhone 12 ProのAES-GCMの結果が377Mbpsなので、N3150ではこの辺りが限界のようです。
インターネットの速度がそこまで出ないため、実用上は問題ありません。

メインPCのWindows10(Intel Core i7 3930K)が、iPhoneに負けるあたり、そろそろ買い替えの検討が必要かもしれません。

まとめ

 IPsecの暗号化は、AES-GCMを使用するのが良いです。

VPNサーバのCPUがAES-NIに対応しておらず、AES-GCMの速度が遅い場合は、iPhone/Android向けに、ChaCha20-Poly1305も使用出来るようにしておくと良いでしょう。