Skip to content

概要

mqproxy は、Multipath QUIC 上に構築された マルチパス・アプリケーションプロキシ/アクセラレータ で、XQUIC のフォーク を使用しています。mqproxy はアプリケーションのフローを MPQUIC のプリミティブへ直接マッピングします — 1 つの TCP フローは 1 本の MPQUIC ストリームに、1 つの HTTP リクエストは MPQUIC 上の 1 本の H3 ストリームに、1 つの UDP セッションは MPQUIC DATAGRAM になります。これにより、アプリケーション自身が MPQUIC を実装することなく、経路の多重化・シームレスなフェイルオーバー・帯域アグリゲーション を得られます。

mqproxy は クライアント/サーバーのペア として動作します。クライアントは 1 つ以上のローカルイングレスを公開し、トラフィックを単一のマルチパス QUIC トンネル経由でサーバーへ運び、サーバーがオリジンへ到達します。4 つのイングレスモードが利用できます — TCP プロキシ(SOCKS5 / HTTP CONNECT)、HTTP リクエストゲートウェイPOST /_mqproxy/fetch、TLS 検証を常時有効にしてオリジンに対して実行)、UDP リレー(MPQUIC DATAGRAM 上の SOCKS5 UDP ASSOCIATE)、そしてオプションの TLS 終端 MITM モードを伴う カーネルリダイレクト TCP の透過キャプチャ です。すべてのモードで、束ねた各パスにわたる経路多重化・シームレスフェイルオーバー・ストリーム内帯域アグリゲーションが得られます。

加えて、自動再接続/キープアライブ、パス単位・リクエスト単位のメトリクス、輻輳制御とマルチパススケジューラの選択、認証前コネクション上限、マスカレードモード、INI 設定ファイル、systemd サービスパッケージングも備えています。

mqvpn との関係

mqproxy は mqvpn の L4/L7 兄弟です。mqvpn が QUIC DATAGRAM(MASQUE CONNECT-IP)で IP パケットを運ぶ標準ベースの L3 VPN であるのに対し、mqproxy はアプリケーションフロー層で動作し、MPQUIC ネイティブ です。

mqvpnmqproxy
レイヤL3L4 / L7
データプレーンQUIC DATAGRAMQUIC STREAM + DATAGRAM
モデルIP パケットトンネルアプリケーションフロープロキシ
強みIP 透過性、標準志向MPQUIC ネイティブなフローマッピング

両者は補完的で共存できます。デバイス全体の透過性には mqvpn を動かしつつ、特定の優先度の高い転送は mqproxy に委譲する、といった使い方が可能です。

なぜ MPQUIC ネイティブなのか?

QUIC の ストリーム はオフセットで再構成されるため、1 本のストリームの STREAM フレームを複数パスに分散しても正しさが保たれます。したがって、1 本の MPQUIC ストリームとして運ばれる単一の大きなダウンロード/アップロードは、ストリーム内 マルチパスアグリゲーションを得られます。これは、内側のトラフィックを DATAGRAM で運ぶ方式(mqvpn/MASQUE の経路)に対する構造的な優位性です。DATAGRAM 方式では、フローピンニングが単一パスを強制し、ピンしなければ内側 QUIC の並べ替えのリスクが生じます。

動作モード

モードマッピング
TCP プロキシ1 TCP フロー → 1 MPQUIC 双方向ストリーム
HTTP リクエスト実行ゲートウェイ1 HTTP リクエスト → MPQUIC 上の 1 H3 ストリーム
UDP リレー1 UDP セッション → MPQUIC DATAGRAM
透過 TCP キャプチャカーネルリダイレクト TCP → 不透明な MPQUIC ストリーム
TLS MITM イングレスブラウザの TLS を終端(偽造リーフ) → H2 → ゲートウェイトンネル✅ オプション

TCP プロキシモードは TLS を 終端しません。HTTPS では TLS はアプリケーションとオリジンの間でエンドツーエンドのままです。mqproxy-client と mqproxy-server の間の WAN 区間のみが MPQUIC で運ばれます。

仕組み

text
アプリケーション (curl / SDK / app)
  │  SOCKS5 / HTTP CONNECT 経由の TCP

mqproxy-client ──────────────── MPQUIC (マルチパス) ──────────────► mqproxy-server
  │  CONNECT_TCP(host:port)        1 TCP フロー = 1 双方向ストリーム      │  host:port へダイヤル
  │                                パスにわたって分散                    ▼
  └─ 双方向バイトリレー ◄─────────────────────────────────────────► オリジンサーバー

クライアントに(SOCKS5 または HTTP CONNECT 経由で)到着した TCP フローは、新しい MPQUIC 双方向ストリームを開きます。このストリームは CONNECT_TCP_REQUEST(SOCKS5 スタイルのアドレスタイプ)で始まり、サーバーがターゲットへダイヤルして CONNECT_TCP_RESPONSE を返し、その後は同じストリームが双方向に生バイトをリレーします。コネクションレベルの認証は、フローが開かれる前に制御ストリーム上で一度だけ行われます。

ソースからのビルドクイックスタート へ進むか、特定のモードへジャンプしてください: TCP プロキシHTTP ゲートウェイUDP リレー透過キャプチャTLS MITM

Apache License 2.0 に基づき公開