為 WordPress 添加 Onion 域名

前言

我的博客本身擁有一個正常可訪問的域名, 為其額外添加一個 Onion 域名對我的安全係數不會有任何顯著的提升. 事實上, 對系統的穩定性可能有害無益因為我的博客本身是跑在 Cloudflare 防火牆後面的, 而啟用 Tor 之後, Tor 用戶就可以通過 Onion 域名直接訪問 WordPress 服務, 從而使 DDoS 以及其他攻擊變得反而更加輕鬆. 我之所以這麼做完全是好奇心使然, 如果你不清楚你在幹什麼, 請不要輕易模仿!

生成一個個性化 Tor 域名 (可選)

在 2021 年下半年 Tor Project 已經宣布停止使用 Onion v2 域名, 這意味著域名長度從 16 個字符 (不包括 .onion 後綴) 增長到了恐怖的 56 個字符, 也意味著訪客通過域名辨認網站的可能性從 “幾乎不可能” 變成了 “Impossible”.

Tor 的 56 個字符是通過特殊的哈希算法生成的, 在第一次跑 Hidden Service 的時候會自動隨機生成一個, 目錄默認位置 /var/lib/tor/hidden_service.

➜  hidden_service ls
authorized_clients  hostname  hs_ed25519_public_key  hs_ed25519_secret_key

其中 hostname 文件包含了 onion 域名, 其餘兩個 hs_ 開頭的文件分別是域名的公鑰與私鑰.

因為是哈希生成的, 如果嘗試次數夠多, 就會找到一個以特殊字串開頭的 “個性化” 域名. 在這裏我使用的是 cathugger/mkp224o . 使用以下命令下載並編譯程序:

apt install gcc libsodium-dev make autoconf git

git clone https://github.com/cathugger/mkp224o
cd mkp224o
./autogen.sh
./configure
make

使用以下命令生成域名. 假設我想要生成的域名以 justin 開頭…

# ./mkp224o -t $(nproc) -d results justin
set workdir: results/
sorting filters... done.
filters:
	justin
in total, 1 filter
using 8 threads
justinl44rhfvebsd7zzaht7bsyhc2r44xwy7uhnkldqqm4htymhqdad.onion
justinj3wlpcojvtodd7bp6psvdwuritxnhrywl6mgcaxry6mcl22dad.onion
waiting for threads to finish... done.

以上命令的意思是, 使用所有核心並行運算尋找 justin 開頭的域名, 將結果儲存至 results 目錄下.

順便提一下, 根據這篇文章, 以一個單核單線程 1.5 GHz 的處理器作為基準, 以下是獲得限定長度的域名的估計用時.

CharactersTime
1Less than 1 second
2Less than 1 second
3Less than 1 second
42 seconds
51 minute
630 minutes
71 day
825 days
92.5 years
1040 years
11640 years
1210 millennia
13160 millennia
142.6 million years

目前我看到過的最長 onion v3 域名是 https://duckduckgogg42xjoc72x3sjasowoarfbgcmvfimaftt6twagswzczad.onion/

居然有12個字母長… 我反正是不曉得 ddg 是怎麼跑出來的… 估計是一大堆顯卡並行計算的結果吧.

順便一提, 生成自定義域名對於 duckduckgo 這種公司來說好處不少. 首先是增加了品牌的辨識度, 然後順帶解決了仿冒的問題. 一般的 hacker 肯定沒有足夠算力找到下一個 duckduckgogg 開頭的域名, 因此從根本上就杜絕了假冒網站的可能性.

啟動 Onion 服務

/etc/tortorrc 文件的內容替換為:

SocksPort 0.0.0.0:9050
Log notice file /var/log/tor/notices.log
DataDirectory /var/lib/tor
HiddenServiceDir /var/lib/tor/hidden_service/
HiddenServicePort 80 127.0.0.1:80 # Your wordpress addr

輸入 tor 初次啟動, 等個一分鐘後關閉 tor, 然後將之前生成的自定義域名對應的公鑰私鑰和 hostname 拷貝並替換 /var/lib/tor/hidden_service/ 目錄下的同名文件.

