前言
我的博客本身擁有一個正常可訪問的域名, 為其額外添加一個 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 的處理器作為基準, 以下是獲得限定長度的域名的估計用時.
Characters | Time |
---|---|
1 | Less than 1 second |
2 | Less than 1 second |
3 | Less than 1 second |
4 | 2 seconds |
5 | 1 minute |
6 | 30 minutes |
7 | 1 day |
8 | 25 days |
9 | 2.5 years |
10 | 40 years |
11 | 640 years |
12 | 10 millennia |
13 | 160 millennia |
14 | 2.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.
Onion-Location这个功能看起来挺不错的,正好也给我的网站搭了一个多种网络访问的方式,可以拿来一用
可惜i2p没有官方的浏览器不支持这种功能……看博主前几天注册了个i2p的域名?会不会考虑研究一下呢?
(I2P 其實有官方的瀏覽器但是沒人用)
我觉得最接近的方案是插一个js, 检测i2p域名是否能被访问到
function isReachable(webAddress) {
// Use the
fetch()
method to send a GET request to the specified web addressfetch(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 不一样