Tor 及 Tor Hidden Service 有別於傳統 HTTP 協定的特點#
高度匿蹤性
:伺服器與客戶端雙方皆不需要知道對方 IP 位置即可連線,中間經過層層節點轉發,這也導致連接速度延遲較高。加密的流量
:多節點轉發的機制,以及分散式的對照表管理,使得MITM (中間人攻擊)幾乎不可能發生,流量打從一開始就已經加密直至目的地才解密。仰賴節點服務
:這項技術依賴世界各地的自願者架設 Tor 節點,以完整這張 Tor 鏈路網。公鑰雜湊即網域
:洋蔥路由的隱藏服務頂級域為「.onion」,其網域是一串經過 Hash 運算的公鑰,算法通常是SHA-3雜湊搭配Ed25519簽章。
Onion Routing (洋蔥鏈路)#
每個節點都來自世界各地的自願者,這些節點都有自己的公鑰與私鑰。
加密#
- 當 Client 想傳送加密訊息給
Target
節點時,Client
從眾多的 Tor 節點中選擇A
、B
、C
作為中繼節點。Client
將原始訊息經過Target
節點的公鑰加密,將密文附上Target
節點的 IP 後,再使用C
節點的公鑰加密,接著再將加密後的訊息附上C
節點的 IP 後,經過B
節點的公鑰加密,最後再附上B
節點的 IP 並透過A
節點的公鑰加密,之後發送給A
節點。解密#
A
節點收到加密訊息後,用自身私鑰解密,獲得B
節點的 IP 以及密文,將密文轉發給B
節點,接著B
節點用自身私鑰解密後得到密文及C
節點 IP,然後轉發至C
節點,C
節點再用自身私鑰解密後,獲得密文及Target
節點 IP,最後轉發至Target
節點。Target
節點用自身私鑰解密,獲得原始訊息。
整個過程中繼節點僅會知道前後節點的 IP,但不會知道訊息內容與目的地,而目標節點Target
也只會得到上個中繼節點的 IP 以及原始訊息,但不會知道來源為何。
而上述的洋蔥鏈路還有一個問題尚未解決,也就是當
Client
節點要發送訊息給目標節點Target
時,必須知道Target
節點的 IP 位置,這也就表示服務端不會是Target
節點,否則就失去隱藏伺服端 IP 的目的了。
特殊節點#
Guard Relay (入口節點)
:表示客戶端進入 Tor 鏈路的首個節點。由於層層加密的原因,入口節點並不會知道客戶端的目的地以及原始訊息,不過因為是唯一與客戶端 IP 直接接觸的節點,因此許多入口節點是執法單位刻意架設的 Honey Pot。Middle Relay (中繼節點)
:協助轉發 Tor 流量的中間節點,是混淆流量來源的重要角色。Exit Relay (出口節點)
:該節點僅用於由 Tor 訪問外部互聯網時的流量,是作為 Tor 鏈路上的最後一個節點,用於將 Tor 流量轉發至一般互聯網。(若僅訪問 Tor 隱藏服務則不會經過該節點)Introduction Point (介紹節點)
:用於將客戶端導向至伺服端所指定之反向鏈路的節點。(稍後介紹)Directory Nodes (目錄節點)
:用於存放與管理Service Descriptor (服務描述符)
。(稍後介紹)Rendezvous Point (會合節點)
:由客戶端提供,指定伺服端回應的位置。(稍後介紹)
分散式雜湊表 (DHT, Distributed Hash Table)#
在開始介紹 Tor 隱藏服務的核心概念前,先來說一個分散式管理的概念 - 分散式雜湊表 (DHT, Distributed Hash Table)
。這是一種用於點對點傳輸的架構,適合擁有大量節點的環境。
(若還不知道什麼是「Hash (雜湊)
」,可以觀看我之前的文章「Encode、Encrypt and Hash are different!」)
在一個點對點的環境當中,節點各自會有一張Routing Table (路由表)用於記錄其他節點的 IP 位置與 hash 值(可能來自公鑰)。
但這張表中所記錄的節點並非隨機,而是會選擇與其本身「最接近」的節點(這邊的接近並非指現實距離)。
何謂「接近」?如何計算節點間的距離?
- 首先 hash 值本身就是數字(通常以 16 進制表示),以 SHA-1 運算所產出的 hash 值來說,長度為 160 bits,也就是說該 hash 的有效範圍在 0 ~ 2^160 之間,是一個非常大的數。
- 節點本身會有一組 hash,可能來自公鑰,或者 IP 位置等(具體看系統如何設計),在獲取別的節點的 hash 值後,會將其比對自身 hash 值,並挑選出較為接近的節點後記錄於路由表中。這張表會持續更新,若發現表中的某個節點無法連線時,也會對其進行刪除。
這麼一來就賦予了節點之間「距離」的關係,也可以透過路由表來持續更新,以記錄與自身節點較為接近的節點列表。
(還是不理解的朋友,請自行翻閱資料或觀看維基百科「分散式雜湊表」,該概念在後續提到時不再進行解釋)
Tor Hidden Service (Tor 隱藏服務)#
Tor 提供了一項技術叫做「Tor Hidden Service (Tor 隱藏服務)」,該服務可以將伺服端的 IP 位置隱藏,並提供用戶透過 Tor 鏈路連接。
這是一個衍伸的協定,必須透過特殊的瀏覽器連接,大多數傳統的瀏覽器是不支援 Tor 路由的(「Brave Browser」內建支援),Tor 有屬於自己專屬的瀏覽器,叫做「Tor Browser」。
具體步驟如下:
公布網域、公鑰與鏈路資訊#
- 伺服端生成一對公私鑰,並將公鑰進行 Hash 運算後加上「
.onion
」作為 Tor 隱藏服務之網址。 - 伺服端生成反向鏈路,該步驟與上述的洋蔥路由原理一致,只是終點為自身服務的 IP 位置,因此任何人有該反向鏈路即可連接至伺服端主機。
- 伺服端隨機挑選幾個節點作為「Introduction Point (介紹節點)」,並使用洋蔥鏈路將自身的
公鑰
以及步驟二所生成的反向鏈路
對其進行數位簽章
後一同發送給介紹節點。由於過程是由洋蔥鏈路發送,因此介紹節點也不會知道隱藏服務真正的位置,並且介紹節點可以透過公鑰驗證其簽名。(若不知道何為數位簽章,可以觀看我之前的文章「非對稱加密 (Asymmetric Cryptography)」) - 伺服端生成
Service Descriptor (服務描述符)
,其中包含步驟三所挑選的介紹節點之列表
以及自身公鑰
、數位簽章
、有效期限
,由於該資訊是會定期更新的,因此需要給予有效期限來聲明資訊生命週期。接著透過先前 DHT 技術所提到節點距離計算的方式,挑選幾個與該服務公鑰之 hash 值相近的節點,將服務描述符發送給這些節點。這些節點會檢查該服務公鑰之 hash 值與自身節點的距離,並檢查自身路由表中是否有離該 hash 值更近距離的節點,如果有,則會將從伺服端所接收到的資訊轉傳給該節點,並且後續節點將持續該步驟,直到找不到更近的節點後記錄在路由表中;如果沒有,且距離相對該節點與路由表中的節點更遠,這時該節點可能依舊會保留,又或者會轉傳給其他節點嘗試繼續尋找更近的節點,這取決於許多因素,但不在本文討論範圍。
客戶端請求隱藏服務#
- 客戶端可以向中繼節點們查詢隱藏服務網址上的公鑰 hash 值,這些節點會依照與先前步驟一樣的方式找到相近且有紀錄該 hash 值的節點,接著回傳該服務的
服務描述符
。 - 由於伺服端也需要回應客戶端,因此客戶端在向伺服端發送請求前,會先隨機找尋一個中繼節點作為「
Rendezvous Point (會合節點)
」,使伺服器能夠回傳訊息。客戶端與會合節點建立連線,並提供一條反向鏈路,該鏈路會有一個叫做「會合識別符 (Rendezvous Cookie)
」的唯一識別碼,相當於給鏈路取名(官方上對格式的說明是「an arbitrary 20-byte value, chosen randomly by the client」),接著介紹節點便會在會合表 (Rendezvous Table)
中記錄會合辨識符
所對應的反向鏈路
。 - 客戶端從
服務描述符
中獲取該服務之介紹節點列表
,隨機選擇一個介紹節點,並透過洋蔥鏈路與其建立連線,且除了發送請求外,還會生成臨時加密用的公鑰
(與傳統 SSL 類似),附上臨時公鑰
與步驟二中提到的會合節點 IP
、會合識別符
給伺服端做回應使用。當然,這些資訊也都經過伺服端公鑰加密,且過程皆經由洋蔥鏈路收發,所以即便是介紹節點,也不知道客戶端與伺服端的 IP 位置。 - 介紹節點接收到客戶端請求後,將客戶端的請求透過先前伺服端給的
反向鏈路
轉發至伺服端。 - 伺服端收到請求後透過自身
私鑰解密
,獲取客戶端請求資訊。
隱藏服務回應客戶端#
- 伺服端處理請求後,將回應訊息透過客戶端提供的
臨時金鑰
加密,附帶客戶端提供的會合識別符
,一同發送至會合節點
作為回應(p.s. 連接客戶端提供之會合節點的過程也是經過洋蔥鏈路的)。 - 會合節點透過
會合識別符
得知客戶端的反向鏈路,將訊息轉發至客戶端指定之鏈路。 - 客戶端從自己建立的反向鏈路中收到伺服端的回應,透過方才生成的
臨時公鑰
所對應的密鑰
解密後獲得原始回應訊息。
客戶端連接一般互聯網#
Tor 並不僅是設計用於封閉的洋蔥網絡,你也可以透過 Tor 鏈路訪問一般的互聯網站點。
當你嘗試在 Tor 瀏覽器中訪問互聯網站點時,該 Tor 鏈路會將終點的前一個節點選擇「Exit Relay (出口節點)
」而非介紹節點,並且一樣會附帶會合節點 IP
及會合識別符
給出口節點,出口節點會將其記錄於會合表
中,而在出口節點之後的流量便是處於一般的互聯網,出口節點正常發送請求至伺服端站點,並將伺服端回應透過客戶端生成的金鑰加密後,連同會合識別符一同發送給會合節點,後續皆與隱藏服務流程相同。
這個出口節點等同承擔了用戶的最終流量,通常也伴隨著更高的風險,因此用戶的架設意願通常會相較一般中繼節點更低。
結語#
至此 Tor 的通訊原理就解釋得差不多了,不禁感慨該技術在背後隱藏著如此多的技術及架構設計,下次在使用時,如果覺得速度很慢,別忘記世界各地的節點們正努力的幫你傳接流量。
References#
- 《Tor - 維基百科》https://zh.wikipedia.org/zh-tw/Tor
- 《分散式雜湊表 - 維基百科》https://zh.wikipedia.org/zh-tw/%E5%88%86%E6%95%A3%E5%BC%8F%E9%9B%9C%E6%B9%8A%E8%A1%A8
- 《SHA-1 - 維基百科》https://zh.wikipedia.org/zh-tw/SHA-1