輸入以下指令啟用 tor 服務:

systemctl enable tor
systemctl start tor

為 WordPress 設置支持多個域名

WordPress 默認只支持一個域名訪問, 如果將其他域名 CNAME 到當前域名, wordpress 會強制跳轉到設置的域名. 也就是說, .onion 域名會被立即跳轉到正常域名, 那也就失去意義了.
下面是一種同時啟用正常域名和 Tor 域名的方法.

Disclaimer:
本部分轉載自老左博客, 若有侵權, 請發電郵至 [email protected] 刪除!

wp-config.php 文件中添加以下幾行:

/** Add multiple domain support */

$domain = array("YOURDOMAIN.com", "YOURONIONDOMAIN.onion");

if(in_array($_SERVER['HTTP_HOST'], $domain))
{
define('WP_SITEURL', 'http://' . $_SERVER['HTTP_HOST']);
define('WP_HOME', 'http://' . $_SERVER['HTTP_HOST']);
}

define( 'WP_CONTENT_URL', '/wp-content');

其中第一句定義了一個數組, 任何數組元素將被視為合法域名.
最後一句意思是使用當前域名加載靜態資源.

提示瀏覽器 Onion Domain Available (可選)

如上圖所示, Tor 瀏覽器使用 Onion-Location HTTP 標頭來獲取網站的 onion 域名位置, 具體的文檔可以在這裏找到.

要設置 Onion-Location 標頭, 可以修改 Apache 或者 Nginx 的配置文件.

  • Apache: /var/www/html/.htaccess
<IfModule mod_headers.c>
  <FilesMatch "\.(php|html)$">
    Header set Onion-Location "http://YOURONIONDOMAIN.onion"
  </FilesMatch>
</IfModule>
  • Ngnix:
location ~* \.(php|html)$ {
    add_header Onion-Location "http://YOURONIONDOMAIN.onion";
}

當然, 如果使用 cloudflare 的服務, 可以直接在 規則 -> 轉換規則中新建一條 HTTP 响应头修改規則, 像這樣:

結語

配置到這裡, 網站已經上線 Tor, 大工吿成啦!

Tor 是一個 Community Powered, 完全免費的服務. 如果有條件, 希望可以為 Tor 社區做點貢獻. 最簡單, Risk Free 的貢獻就是自己維護一個 Snowflake 網橋 — 請參考博文 搭建一個 Snowflake 網橋.

Thumbnail: TOR Onion Logo Design in 3D by Mayank Shiroya
If using the image violates your rights, or there’s anything related to copyright laws, please contact me at [email protected], I will deal with them immediately.

在〈為 WordPress 添加 Onion 域名〉中有 2 則留言

  1. Onion-Location这个功能看起来挺不错的,正好也给我的网站搭了一个多种网络访问的方式,可以拿来一用
    可惜i2p没有官方的浏览器不支持这种功能……看博主前几天注册了个i2p的域名?会不会考虑研究一下呢?

    1. (I2P 其實有官方的瀏覽器但是沒人用)
      我觉得最接近的方案是插一个js, 检测i2p域名是否能被访问到

      function isReachable(webAddress) {
      // Use the fetch() method to send a GET request to the specified web address
      fetch(webAddress)
      .then(response => {
      if (response.ok) {
      return true;
      } else {
      return false;
      }
      })
      .catch(error => {
      return false;
      });
      }

      const webAddress = “justin.i2p”;

      if (isReachable(webAddress)) {
      const userChoice = window.confirm(“監測到你在使用 I2P 代理, 本博客有 I2P 版本, 是否將你重定向到 I2P 博客?”);

      if (userChoice) {
      window.location = webAddress;
      }
      }

      但是意义不大. I2P 的 Outproxy 慢到令人发指, 估计不会有很多用户挂着 I2P 访问明网, 这点和 Tor 不一样

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *

%d 位部落客按了讚: