技術文章

去中心化網站發布

網站的發布方式除了自架伺服器加 DNS,還有 CDN 把內容快取到各地的邊緣節點、IPFS 用內容定址讓檔案在多個節點之間流通,以及 Tor onion 服務讓網站直接在 Tor 網路裡以 .onion 位址運作。後兩者常被放在一起討論,但 IPFS 針對內容被刪除與下架,onion 服務針對連線匿名與 IP 封鎖。把 IPFS 當成匿名工具或期待 onion 服務抵抗下架,都會落空。anoni.net 文件站同時發布標準網站、onion 與 IPFS 三份,部署時的取捨可以當成實例。

網站發布的選項

從中心化、效能優先到去中心化、抗審查,常見的選項有五種:

  • 自架伺服器:自行管理 IP 與 DNS,完全可控,也完全集中。IP 被封鎖或伺服器被沒收,網站就無法連線。
  • CDN(Cloudflare、Fastly、CloudFront):由邊緣節點代理流量,效能與抵抗 DDoS 的能力強,但高度依賴 CDN 業者與 DNS。
  • 靜態網站託管(GitHub Pages、Cloudflare Pages、Netlify):部署簡便,業者可以單方面下架。
  • IPFS:內容依 hash 定址,任何節點都可以提供同一份內容,沒有單一可下架的位置,內容能否存續取決於有沒有節點 pin。
  • Onion 服務:網站直接在 Tor 網路裡運作,不需要公開 IP 與 DNS。連線匿名、不受 IP 封鎖影響,代價是效能較差,能連上的用戶端也有限。

實際部署多半混搭,主站走 CDN 求效能,IPFS 鏡像抵抗刪除,onion 鏡像抵抗封鎖。

IPFS 的設計

IPFS(InterPlanetary File System)以內容定址(content addressing)為核心:

  • CID(Content Identifier,內容識別碼):依檔案內容算出的 hash,同時也是內容的位址。內容相同,在任何節點上的 CID 都相同。
  • DHT(Distributed Hash Table,分散式雜湊表):節點之間互相查詢誰持有某個 CID,以 Kademlia 演算法定位,不需要中央伺服器登記。
  • IPNS(InterPlanetary Name System):把固定的名稱指向目前的 CID。內容更新時 CID 會改變,IPNS 紀錄隨之更新。

內容定址對網站發布帶來三個特性:

  1. 沒有單一可下架的位置:只要還有節點 pin 住這個 CID,內容就能取得。
  2. 竄改可以偵測:CID 是內容的 hash,內容被改動,CID 就不同,讀者可以自行驗證。
  3. 跨節點共用:同一個檔案不論被多少網站引用,CID 都只有一個,快取可以共用。

設計上的限制:

  • 內容存續仰賴 pin:沒有節點 pin 的內容會在垃圾回收時消失,放上 IPFS 不等於永久保存。
  • DHT 查詢延遲:第一次取得內容比 HTTP 慢。
  • 依賴閘道:多數讀者透過公開閘道讀取,閘道被封鎖就讀不到。公開閘道的數量也在減少。Cloudflare 的 cloudflare-ipfs.com 與 cf-ipfs.com 在 2024 年 8 月除役,流量轉往 ipfs.io 與 dweb.link,後兩者在 2026 年 9 月 30 日隨 Interplanetary Shipyard 結束 IPFS 工作一起停止營運(對 pin 節點的影響見文件站 IPFS 鏡像的 pin 節點)。
  • 動態內容受限:IPFS 適合靜態內容,動態功能需要另外一層。

Onion 服務的設計

Tor onion 服務第 3 版(v3)讓網站直接在 Tor 網路裡運作(架設步驟見.onion 服務架設指南):

  • 自我驗證的位址:v3 的 .onion 位址長 56 個字元,由服務的 ed25519 公鑰編碼而成,不需要 DNS 與憑證機構,也少了一個網域解析被攔截或竄改的環節1。
  • 描述檔發布(descriptor publishing):服務把含有引介點(introduction point)的描述檔發布到 Hidden Service Directory(HSDir)。
  • 會合協定(rendezvous protocol):使用者與服務在 Tor 網路裡的會合點建立加密連線,雙方都不知道對方的 IP。

對網站發布的意義:

  1. 雙向的連線匿名:網站看不到訪客的 IP,訪客也看不到網站的 IP。
  2. 不依賴 DNS:.onion 位址可以自我驗證,沒有 CA 信任鏈的問題。
  3. 不受 IP 封鎖影響:流量都在 Tor 網路裡,封鎖網站的 IP 沒有作用。
  4. 不需要公開的 IPv4 位址:在 NAT 後方或浮動 IP 上都能啟動。

設計上的限制:

  • 效能:用戶端三跳加上服務端三跳,共六個中繼組成一條電路,再加上會合的過程,延遲比直連高。
  • 依賴 Tor 網路:Tor 中繼被大量封鎖時,整個 .onion 生態系都受影響。
  • 不適合大量靜態資源:圖片與影片經由 Tor 傳送的成本高。
  • 訪客門檻:訪客需要 Tor Browser 或支援 onion 的用戶端。

IPFS 與 onion 的對照

IPFS 與 onion 的架構對照。IPFS 從閘道經 DHT 查詢到持有 CID 的節點,主要解決抗刪除。Onion 從 Guard、Middle 到會合點,服務的描述檔放在 HSDir,主要解決連線匿名

