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パケットまで送れるようになりました。
活用方法や、セキュリティの議論など引き続き注視していこうかと思います