互聯網上有一個名為暗網的區域,只有使用特定的軟體才能訪問
作為暗網的一部分,基於Tor構建的網絡非常著名
本文將在解釋Tor如何實現匿名通信的機制後,說明如何訪問Tor網路內的.onion域名


Tor是一項於1990年代由美國海軍研究所開發的技術
它基於將通信流量經過多個伺服器並在每個階段進行加密的想法,以實現匿名通信
Tor的功能主要有以下兩個:
Tor網路來增加在互聯網上通信被追蹤的難度Tor可以在不暴露伺服器IP地址的情況下公開服務.onion進行管理,因為後述的原因,只能透過Tor訪問根據Tor的概念,全球有不同的管理者運營的伺服器,這些伺服器運行著Tor
截至2025年10月,全球約有8000個中繼伺服器和90萬個.onion域名存在
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端口偵聽
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的情況下,顯示的IP地址是從Tor網路的出口伺服器得到的
在此次連接中,似乎是柏林的一個伺服器作為出口
通過這樣的方式,我們確定了使用Tor能夠隱蔽客戶端的IP地址
Tor提供了一個用於檢視行為的控制端口
可以通過名為nyx的軟體檢視Tor的行為
讓我們來確認一下在進行通信時經過了哪些伺服器
# 當Tor客戶端啟動時執行
stodo@TDRK:~$ nyx
~~選擇Connections標籤~~
│ 127.0.0.1 --> 185.220.101.18:9003 (de) 目的: 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節點列表的節點
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
實際上存在名為目錄快取(DirCache)的多個快取節點,這些節點定期獲取DA簽名的共識並將其分發給客戶端
客戶端在啟動時或定期更新時,主要從DirCache獲取簽名的共識並將其緩存到本地(/var/lib/tor/cached-microdesc-consensus)
根據獲取的共識,客戶端構建通信路徑
以下是保存在客戶端/var/lib/tor/cached-microdesc-consensus中的Tor節點信息,抽取了一個示例
附加了像<暱稱>這樣的補充信息
<暱稱> <簽名> <固定值> <固定值> <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
Tor網絡的入口節點
Entry Guard與客戶端進行通信,因此知道客戶端和中繼的信息
負責中繼Entry Guard和Exit Guard的節點
Middle Relay知道Entry Guard和Exit Guard的信息,但並不知道客戶端的信息及通信目標伺服器的信息
Tor網絡的出口節點
它知道與中繼和目標伺服器的連接信息
此Exit Guard就是通信目標伺服器看到的連接來源
用於公開.onion域名服務的節點
通過在Onion Service上提供服務,客戶端和伺服器可以在彼此之間不知道身份的情況下進行通信
詳細信息將在後述,主要原因是.onion域名的內容只能通過Tor訪問
.onion域名無法查詢DNSOnion Service所需的信息只能從Tor網絡獲得Onion Service的運作如同反向代理,使其內容只能通過Tor訪問Onion Service提供的內容僅能通過Tor訪問
目前,Tor網路上似乎有約90萬個Onion Service在運行
https://metrics.torproject.org/networksize.html
將解釋客戶端通過Tor網絡訪問目標伺服器的流程
客戶端獲取來自DA的Relay Node信息,以決定通信路徑(GUARD、MIDDLE、EXIT)
並通過路徑上的節點進行DH密鑰交換以共享會話共享密鑰
客戶端獲得GUARD、MIDDLE、EXIT三個會話共享密鑰
而GUARD、MIDDLE、EXIT則僅擁有自己的密鑰
將TCP有效負載依次用EXIT、MIDDLE、GUARD的會話共享密鑰進行加密後發送
將有效負載包裹在3層洋蔥皮的印象

用自身的共享密鑰解密前一節點發送的數據包,然後根據解密結果更改IP頭並發送到下一個節點
這個解密過程像是剝去洋蔥皮


當Exit Guard接收到數據包後進行解密,提取出原本的有效負載並將其發送給目標伺服器
目標伺服器僅能知道Exit Guard的信息

