背景
インターネットには特定のソフトウェアを使用しないとアクセスできないダークウェブと呼ばれる領域があります
ダークウェブの一部としてTorで構成されたネットワークが有名です
本記事では、Torで匿名通信を実現する仕組みを解説した後に、Torネットワーク内の.onionドメインにどのような仕組みでアクセスできるかについて解説します
Torとは
Torは1990年代に米国海軍研究所で開発された技術です
匿名通信を実現するために、通信トラフィックを複数のサーバを経由させ、経路の各段階で暗号化するというアイデアをベースにしてTorは作られています
Torの機能は主に下記2つです
- 匿名通信を実現する
Torネットワークを経由することでインターネット上の通信を追跡されにくくなります - 匿名でサービスを公開する
Torを使用することによってサーバのIPアドレスを秘匿しながらサービスを公開することができます
このサービスは.onionという特殊なドメイン名で管理され、後述する理由によってTor経由でしかアクセスできません
Torのコンセプト上、世界中に異なる管理者が運営する、Torが稼働しているサーバが必要です
2025年10月現在、世界に約8000ほどの中継用サーバと90万ほどの.onionドメインが存在しています
Torは検閲やブロッキングが行われている地域でもそれらを回避できるメリットがあります
また、取材や告発を行う場面で情報提供者の秘匿に役立ちます
一方で、違法な物品の売買や攻撃経路の秘匿にも使用されます
Torブラウザ
Torブラウザはブラウザによって行われる通信をTor経由で行うものです
本記事ではTorブラウザは使用しませんが、手軽さと安全性を兼ね備えています
Torは匿名性を高めるために有効な手法ですが、本記事はその匿名性を利用して違法行為を行うことを推奨するものではありません
Torの匿名通信を手っ取り早く感じる
説明に入るの前に、実際にTorを使ってIPアドレスの秘匿を感じてみましょう
クライアントのIPアドレスを表示するサイトipinfo.ioに
- 直接のアクセス
-
Tor経由のアクセス
をそれぞれ試してみます
stodo@TDRK:~/tor$ curl https://ipinfo.io
{
"ip": "my.house.ip.address",
"hostname": "softbankxxxxxxxxxxxx.bbtec.net",
"city": "Tokyo",
"region": "Tokyo",
"country": "JP"
}
直接のアクセスでは私が契約しているプロバイダのIPアドレスが表示されます(IPアドレス情報はマスクしています)
# torが同一ホストで起動していて9050番でListenしている
stodo@TDRK:~$ curl --socks5 127.0.0.1:9050 https://ipinfo.io
{
"ip": "185.220.101.18",
"hostname": "berlin01.tor-exit.artikel10.org",
"city": "Berlin",
"region": "State of Berlin",
"country": "DE"
}
Torクライアントはプロキシとして稼働するので、curlのsocks5オプションを使用してTor経由でipinfo.ioにアクセスします
Tor経由の場合はTorネットワークからの出口になっているサーバのIPアドレスが表示されます
今回の接続の場合は、ベルリンのサーバが出口となっているようです
このように、Torを使用することでクライアントのIPアドレスが秘匿されることが確認できました
Torには挙動を確認するためのControl Portが用意されています
nyxというソフトウェアでControl Portを通してTorの挙動を確認できます
Tor経由で通信をする際にどのサーバを経由しているか確認してみましょう
# Torクライアントが起動している状態で実行
stodo@TDRK:~$ nyx
~~Connectionsタブを選択~~
│ 127.0.0.1 --> 185.220.101.18:9003 (de) Purpose: Conflux_linked, Circuit ID: 5 3.3m (CIRCUIT)
│ │ 64.65.0.3:443 (us) 43C4B296233A29D80479A6839D93B59474336B12 skyzoobrooklyn 1 / Guard
│ │ 45.140.164.238:12233 (fr) FCB8177297C038F892895494F56B198AF8766235 EfilTor 2 / Middle
│ └─ 185.220.101.18:9003 (de) 2268E58FFB596F3CE87E34CA8E87F1C82496E90E artikel10ber71 3 / End
今回形成されていた通信経路はアメリカ、フランス、ドイツを経由するものでした
ipinfo.ioはカンザスシティにあるようですので、日本→アメリカ→フランス→ドイツ→アメリカと地球をパケットが飛び回っていますね
Torネットワークの構成要素
Torネットワークの構成は下記のようになっています
実際にはそれぞれの要素がTorネットワーク上に複数個あり、世界中に分散しています
Directory Authority(DA)とDirectory Cache(DirCache)
ネットワーク上のTorノードのリストを生成し、署名するノードです
DAは通常のTorノードとは異なり、信頼できる個人や団体によって、世界中で10台が運営されているものです
DAはTorネットワークのトラストアンカーとして機能しています
10台しかないとTorネットワークを攻撃する際に標的にされてしまいそうな気がします
調べてみると、DAにDDos攻撃を仕掛けることでTorの分散ディレクトリを機能不全にすることができると主張する論文がありました
https://arxiv.org/pdf/2509.10755
DAはネットワークに参加するTorリレーのメタ情報(公開鍵、フラグ、帯域幅など)を収集して、署名付きのコンセンサス文書(consensus) を作成します
DAの情報はソースコードにハードコーディングされており、Torプロセスの起動時に最初の接続先候補として使われます
Torレポジトリの./src/app/config/auth_dirs.incにハードコーディングされています
stodo@TDRK:~/tor$ head ./src/app/config/auth_dirs.inc
"moria1 orport=9201 "
"v3ident=F533C81CEF0BC0267857C99B2F471ADF249FA232 "
"128.31.0.39:9231 1A25C6358DB91342AA51720A5038B72742732498",
"tor26 orport=443 "
"v3ident=2F3DF9CA0E5D36F2685A2DA67184EB8DCB8CBA8C "
"ipv6=[2a02:16a8:662:2203::1]:443 "
"217.196.147.77:80 FAA4 BCA4 A6AC 0FB4 CA2F 8AD5 A11D 9E12 2BA8 94F6",
"dizum orport=443 "
"v3ident=E8A9C45EDE6D711294FADF8E7951F4DE6CA56B58 "
"45.66.35.11:80 7EA6 EAD6 FD83 083C 538F 4403 8BBF A077 587D D755",
ただし、クライアントが直接DAに問い合わせてconsensusをダウンロードするわけではありません
実際はDirectory Cache(DirCache) と呼ばれる多数のキャッシュノード群が存在し、これらがDAによって署名されたコンセンサスを定期的に取得してクライアントへ配布します
クライアントは起動時や定期更新時に主にDirCacheから署名済みのコンセンサスを取得し、それらをローカルにキャッシュします(/var/lib/tor/cached-microdesc-consensus)
取得したコンセンサスに基づいてクライアントは通信経路を構築します
クライアントの/var/lib/tor/cached-microdesc-consensusに格納されているTorノードの情報のうち1つを抜粋します
<ニックネーム>のような補足情報を付加して記載しています
<ニックネーム> <署名> <固定値> <固定値> <IPアドレス> <リレーに使うポート> <DA用ポート 0は不使用>
r hubbabubbaABC AA0RwL8wxI/YFkTtKqPTczpRSdE 2038-01-01 00:00:00 83.108.59.221 9001 0
<回路構築に必要な情報のhash値>
m u3EWSW8rpXgDzfSsKSS1736R/qAfeklMhfpTW67/lsc
<このノードの状態フラグ>
s Fast Guard HSDir Running Stable V2Dir Valid
<バージョン>
v Tor 0.4.8.10
<サポートされているサブプロトコル>
pr Conflux=1 Cons=1-2 Desc=1-2 DirCache=2 FlowCtrl=1-2 HSDir=2 HSIntro=4-5 HSRend=1-2 Link=1-5 LinkAuth=1,3 Microdesc=1-2 Padding=2 Relay=1-4
<帯域>
w Bandwidth=20000
Entry Guard
Torネットワークへの入り口になるノードです
Entry Guardはクライアントと通信を行うのでクライアントとMiddle Relayの情報を知っています
Middle Relay
Entry GuardとExit Guardを中継するノードです
Middle RelayはEntry GuardとExit Guardの情報を知っていますが、クライアントの情報と通信先サーバの情報は知りません
Exit Guard
Torネットワークからの出口になるノードです
Middle Relayと接続先サーバの情報を知っています
このExit Guardは通信先サーバから見た接続元になります
Onion Service
.onionドメインのサービスを公開するためのノードです
Onion Service上でサービスを提供することで、クライアントとサーバがお互いを知らないまま通信ができます
詳細は後述しますが、主に下記の理由でOnion Serviceで提供されるコンテンツ(.onionドメイン)にはTor経由でしかアクセスできません
-
.onionドメインはDNSが引けない -
Onion Serviceにアクセスするための情報はTorネットワークからしか取得できない -
Onion Serviceがリバースプロキシのように動作し、Tor経由のアクセスしかコンテンツにアクセスできないようになっている
Onion Serviceで提供されコンテンツはTor経由でしかアクセスできません
現在、Torネットワーク上では90万ほどのOnion Serviceが稼働しているようです
https://metrics.torproject.org/networksize.html
Torネットワーク通信フロー
クライアントからTorネットワークを経由して通信先サーバにアクセスするまでの流れを解説します
1.クライアントはDAからRelay Nodeの情報を取得する
クライアントはDAからRelay Nodeの情報を受け取って通信経路(GUARD、MIDDLE、EXIT)を決定します
通信経路上のノードとDH鍵交換によってセッション共有鍵を共有します
クライアントはGUARD、MIDDLE、EXITの3つのセッション共有鍵を手に入れます
GUARD、MIDDLE、EXITは自分自身の鍵しか持っていません
2.パケットを3重に暗号化して送信する
TCPペイロードをEXIT、MIDDLE、GUARDの順にそれぞれのセッション共有鍵で暗号化して送信します
玉ねぎの皮で3層にペイロードを包むイメージです

