Webエンジニア向けプログラミング解説動画をYouTubeで配信中!
▶ チャンネル登録はこちら

【ITニュース解説】## 🧅 Inside Tor: A Simplified Look at Its Architecture and Code Organization

2025年09月16日に「Dev.to」が公開したITニュース「## 🧅 Inside Tor: A Simplified Look at Its Architecture and Code Organization」について初心者にもわかりやすく解説しています。

作成日: 更新日:

ITニュース概要

Torは匿名通信を実現するシステムで、そのコードはUI連携、オニオンルーティング、暗号・ネットワーク処理の層に分かれる。ユーザーのリクエストはTorクライアントを介し、複数のノードを多層的に暗号化して通過、目的地へ安全に到達する。

ITニュース解説

Tor(The Onion Router)は、インターネット上での匿名性を確保するための技術として広く知られている。多くの人がTorを匿名ブラウザとして認識しているが、その裏側では、ネットワーク、暗号化、クライアント・サーバー間の連携が見事に組み合わさった複雑なシステムが動いている。システムエンジニアを目指す初心者にとって、Torの内部構造は一見すると非常に難解に見えるかもしれないが、ユーザーが実際に体験する機能とコードの関連性を理解すれば、その仕組みが見えてくる。

Torのコードベースは、大きく三つの主要な層に分けて考えると理解しやすい。まず、最もユーザーに近い「UI/ブラウジング体験」の層がある。これはTorのコアリポジトリ自体には含まれていない。Tor本体は、バックグラウンドで動作する「デーモン」と呼ばれるプログラムであり、ブラウザではない。ユーザーが実際に利用する「Tor Browser」は、このTorデーモンをバックエンドとして統合し、ユーザーインターフェースを提供している。例えば、「Torに接続」や「新しいID」といったブラウザの機能は、Torのコアサービスと連携して実現されている。

次に、Torの「心臓部」とも言える「コアネットワーク」の層がある。この部分は、主にsrc/core/or/ディレクトリに集約されており、オニオンルーティングの論理、データの経路となる「回路(サーキット)」の管理、そしてネットワークを構成する「リレー」に関する処理が記述されている。また、src/core/mainloop/ディレクトリには、Torが様々なイベントを処理し、非同期I/O(入出力)を効率的に行うためのイベントループやスケジューリングの仕組みが実装されている。さらに、匿名でウェブサイトを公開する際に使われる「隠しサービス」(現在はオニオンサービスと呼ばれる)の機能はsrc/feature/hs/に、Tor BrowserなどのアプリケーションがTorデーモンと通信するための「制御プロトコル」はsrc/feature/control/にそれぞれ配置されている。

三つ目の層は、Torの動作を支える「低レベルのコネクタとユーティリティ」である。src/lib/crypt_ops/ディレクトリには、データの暗号化、鍵交換、その他の基本的な暗号プリミティブが実装されており、Torの匿名性とセキュリティの基盤を担う。src/lib/net/には、ネットワークソケットの管理や接続の確立といった低レベルなネットワーク処理が記述されている。また、システムの動作状況を記録し、問題発生時の診断に役立つログ機能はsrc/lib/log/に、Torの各機能が正しく動作するかを確認するためのユニットテストや統合テストはsrc/test/にそれぞれ格納されている。このように、Tor Browserが何かを要求すると、Torコアがオニオンルートを構築し、その裏でネットワークや暗号化のライブラリが複雑な処理を実行している。

ユーザーがTor Browserでウェブページをリクエストする際の具体的な流れを見てみよう。まず、ユーザーがURLを入力すると、Tor BrowserはSOCKSプロトコルを使って、ローカルで動作するTorクライアント(デーモン)にリクエストを送信する。Torクライアントは、自身のネットワーク上のディレクトリオーソリティに問い合わせ、利用可能なTorリレーのリストを取得し、それらの情報をもとに、匿名通信路となる「回路」を構築し始める。この回路は通常、3つの異なるリレーノードを経由して作られる。最初に「エントリノード」と呼ばれるリレーに接続し、次に「ミドルノード」、最後に「イグジットノード」へと接続を拡張していく。それぞれの接続は強力な暗号化によって保護される。

回路が完成すると、ユーザーからのHTTP(S)リクエストはTorクライアントによって多層的に暗号化され、構築された回路を通じてイグジットノードへと転送される。この暗号化は、まるでタマネギの層のようにデータが包まれることから「オニオンルーティング」と呼ばれる。各リレーノードは、自分に向けられた暗号化の層を一つ剥がし、次のノードへとデータを転送する。イグジットノードが最後に暗号化を解除すると、目的のウェブサーバーへは通常のHTTP(S)リクエストとして送信される。ウェブサーバーからの応答も同様にイグジットノードで受け取られ、多層的に暗号化されて回路を逆方向にTorクライアントへと送り返される。Torクライアントは最終的にデータを復号し、ユーザーにウェブページとして表示する。この一連のプロセスにより、ウェブサーバーはユーザーのIPアドレスを特定できず、ユーザーも自身のリクエストがどこから来たのかを秘匿できる。

Torのシステムアーキテクチャは、ユーザー側、Torネットワーク、サービス側の三つの主要なコンポーネントで構成される。ユーザー側には、Tor BrowserとTorクライアント(デーモン)がある。Torクライアントは、Torネットワークに属するエントリノード、ミドルノード、イグジットノードと連携する。エントリノードはユーザーから最も近いTorリレーであり、暗号化の最終層を担う。ミドルノードは中継役で、二番目の暗号化層を処理する。イグジットノードは目的のウェブサーバーに最も近いTorリレーで、暗号化の最初の層を処理し、平文のデータでサーバーと通信する。Torクライアントは通常のウェブサーバーだけでなく、Torネットワーク内に存在する「隠しサービス」(.onionアドレスを持つサイト)にも接続できる。隠しサービスへの接続も、通常の回路構築とは異なる「ランデブーポイント」と呼ばれる仕組みを用いるが、根本的な匿名通信の原理は共通している。

ユーザーの単純な操作が、Torのコードベース内でどのような複雑な処理を引き起こしているかを具体的に見てみよう。例えば、ユーザーがTor Browserでリンクをクリックすると、Tor BrowserはTorクライアントに対してSOCKSリクエストを発行する。これは主にsrc/feature/control/にある制御プロトコルのコードが処理する。次に、ユーザーが「Torネットワークに接続中…」というメッセージを見ると、Torクライアントはネットワーク上のディレクトリオーソリティに接続し、Torネットワークの最新情報を取得してブートストラップ処理を行う。これはsrc/core/or/directory.cなどのコードが担当する。

その後、「安全な接続を構築中…」という表示は、Torクライアントがマルチホップの匿名回路を構築している最中であることを示しており、src/core/or/circuitbuild.c内のロジックが動いている。そして、「Tor経由でページが読み込まれる」際には、ユーザーデータがオニオンラッピングされ、エントリノード、ミドルノード、イグジットノードを経由して中継される。このデータのルーティングと転送はsrc/core/or/relay.cが主要な役割を担う。ユーザーが.onionサイトにアクセスする場合、Torクライアントと隠しサービスの間の「ランデブー」と呼ばれる特殊な接続プロセスが開始され、これはsrc/feature/hs/内のコードが管理する。最後に、ユーザーが特に何も操作していなくても「Torが静かに動作し続ける」のは、src/core/mainloop/内のイベントループがソケットと回路を常に監視し、アクティブな状態を維持しているためである。

これらの点からわかるように、Torのコアリポジトリはブラウザそのものではなく、匿名通信のためのルーティングエンジンである。そのコードは制御インターフェース、オニオンルーティングの論理、そして暗号化やネットワーク処理のユーティリティといった多層構造になっている。ユーザーがウェブページをクリックするというシンプルな体験の裏には、回路構築、多層暗号化、そしてリレーノード間の複雑な連携が連鎖的に発生しているのである。これらのシーケンス図やアーキテクチャ図は、ユーザーの行動がコード内でどのように実現されているか、そのギャップを埋めるのに役立つ。もしTorの実際の動作に興味があれば、TorのGitLabリポジトリを探索し、特にsrc/core/or/ディレクトリからオニオンルーティングの核心部分のコードを読んでみることを勧める。これはシステムエンジニアを目指す上で、複雑なシステムがどのように構築されているかを学ぶ良い機会になるだろう。

関連コンテンツ

関連IT用語