到這裡為止,我們已經介紹了Tor進行匿名通信的機制,但即使使用Tor也有可能導致身份被識別的情況
例如著名網站經營者因為社交媒體或論壇的暱稱重複而被識別,或是某學生因為「Tor訪問記錄」而被識別出其身份的案例
如果社交媒體賬號或論壇上的暱稱導致個人被識別,那就毫無意義,而通過Tor進行的行為雖被隱匿,但訪問Tor的事實卻無法隱匿
最後安全漏洞的確是人類自身
有關使用Tor導致被識別的案例,請參考下列資料的「為什麼使用Tor的罪犯會被逮捕」
https://unit42.paloaltonetworks.com/ja/tor-traffic-enterprise-networks/
迄今為止,我們講述了Tor如何使客戶端隱匿其發送源IP的手法
但是,這僅僅是Tor功能的一部分
在世上有些人希望匿名使用服務,也有些人希望匿名公開服務
當客戶端訪問.onion時,相關的Tor節點構成如下

分散保存Onion Service信息的伺服器
會合點如其名,是客戶端和Onion Service的通信交匯伺服器
客戶端和Onion Service同時連接到RP,通過RP作為中介進行通信,從而隱藏了彼此的存在
用於通知Onion Service``RP信息的伺服器
ItP由Onion Service決定,並起到將客戶端決定的RP告知Onion Service的作用
包含Onion Service的公鑰及ItP的信息
由Onion Service生成並登記到HSDir
客戶端將根據此描述符確立與Onion Service的通信
Onion Service生成一個洋蔥地址作為識別服務的地址
洋蔥地址是包含Onion Service公鑰信息的字符串
例如,我在本地網路上生成的地址如下所示
bx3w3mhfzy7bu56b4sc3vo5cr5ddxwgy4noeben752ia63g6cjqslead.onion
Onion Service隨機選擇一個Introduction Point(ItP),這個ItP可以比喻為希望隱藏行蹤的重要人物所信賴的中介人
Onion Service將洋蔥地址、公鑰和ItP信息登記至HSDir作為描述符
客戶端隨機選擇一個RP
客戶端和Onion Service分別與RP通信,通過RP進行信息交換
這個RP可以比作是要人和其通信時所用的保險櫃,透過保險櫃進行信件的交換,雙方能在不知道彼此身分的情況下進行通知
如果能將所用的RP告知Onion Service,則客戶端和伺服器在互不知曉的情況下就能夠通過RP進行通信
此時將使用先前Onion Service設定並登記到HSDir的ItP
客戶端從HSDir獲取Onion Service的描述符
描述符中包含Onion Service指定的ItP信息,因此通知使用該ItP的RP
Onion Service通過ItP了解到將與客戶端通訊所用的RP
這像是通過中介告知要人所選擇的保險櫃,以進行信件的交換
通過上述步驟,已經共享了Onion Service和客戶端所使用的RP
今後將通過RP作為中介展開客戶端與伺服器的通信
在解釋完必要的前提後,將說明為何訪問.onion域名必須經由Tor
原因其實很簡單,主要有以下三個:
Tor網路在路由和服務發布方面被設計為不依賴其他中央管理系統
.onion域名不與DNS系統有關,因此無法註冊至DNS上
https://datatracker.ietf.org/doc/html/rfc7686#section-1
Tor網路的設計是使其不因路由和服務發布受到任何中央控制機構的支配,因此無法註冊、分配、轉讓或撤銷
.onion名稱。
當權威DNS伺服器被詢問.onion的IP地址時,必須返回NXDOMAIN(不存在該域名的錯誤)
權威DNS伺服器:當被詢問
.onion時,權威伺服器必須使用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
在普通網絡中,輸入像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經由的加密通道上建立的連接轉發給內容伺服器
根據最佳實踐,內容伺服器應僅接受來自Onion Service的通信,並僅在127.0.0.1:80上偵聽流量
HiddenServicePort行指定了一個虛擬端口(即訪問您的Onion Service的用戶將使用的端口),上述情況下表示對Onion Service的80端口的任何流量都應轉發到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
Tor網路為服務的使用者和提供者雙方提供匿名性.onion域名不會被註冊於DNS上.onion域名上的服務.onion域名的IP地址,仍然因其反向代理的運作而被拒絕訪問資料1:
由帕洛阿爾托網路提供的簡明Tor說明
https://unit42.paloaltonetworks.com/ja/tor-traffic-enterprise-networks/
資料3:
中繼信息表示的含義
https://spec.torproject.org/dir-spec/consensus-formats.html#section-3.4.1
資料4:
.onion是特殊的域名
https://datatracker.ietf.org/doc/html/rfc7686#section-1
資料5:
針對通過RP進行通信的說明
https://community.torproject.org/onion-services/overview/