【図で解説】独自開発「AdGuard VPNプロトコル」の仕組みとユニークさ
何年もの間、私たちはあらゆる種類の広告ブロックアプリやブラウザ拡張機能の開発に集中していました。そして2年前、突然のように独自のVPNサービスの開発を決意しました。
実際、いくつかの重要な理由があってのことです:
- AdGuardモバイルアプリにはVPNアプリとの互換性問題がありました。そこで、互換性を確保できる唯一のソリューションとして、独自のVPNを開発しました。結果として、2つのアプリ(AdGuard広告ブロッカーとAdGuard VPN)は1つのVPNサービスとして作動できるようになり、併用が可能になりました。
- VPNは、私たちの理念や優先事項と十二分に関連しているように思えました。
- AdGuardソフトウェアを長年開発している間に、私たちはネットワークトラフィックのフィルタリングのエキスパートになりました。これは、数多くある気まぐれなVPNにならず、他社にない新しいものを取り入れた独VPN製品を作り出すことができる理由になりました。
当初から、AdGuard VPNは競合他社と大きく異なる点を持つべきと私たちは決心していました。
その点は、既製のソリューションから選ぶのではなく、自社でVPNプロトコルを開発して実装することです。
なぜわざわざそのような面倒なことをするのか、と思うかもしれません。
この記事では、なぜ私たちが既存のプロトコルに満足できず、独自のプロトコルを開発したのか、そしてそのロードマップをご紹介します。
(ネタバレ:AdGuard VPNプロトコルは検出が難しく、類似品よりも高速です。)
しかし、その前にいくつかの技術的なことを深く掘り下げて説明する必要があります。
目次
インターネットの仕組み
ここでは、あえてインターネットの全体像を説明することはしませんが、その仕組みの基本的な部分を説明します。
さて、インターネット上のすべての通信は、小さなデータ「パケット」をコンピュータからサーバに転送し、またサーバからコンピュータに転送して戻すことで成り立っています。
パケットにはいくつかの種類があり、それぞれに目的があります。
パケットのカプセル化と処理に関する規制を「プロトコル」と呼びます。
IPプロトコル
IPアドレスという言葉を聞いたことがあるのではないでしょうか?
IPアドレスは、ネットワークデータ転送の主要な仕組みであるIPプロトコルの一部です。
1つのパケットは、
- データそのもの
- 送り手のIPアドレス
- 受けてのIPアドレス
という3つの部分から構成されています。
受け手は誰がパケットを送信したかを知っているので、何らかのデータを送り返すことができます。
“純粋な”IPプロトコルはほとんど使われていませんが、IPプロトコルをベースにしたTCPとUDPという2つのプロトコルは幅広く使われています。
TCPプロトコル
TCPは、インターネットの主要な「仕事馬」です。
ウェブサイトを開くと、データ送信にTCPが使われている可能性が高いです。
TCPのパケットは4つの部分で構成されています。
- 送信元と送信先のアドレスを含むIPパケットヘッダ
- 送信者と受信者のポート番号。この番号は、パケットをどのプログラムに送って処理すべきかということをOSが理解するために必要です。
- パケットシーケンス番号。パケットは、送信された順に受信者へ到着するとは限りません。シーケンス番号があれば、パケットの正しい順序を復元することができます。
- パケットタイプ。このプロパティは、後述する「配送保証」を実現するために必要です。
どのようなネットワークを使用していても、送信したパケットの一部が途中で失われる可能性があります。
TCPプロトコルでは、送信されたパケットが確実に宛先に届くようにするために、受け手は、受信した各パケットに対して、受信確認用の小さなTCPパケットを送信します。
確認を得られない場合は、送り手は受信確認を得るまでパケットを再送し続けます。
UDPプロトコル
UDPはそこまで人気ではありませんが、同じくIPベースのプロトコルです。
IPプロトコルとの唯一の違いは、送信されるパケットの中でデータそのもの、送り手と受けてのIPアドレスに加えて、ポート番号(下記のポート番号説明へ飛ぶ)の情報が含まれることだけです。
下の図をご覧になればわかるように、データパケットのフローはTCPの場合よりも速く、それもそのはずで、UDPには送達確認がないからです。
TCPとは異なり、UDPは何も保証しないということです。
しかし、受信確認のための余分なパケットをわざわざ送り返すこともないので、その分より高速になるというわけです。
人気VPNプロトコルの仕組み
誰かに手紙や電子メールを送るとき、内容やヘッダー、署名はなくても送れますが、受信者のアドレスがないと送れないですよね。
インターネットも同じように、データを送るためには必ずIPアドレスが必要です。
Webサイトにアクセスすると、あなたのIPアドレスがWebサイトに表示されます。
IPアドレスがわかれば、ユーザーの位置情報を把握することもそれほど難しくありません。
VPNを利用すると、あなたのデータは暗号化された接続を通じて、あなたの自宅・職場やスマートフォンから、インターネット上の別の地点(おそらく別の国)に送られ、そこからはじめて公のインターネット上に出てくるようになります。
覗き窓の出口に続く穴に潜り込んでよその目を避けるウサギのように。
暗号化の結果として、あなたのデータは自宅や職場の住所ではなく、トンネルの反対側(出口)のIPアドレスが割り当てられます。
これで、あなたがサイトのウェブサーバーに接続したとき、ウェブサーバーが目にするのは、あなたの自宅のIPアドレスではなく、VPNエンドポイントに属する他人のIPアドレスです。
したがって、ウェブサイトにアクセスしても、あなたのデータが開示されることはありません。
上記のことはすでにご存知の方も多かったかもしれませんが、念のためおさらいしておいて損はないかと思いました。
では、実際の技術的な詳細を説明したいと思います。
VPNが機能するためには、あなたのデバイスからVPNサーバーまでの間でデータを転送し、暗号化する必要があります。
このデータを送信・暗号化するための規制をVPNプロトコルといいます。
最も一般的なVPNプロトコルは、OpenVPN、WireGuard、IPSecです。
これらのプロトコルはどれもほぼ同じ働きをし、機能的には非常によく似ていますが、細部(暗号化と接続の確立)に工夫が凝らされています。
その仕組みを見てみましょう。
例えば、あるウェブサイトにアクセスしたいとします。
あなたがVPNを有効にしている場合、VPNサーバーがあなたとウェブサイトの間を仲介します。
最初に、暗号化されたIPパケットがVPNサーバーに送信されます。
VPNサーバーはそれを解読し、「送り手のアドレス」(つまりあなたのIPアドレス)を変更して、パケットを受けて(つまりWebサイト)に送ります。
これは通常、UDPをトランスポートとして使用して行われます。UDPは確認を待つ必要がないため、一般的に「より高速」です。
(※) VPNサーバーからウェブサイトへ転送される「元のIPパケット」には、元のIPアドレスが変更されているため、サイト側によって元のユーザー情報を特定することはできません。
既存のプロトコルの制限
すべての一般的なVPNプロトコル(OpenVPN、WireGuard、IPSecなど)は、2つの欠点を持っています。
- ネットワークレベルで簡単に検出され、ブロックされてしまいます。
- 検出対策としてVPNを「隠そう」とすると、パフォーマンスが低下します。
VPNの使用を「隠す」ためには、データフローをTCP接続で「包む」ことが多く、さらに暗号化して通常のWebサイト接続のようなトラフィックとして見せることもあります。
残念ながら、この方法には欠点があります。TCPを使用しているため、受信確認を追加で行う必要があります。
(※) VPNサーバーからウェブサイトへ転送される「元のTCPパケット」には、元のIPアドレスが変更されているため、サイト側によって元のユーザー情報を特定することはできません。
そのため、一般的なVPNプロトコルを使用する場合、「速いけど検出されやすい」と「遅い」のうちのどれかを選ばないといけない、というトレードオフになります。
AdGuard VPNプロトコルの仕組みとメリット
※VPNサーバーからウェブサイトへ転送される「元のデータを含むIPパケット」には、元のIPアドレスが変更されているため、サイト側によって元のユーザー情報を特定することはできません。
AdGuard VPNプロトコルを開発したのは、これまでのプロトコルの欠点を知り、それに対処しようとしたかったからです。
では、AdGuard VPNプロトコルの強みは何でしょうか?
- AdGuard VPNプロトコルは、通常のHTTPSトラフィックと区別することがほぼ不可能である。つまり、AdGuard VPNサーバーへの接続は、通常のウェブサイトへの接続とまったく同じように見えるのです。
- 暗号化には、この課題に完璧に対応する HTTPS (TLS) を使用しております。TLSは世界で最も普及している暗号化方式であり、これを実装しているライブラリは常にセキュリティ監査を受けています。
既存のVPNプロトコルの中にも、暗号化の課題を達成するものがあり、それらも (VPNが使用されているという事実を) 検出されにくい。
しかし、これは通常、速度の低下という代償を伴います。
いくつかの解決策のおかげで、AdGuard VPNプロトコルは暗号化と速度の両方を保つことができます。
- 私たちはHTTP/2トランスポートプロトコルを使用しており、高速性を維持すると同時に、AdGuard VPNプロトコルを検出することはほぼ不可能です。
- **AdGuard VPNプロトコルは、**他のプロトコルと異なり、パケットではなくデータをもとにで動作します。つまり、AdGuard VPNは、各接続に対して個別の「トンネル」を確立し、各HTTP/2ストリームは1つの接続に対応しています。AdGuard VPNは、このトンネルを通してデータを転送します。これにより、複数のパケットのデータを1つにバッファリングしてからVPNサーバーに(またはサーバーからクライアントへ)送信することができるため、確認用のパケットを節約して動作を高速化することができます。また、パケット数が少なければ、確認の回数も少なくて済みます。
これからの開発予定
HTTP/3 と QUIC への切り替え
まず最初に、サーバーとの通信にHTTP/3とQUICのプロトコルを使用するように切り替えようと考えています。
HTTP/3は、HTTPの最新・最先端バージョンです。新しいプロトコルは、接続が安定しているときには速度に影響を与えませんが、モバイル機器や公共のWi-Fiに接続しているときなど、接続が悪いときにはそのメリットが現れます。
また、新プロトコルには、パケットの再送やHead of Line Blocking (HoLB)キューが発生しないこと、接続の移行が可能になることなど、いくつかの明らかなメリットがあります。
技術的なことは抜きにして、主な利点は、すでに述べた非理想的な環境での接続品質の向上です。
TCPとその上で動作する他プロトコル(TLS、SSL、HTTP /1.1、HTTP/2)は、しばらく前から存在しており、その機能は素晴らしいものですが、スムーズに動作するためには完璧に近い状態が必要という欠点が一つあります。
つまり、家庭内のWi-Fiネットワークなど、安定した高品質な接続環境であれば問題なく動作します。しかし、モバイルネットワークの外の世界に出ると、電波の弱さや回線の遅さなど、パケットロスを防ぐことができません。
このようなパケットロスは、上記の再送とHoLBに繋がります。
5Gも全能ではなく、エレベーターや駅間の長い地下鉄区間では接続がどうしても悪くなる場合があります。
VPN over HTTP/3を使えば、魔法のようにこの問題が解決します。エレベーターに入っても、その他の理由でネットワークが変わっても、VPN接続が切れることはありません。
現在、この新しい実装のプロトタイプをテストしています。数ヶ月後に完成する見込みでございます。
オープンソース
長い間AdGuardに慣れ親しんでいる方は、当社の製品の多くがオープンソースであることをすでにご存知かと思います。
オープンソースソフトウェアのコンセプトは、私たちにとって身近なものです。なぜなら、このようなプロジェクトは人々を助け、テクノロジーの発展に貢献するものだと信じているからです。
しかし、私たちのアプローチはプライバシーに配慮しているため、可能な場合にのみ製品をオープンソース化しています。
将来的には、AdGuard VPNプロトコル実装を公開する予定です。残念ながら、今ではまだプロジェクトの準備に十分な時間がありません。
今年末までには十分な時間を確保し、サーバーとクライアントの両方の実装のコードを公開したいと考えています。
私たちのプロトコルは、AdGuard VPNの全アプリ(iOS/Android/Windows/Mac)で使用されています。
あなたのデータを最も安全な方法で保護しているいずれ(または複数)のアプリをぜひダウンロードしてお試しください。
また、下のコメント欄やSNS・フォーラムで、ご意見などをご共有いただければ嬉しいです。