3.各ノードは自分の共有鍵で通信を復号化して次のノードへ送信する
前のノードから送られてきたパケットを自身の共有鍵で復号して、復号結果をもとにIPヘッダを付け替えて次のノードへ送信します
この復号化は玉ねぎの皮をむいていくイメージです
4.宛先サーバにパケットが到達する
Exit Guardが受け取ったパケットを復号化すると本来のペイロードが取り出され、宛先サーバに送信されます
宛先サーバからはExit Guardの情報しか分かりません
ここまでTorで匿名通信をする仕組みについて説明してきましたが、Torを使っていても身元特定につながることがあります
ダークウェブ上の有名サイトの運営者がSNSや掲示板のハンドルネームの使いまわしから特定された例や、大学に爆破予告をした学生が「Torにアクセスした記録」をもとに特定された事例があります
SNSアカウントや掲示板上のハンドルネームから個人を特定されてしまったら元も子もないですし、Tor経由で何をしているかは秘匿されてもTorにアクセスしていることは秘匿されません
やはり最後のセキュリティホールは人間ということですね
Torを使用していたが特定に至った事例は下記資料の「Torを使う犯罪者が捕まる理由」を参照
https://unit42.paloaltonetworks.com/ja/tor-traffic-enterprise-networks/
Onion serviceによって匿名でサービスを公開できる仕組み
これまでTorによってクライアントが送信元IPを秘匿する手法を解説してきました
しかし、これはTorの機能の一部にすぎません
世の中には匿名でサービスを利用したい人もいれば匿名でサービスを公開したい人もいます
.onionドメインにアクセスする手順
クライアントが.onionにアクセスする際に関係するTorノードの構成は下記のようになっています

