暗号化された VPN パケットのコストが思ったより低い理由
暗号ラベルが一つ増えても、作業量が一つ増えるわけではありません。AEAD 構築、CPU のサポート、バッファリング、そして折衝されたデータモードという経路全体を比較してください。
同じゲートウェイで二つのプロファイルを計測する、一方は暗号化あり、もう一方はなしで、暗号化された側が遅いということはない。むしろ速いことさえあり、たいていは試験が正しく実行されたかどうかをめぐる長い議論になる。その結果はもっともらしい、パケットのコストは設定ファイルに暗号用語がいくつ書かれているかではないからだ。実装が実行する操作の集合であり、手元のハードウェアの上で、選んだバッファ配置に沿って決まる。
症状:遅いのは暗号化されたプロファイルではない
過去の試験が AEAD 暗号を「暗号化なし」モードと比較したとする、そのモードはパケットごとに別の認証コードを計算している。二つ目のプロファイルはペイロードの中身を隠すがパケットごとのハッシュは残しており、そのハッシュの高速化機構がないプロセッサでは、打ち負かすはずだった統合構築より高くつくことがある。
設定のラベルは「暗号化」と書いてあり、ほとんどの比較はそのラベルだけを見る。パケットの経路は別のことを語る、一方のプロファイルは CPU に命令がある統合された操作を実行し、もう一方は命令がない別個の操作を実行している。設定ファイルだけを読んでもその違いは決して見えない、どちらの項目も一行に見えるからだ。結果を説明するのは、折衝されたモードとその背後のコード経路だけである。
それが説明のすべてであり、どのプリミティブが普遍的により速いかという主張は必要ない。どちらも速くも遅くもなり得て、順序はマシンとコードに依存する。
ラベルではなく操作を数える
AEAD 構築は、RFC 5116 が記述するように、暗号文とタグをまとめて返す単一のインターフェースを実装に与える。AES-GCM はその一例で、カウンタモードの暗号化と Galois の認証器を組み合わせたものだ。このインターフェースは完全性を無料にするわけではなく、組み合わせを明確に定義し、それが実装に二つを一つの単位として最適化させる。
Separate authentication path: payload -> independent HMAC -> framed packet AEAD path: payload -> authenticated encryption with tag -> framed packet
これは処理の見取り図であり、設定の助言ではない。前者には機密性はないがそれでも認証に CPU を使う、だからこそ「暗号化を切る」は「暗号処理を切る」の同義語ではない。
後者が安く済むことがあるのは、プロセッサが両半分の命令を持っているからだ、AES のラウンドと、Galois 体が使う桁上げなしの乗算である。ライブラリは独立したバッファも並列に処理するので、命令はメモリ待ちにならず動き続ける。
折衝されたモードが実際に可能にするもの
Community OpenVPN では、AEAD のデータ暗号を使うと、auth オプションは独自のデータチャネル HMAC を提供しなくなる。暗号化オプションのリファレンスがその範囲を説明しており、テキストファイル上で似て見える二つの設定がパケット当たりの処理で違うのはそのためだ。
願望リストではなく、折衝されたモードを読むこと。許可された暗号の一覧と TLS スイート名はペイロード上でどの操作が走るかを教えてくれず、古い cipher 行は現在の接続が選んだ内容を記述していないことがある。
openvpn --show-ciphers | head -20 sudo grep -E 'cipher|auth' /etc/openvpn/server.conf
最初のコマンドはバイナリが対応する暗号を一覧する、これは能力の一覧であって折衝の結果ではない。二つ目はサーバーが実際に何を要求しているかを示す。最終的な選択を確認する場所は接続ログである、クライアントはサーバーが許すが誰も意図していないものに落ちることがある。
実際に動かしている負荷を測る
暗号のマイクロベンチマークは、プリミティブをそれ自身の条件で測る。VPN の転送はバッファもコピーし、スレッドや割り込みをスケジュールし、ポリシーを検査し、ネットワークを横断する。多くの場合これらの部分が支配的になる、だから速いプリミティブが必ずしも速いトンネルになるとは限らない。
openssl speed -evp aes-256-gcm openssl speed -evp sha1
この二つのコマンドは目の前のマシンでのプリミティブの大まかな比較を与えるもので、マイクロベンチマークであることを正直に示している。トンネルのスループットについては何も語らず、そのように引用してはならない。
そのうえで意味のある負荷を測る、ほかの条件は一定に保ち、同じエンドポイント、同じパケットサイズ、同じトランスポート、同じ圧縮ポリシーとする。プロファイルの変更がトランスポートや処理場所も変えたなら、結果が示すのはその束であり、暗号ではない。
目的も視野に入れておくこと。暗号処理の余力があるデータ経路でも、アプリケーションが往復を待つために遅延で律速されることがあり、バルクの容量が増えてもおしゃべりなプロトコルは直らない。対応しポリシーで承認された設定を全体として測り、箱が少ないほど速いはずという見方を、それが仮説にすぎないものとして扱うこと。有益な問いは、暗号化にコストがあるかどうかではなく、そのコストが本当に見たい測定に現れるかどうかである。