HTTPコネクションでIPパケットをProxyさせる、新しいCONNECT-IPメソッドの仕様 (RFC 9484)

2022年7月追記: この記事は古くなっています。現在の最新仕様では、拡張CONNECTメソッドを使うことになってます
asnokaze.hatenablog.com


確立したHTTP/3コネクションをVPNのように使う、MASQUEという仕組みがIETFで議論されています。

以前書いた記事では、UDPパケットをProxyさせるCONNECT-UDPという提案仕様を紹介しました。
asnokaze.hatenablog.com

その後、同様に確立されたHTTP/3コネクション上で、IPパケットをトンネリング可能にする「The CONNECT-IP HTTP Method」という仕様が提案されています。

CONNECT-UDPと同様に経路上の第三者にはただのHTTP/3通信を行っているようにしか見えないため、検閲やブロッキングに対して耐性があると思われます。

それでは簡単に見ていきましょう。

CONNECT-IPメソッド

HTTP CONNECT-IPメソッドは、通常のHTTPリクエストのCONNECTメソッドと同様、いくつかの疑似ヘッダを持ちます

  • ":method" : "CONNECT-IP"を指定
  • ":scheme": "https"を指定
  • ":path": "/" を指定
  • ":authority": Proxyのホスト名とポート番号を指定

クライアントからのCONNECT-IPリクエストに対して、サーバが200レスポンスを返すことで、そのストリームがIPパケットのProxyに使用されます。

IPレイヤのセットアップ

COONECT-IPでストリームのトンネル化をしたあと、IPレイヤのセットアップをします。これらのメッセージは、そのストリーム上のDATAフレームに格納されて送受信されます。

  • クライアントはADDRESS_REQUESTメッセージを送り、IPアドレスの割当を要求します
  • サーバはADDRESS_ASSIGNメッセージを送り、IPアドレスの割当を行います
  • サーバはROUTE_ADVERTISEMENTメッセージを送り、ルーティング情報をクライアントに通知します

(通信を制御するために、その他のメッセージも定義されていますが割愛)

IPパケットの送信

セットアップが終わったらIPパケットを実際にやり取りしていきます。

主に二種類の方法があります

  • 該当ストリーム上で、IP_PACKETメッセージを送信します。IP VersionからIP PayloadまでのIPパケットがそのまま格納されます
  • QUIC DATAGRAMフレームで、同様にIPパケットを送信する

おわりに

まだまだ最初の仕様ですので、今後議論があるかと思いますが、HTTP/3でVPNを効率よく行うというところでIPパケットまで送れるようになりました。

活用方法や、セキュリティの議論など引き続き注視していこうかと思います