Hidden Service Directory(HSDir)
Onion Serviceの情報を分散して保管するサーバです
Rendezvous Point(以下、RP)
ランデヴーポイントは名前の通りクライアントとOnion Serviceの通信が合流するサーバです
クライアントとOnion Serviceの両方がRPに接続して、RPを仲介とした通信を行うことによってお互いの存在を秘匿できます
Introduction Point(以下、ItP)
RPの情報をOnion Serviceに知らせるためのサーバです
ItPはOnion Serviceによって決定され、クライアントが決定したRPをOnion Serviceに伝える役割を持ちます
記述子
Onion Serviceの公開鍵、ItPについての情報が記載されています
Onion Serviceが生成してHSDirに登録されます
クライアントはこの記述子をもとに後述する手順でOnion Serviceとの通信を確立します
1.Onion ServiceがHSDirに記述子を登録する
Onion Serviceはサービスを識別するためのアドレスとしてオニオンアドレスを生成します
オニオンアドレスはOnion Serviceの公開鍵の情報を含んでいる文字列です
例として、私がローカルネットワークで生成したアドレスは下記のようになっていました
bx3w3mhfzy7bu56b4sc3vo5cr5ddxwgy4noeben752ia63g6cjqslead.onion
Onion ServiceはTorノードからランダムにIntroduction Point(ItP)を決定します
このItPは、Onion Serviceを居所を秘匿したい要人と例えると、要人が信頼する仲介人に相当するものです
Onion Serviceは記述子として、Onionアドレスと公開鍵、ItPの情報をHSDirに登録します
2.クライアントがRendezvous Point(RP)を決める
クライアントはTorノードの中からランダムにRPを決定します
クライアントとOnion ServiceがそれぞれRPと通信し、RPを介して情報を交換します
このRPは要人と手紙で連絡を取る際に使用する貸金庫のようなイメージです
貸金庫で手紙をやりとりすればお互いの素性を知らないまま手紙を交換できます
あとはOnion Serviceに使用するRPを知らせることができれば、RPを仲介としてクライアントとサーバがお互いを知らないまま通信ができます
ここで先ほどOnion Serviceが設定してHSDirに登録されていたItPが使用されます
3.Onion Serviceに対して、通信に使用するRPを通知する
クライアントはHSDirからOnion Serviceの記述子を入手します
記述子にはOnion Serviceが指定するItPの情報が含まれますので、そのItPに使用するRPを通知します
Onion ServiceはItPを介して、クライアントとの通信に使用するRPを知ります
これは、仲介人を介して要人に対して手紙の交換に使用する貸金庫を教えるイメージです
4.ランデヴーポイントを仲介としてクライアントとサーバが通信する
これまでの手順から、Onion Serviceとクライアントが通信のために使用するRPを共有することができました
今後はRPを仲介としてクライアントとサーバの通信が行われます
.onionドメインにTorを経由しないとアクセスできない理由
必要な前提を説明し終えたので、.onionドメインにTorを経由しないと到達できない理由について説明してます
といっても、理由はシンプルで以下の3つです
DNSを引けない
Torネットワークはルーティングやサービスの公開に関して、他の中央管理的な仕組みに従属しないように設計されています
.onionドメインはDNSの仕組みとは関係がないのでDNSに登録することができません
https://datatracker.ietf.org/doc/html/rfc7686#section-1
The Tor network is designed to not be subject to any central
controlling authorities with regards to routing and service
publication, so .onion names cannot be registered, assigned,
transferred or revoked.
権威DNSサーバは.onionのIPアドレスを聞かれた場合はNXDOMAIN(そんなドメインは知らない)を返すよう規定されています
Authoritative DNS Servers: Authoritative servers MUST respond to
queries for .onion with NXDOMAIN.
このようにDNSに登録されていないので、.onionドメインを名前解決しようとしてもNXDOMAINが返ってくるだけです
stodo@TDRK:~$ nslookup bx3w3mhfzy7bu56b4sc3vo5cr5ddxwgy4noeben752ia63g6cjqslead.onion 8.8.8.8
Server: 8.8.8.8
Address: 8.8.8.8#53
** server can't find bx3w3mhfzy7bu56b4sc3vo5cr5ddxwgy4noeben752ia63g6cjqslead.onion: NXDOMAIN
Onion Serviceと通信するための情報はHSDirからしか入手できない
クリアネットではosstech.co.jpのようなドメイン名をブラウザに入力すると、DNSに問い合わせが行われて、入手したIPアドレスをもとにコンテンツにアクセスします
Torネットワークでは.onionドメイン名からコンテンツにアクセスするための過程が根本的に異なります
Tor経由のアクセスにおいては、HSDirからOnion ServiceのItPを入手し、そのItPを使用して、通信の仲介に使用するRPをクライアントとOnion Serviceで共有するという手順を踏みます
最終的にクライアントとOnion ServiceはRPを経由して暗号化された通信路を確立します
このように、Torネットワークを経由することによってOnion Serviceとの通信を確立することができます
リバースプロキシ的動作
仮に.onionドメインのIPアドレスを知ることができてしまった場合はどうでしょう
その場合でも通常のブラウザからは.onionドメインにアクセスすることはできません
Onion Serviceはリバースプロキシのように動作し、Tor経由で確立された暗号化回路上の接続のみをコンテンツサーバに転送します
コンテンツサーバは127.0.0.1:80のみをListeし、Onion Service以外からの通信は受け入れないことがベストプラクティスとされています
The HiddenServicePort line specifies a virtual port (that is, the port that people visiting your Onion Service will be using), and in the above case it says that any traffic incoming to port 80 of your Onion Service should be redirected to 127.0.0.1:80
# tor経由
root@026914cb9bc2:/# curl --socks5 http://localhost:9050 http://bx3w3mhfzy7bu56b4sc3vo5cr5ddxwgy4noeben752ia63g6cjqslead.onion/darkweb.html
Hello Dark Web
# Onion ServiceのIPアドレスを指定
root@026914cb9bc2:/# curl http://10.5.1.14/darkweb.html
curl: (7) Failed to connect to 10.5.1.14 port 80 after 0 ms: Couldn't connect to server
Conclusion
-
Torネットワークはサービスの利用者と提供者の双方に匿名性を提供する - ランデヴーポイントを中継点として通信することで匿名性を提供する
-
.onionドメインはDNSに登録されない - Tor経由でないと
.onionドメイン上のサービスを利用できない - 仮に
.onionドメインのIPアドレスを知っていてもリバースプロキシ的動作で弾かれる
参考資料
資料1:
パロアルトネットワークスによるTorのわかりやすい説明
https://unit42.paloaltonetworks.com/ja/tor-traffic-enterprise-networks/
資料2:
コンセンサスとは
https://jordan-wright.com/blog/2015/05/14/how-tor-works-part-three-the-consensus/?utm_source=chatgpt.com
資料3:
リレー情報表記の意味
https://spec.torproject.org/dir-spec/consensus-formats.html#section-3.4.1
資料4:
.oninoは特殊なドメイン
https://datatracker.ietf.org/doc/html/rfc7686#section-1
資料5:
RPを介した通信についての説明
https://community.torproject.org/onion-services/overview/