項目 IPFS Onion
主要解決的問題 抗刪除、避免集中失效 連線匿名、抗 IP 封鎖
訪客匿名 ❌ 沒有內建 ✅ 預設提供
服務匿名 ❌ 節點 IP 可見 ✅ 預設提供
竄改偵測 ✅(CID 即 hash) 需另外靠 TLS 或簽章
抗下架 ✅(多個節點 pin) 部分(營運者可以關閉單一服務)
大型檔案的效能 中等 差
動態內容 困難 與一般網站相近
訪客門檻 低(瀏覽器經由閘道) 高(需要 Tor Browser)

需要抗刪除選 IPFS,需要連線匿名選 onion,兩者都需要時,同一個網站同時發布兩份鏡像。

已知限制與風險

挑選組合之前,需要先考量兩種技術各自做不到的部分:

  • IPFS 沒有連線匿名:PeerID 長期不變,DHT 查詢在公開網路上進行,第三方看得到哪個 IP 在找哪個 CID(完整的暴露面見常被誤認為匿名的網路)。
  • IPFS 的內容存續仰賴主動 pin:Pinata 這類中心化的 pin 服務,或 Filecoin 這類以代幣獎勵運作的去中心化儲存協定,都讓永久保存重新依賴第三方。
  • Onion 服務依賴 Tor 網路:Tor 中繼被大量封鎖,或 Tor Project 停止維運,.onion 生態系都會受影響。
  • 入口多半仍是中心化服務:讀者透過公開閘道或 Tor Browser 連線,這些入口本身就是潛在的攻擊面。公開閘道也會整批停止營運,網址寫死在單一閘道上的網站,閘道停止營運時對外連結會一起失效。
  • 法律上的灰色地帶:架設 Tor 出口節點、提供 IPFS pin 服務,在不同的司法管轄下風險不同。

常見組合

Onion 與 IPFS 雙鏡像

主站照常發布在一般網路上,另外提供兩份鏡像:

  • IPFS 鏡像:每次發布的內容對應一個 CID,社群志工可以協助 pin(做法見文件站 IPFS 鏡像的 pin 節點)。
  • Onion 鏡像:內容與主站相同,提供匿名連線。

EFF2、Proton、BBC 與美國中央情報局(CIA)都架設過官方的 onion 鏡像,紐約時報從 2017 年起提供的 onion 版在 2025 年 3 月關閉3。Cloudflare 另外提供 Onion Routing,網站在 Cloudflare 啟用之後,回應會帶上 alt-svc 標頭,Tor Browser 的訪客改由 Cloudflare 的 .onion 端點連入,不經過出口節點4。

IPFS 與 ENS

ENS(Ethereum Name Service,以太坊名稱服務)可以替 IPFS 內容取一個好記的名稱(例如 example.eth),由 ENS 上的紀錄指向目前的 CID,每次更新內容就更新一次紀錄。ENS 本身依賴以太坊區塊鏈,名稱也需要付費,去中心化的程度有前提。

anoni.net 文件站的部署

anoni.net 文件站同時發布標準網站、onion 與 IPFS 三份,內容相同,三套建置流程各自處理網址與路徑的差異。

anoni.net 文件站的三軌部署。同一份 GitHub repo 經過三套建置腳本處理路徑差異,分別部署到主站 anoni.net、IPFS 網路與 .onion 服務

  1. 原始檔:MkDocs Material 格式的 Markdown,放在 GitHub 的 anoni-net/docs。
  2. 標準網站與 onion:推送 docs 分支時,GitHub Actions 的 build_docs.yml 同時建置兩份三語系的靜態網站,以 aws s3 sync --delete 上傳到同一個 S3 bucket 的不同 prefix(docs/ 與 docs-onion/),標準網站經由 Cloudflare 對外提供。onion 那份在建置前先執行 replace_sitename_anoni_onion.sh,把站內網址改寫成 docs.<onion 位址>,並拿掉分析腳本與 service worker。build_docs_anoni.sh 與 build_docs_anoni_onion.sh 是同樣步驟的本機版本。
  3. IPFS:build_docs_anoni_ipfs.sh 不在 workflow 裡,需要另外執行。腳本先把網址改寫成 IPFS 閘道的位址,建置三語系,確認產物裡沒有殘留主站網址,再由 upload_to_ipfs.sh 上傳並更新 IPNS 名稱。社群自架的閘道是 ipfs.anoni.net,_dnslink.anoni.net 也指向同一個 IPNS 名稱。

讀者如何用 onion 或 IPFS 讀文件站、連線過程中誰看得到什麼,見你正在用哪一種方式閱讀。

維運上的取捨

  • pin 與內容存續:社群成員可以協助 pin,提高內容的存續機會(操作指南),沒有正式的保證。
  • Onion 的延遲:經由 Tor 連線時,SPA 或大型 JavaScript 套件的使用體驗較差,文件站因此維持一頁一個 HTML 的靜態網站。
  • 三個網址的定位:標準網站是主要入口,IPFS 與 onion 是備援與抗封鎖的管道。

實際運作的限制

  • IPFS 公開閘道有時不穩定,影響第一次載入。閘道也可能停止營運,所以鏡像的站內連結採用網站根目錄的相對路徑,更換閘道不需要重建整份鏡像。
  • IPFS 鏡像需要另外建置與上傳,更新時間可能晚於標準網站與 onion。
  • 三語系的資源讓 IPFS 上的 CID 數量增加,pin 清單隨之變長。

相關閱讀

可參與的專案


  1. V3 onion services usage - The Tor Project ↩

  2. EFF Now Has Tor Onions - Electronic Frontier Foundation ↩

  3. [Onion services] Remove NYTimes logo - Tor Project GitLab ↩

  4. Onion Routing - Cloudflare Docs ↩