セキュリティモデル
mqproxy は 信頼されたプロキシ モデルを採用します。mqproxy-client、mqproxy-server、そしてその間の MPQUIC コネクションは信頼されます。TCP プロキシモードと透過キャプチャモード (--mitm なし) では、アプリケーション↔オリジンの TLS はエンドツーエンドに保たれます (mqproxy は平文を一切見ず、生の TLS バイトを不透明にリレーします)。証明書ピンニングを行うアプリケーションも引き続き動作します。
HTTP リクエスト実行ゲートウェイは明示的な委譲モデルです — クライアントは、オリジン TLS を確立し (常に検証する) 信頼されたゲートウェイへ HTTP リクエストの実行を委譲します — 透過的な MITM ではありません。ゲートウェイリクエストは個別に認証されます (X-Mq-Auth、リクエストごと)。Authorization はオリジン用に予約され転送されますが、Cookie と X-Mq-* がゲートウェイを離れることは決してありません。
TLS MITM イングレス
TLS MITM イングレス (--mitm、オプトイン) は、オペレータの CA がローカルにインストールされたマネージドデバイス向けの オペレータ管理/同意済みエンドポイント モデルです — 企業プロキシや個人 VPN の姿勢であり、第三者への透過的な攻撃ではありません。クライアントはその CA からホストごとのリーフを偽造し、ブラウザの TLS を HTTP/2 として終端し、各リクエストをゲートウェイトンネルにマッピングします。
その信頼の前提:
- CA 秘密鍵が起点 です (暗号化されていない PKCS#8 ファイルで、実行ユーザーの所有、グループ/他ユーザーがアクセス不可、シンボリックリンク不可。mqproxy の実行中はメモリ上に残ります)。
- CA は X.509 の
nameConstraints拡張で自分のドメインに限定できます。範囲外のホストは mqproxy が不透明にリレーします。 - ブラウザが提供する
X-Mq-*ヘッダは 常に除去 されます (制御として解釈されることは決してなく、クライアントが自身のx-mq-authを注入)。 - 機能は フェイルクローズ です (設定不備は起動エラーであり、決して暗黙のパススルーにならず、サイズ上限付きの ClientHello 読み込みと、ヘッダ・ストリーム・コネクションの制限を伴う)。
- 有効なホスト名に対する HTTP/2 の TLS クライアントだと肯定的に確認できないもの (非 h2、非 TLS、SNI なし、ignore 対象のホストなど) は、不透明にリレーされ、検査されません。
証明書ピンニングされたホストは --ignore-host(s) で除外でき、不透明にリレーされてオリジンの本物の証明書がクライアントに届きます。
既知の制限: 受信側のデバイスがトンネルより遅い場合、クライアントの HTTP/3 受信側は大きなダウンロードをメモリに溜め込みます。xquic 上流の修正が入るまでの制限です (詳細はガイド)。運用上の詳細は TLS MITM ガイド を参照してください。
ライセンス
Apache-2.0。LICENSE を参照してください。
免責事項
mqproxy は Apache License 2.0 の下でライセンスされ、現状有姿("AS IS")で提供され、いかなる種類の保証も条件も伴いません。
mqproxy の利用は自己責任で行ってください。その適合性・セキュリティ・運用上の安全性の検証は、特に本番環境や商用環境において、利用者が単独で責任を負うものとします。
謝辞
- XQUIC (Alibaba) — QUIC/MPQUIC トランスポート。mp0rta フォーク 経由。
- BoringSSL — TLS バックエンド。
- nghttp2 — C ビルドの TLS MITM イングレスの HTTP/2 フレーミング (Rust バイナリは
h2クレートと rustls を使用)。