今天,您將學習如何免費使用 Cloudflare Workers 阻止 TOR 網絡 IP(中繼和網橋)。
在我們深入研究之前,我必須通知您 Cloudflare 最近引入了 Managed Lists ,其中阻止 TOR 可以通過單擊完成。唯一的缺點是這些僅適用於企業客戶。
如果你能負擔得起,那就太好了;你可以忽略這篇文章。但是,如果您買不起企業計劃,請繼續閱讀。
阻止 TOR 網絡
最初,我創建了一個僅用作 cron 作業的工作程序,獲取 TOR IP,解析它們並將它們存儲到 Cloudflare 列表中。然後,此列表將用於您在防火牆規則內擁有的任何網站。
列表功能的主要問題是它在所有列表中限制為 10,000 個項目。因此,即使您使用的是商業或企業計劃也沒關係,這就是現在記錄的限制 [此處](https://developers.cloudflare.com/firewall/cf-firewall-rules/rules-lists/# 可用性)。
另一個問題是您現在無法存儲單個 IPv6 地址,如 [此處] 所述(https://community.cloudflare.com/t/unable-to-add-ipv6-ip-address-to-firewall-list /256307)。
對於這兩個主要問題,使用列表不是一個可行的選擇;所以我選擇了 Workers KV。在 Cloudflare 的 Discord 頻道上與幾個人進行了多次測試和討論後,我找到了存儲這些 TOP IP 並查詢它們的最佳方法。
使用“智能”方法,我只為所有 TOR IP 存儲一個條目(鍵:值);大大節省成本。
之所以可行,是因為 Workers KV 值限制為 25 Mb,而我們存儲的許多 IP 只佔用……幾個 Kb。
Workers KV 免費計劃的限制足以持續寫入/讀取這些 IP。如果這還不夠,可以在工作人員內部應用緩存(我已經在 READ 上應用了 10 分鐘的緩存),並且該計劃只需 5 美元/月即可升級。
當然,您也可以了解它的使用情況,並僅在您想要保護的特定區域檢查用戶 IP,例如登錄區域和其他區域。
服務工作者
我在 Github 上為您準備了一個隨時可用的 worker。
您所要做的就是克隆它,配置需求並發布它。
### 配置
為了使它起作用,您需要做幾件事:
- 牧馬人
- 您的帳戶 ID
- 一個 KV 命名空間
要獲取您的帳戶 ID,只需在 Cloudflare 上打開您的任何網站,然後查看“概覽”頁面的右下方。獲得帳戶 ID 後,只需將其存儲在 wrangler.toml
中:
1account_id = "..."
要創建 Worker KV 命名空間,請執行以下命令:
sudo wrangler kv:namespace create storage
結果應該是:
1🌀 Creating namespace with title "cloudflare-block-tor-worker-storage"
2✨ Success!
3Add the following to your configuration file:
4kv_namespaces = [
5 { binding = "storage", id = "cc309bd612d9476f8abdc43ec4f93fd6" }
6]
使用上面的 ID,編輯 wrangler.toml
並存儲 ID:
1[[kv_namespaces]]
2 binding = "TOR_COMBINED_LIST"
3 id = "cc309bd612d9476f8abdc43ec4f93fd6"
請不要自己創建 KV 命名空間,使用上面的命令。 KV Binding 是必需的,不要忽略它。
完成上述步驟後,發布工作人員:
sudo wrangler publish
工作人員配置為每 60 分鐘(一小時)運行一次,如果您想更改此設置,只需編輯 wrangler.toml
。不過,較短的周期將無濟於事,因為 API 僅每小時更新一次。
使用列表
現在你有了一個 TOR 網絡 IP 的列表,是時候使用它了。如果您已經熟悉工人,這非常簡單,如果您不熟悉,這仍然很容易。
這個想法是根據列表檢查傳入的用戶 IP,如果匹配,則阻止請求。下面是一個簡單的啟動腳本,您可以簡單地將其複制並粘貼到新的工作人員中:
1const clientIP = request.headers.get('CF-Connecting-IP');
2const ipset = await TOR_COMBINED_LIST.get("ipset", { type: "json", cacheTtl: 600 });
3
4if (ipset[clientIP])
5{
6return new Response("TOR is Forbidden", {
7 headers: {
8 'content-type': 'text/html;charset=UTF-8',
9 },
10 status: 403
11});
12}
查找速度非常快,因為 IP 列表存儲為一個對象,因此您無需解析或查找任何內容。
還應用了緩存(如果需要,可以禁用它)以進一步加快速度。 Workers KV 緩存通過使用 Cache API 工作。
一旦您檢索到該值,您只需檢查 IP 是否存在,如果它確實返回您想要的任何內容。
只要您有可用的請求對象,就可以在新的或現有的工作人員(甚至 Cloudflare 頁面)內的任何地方使用上述代碼段。
測試列表
如前所述,即使您以前從未使用過 Workers,使用此列表也非常容易。
我做了一個小例子,你可以簡單地複制粘貼並在你的任何網站上使用它:
1addEventListener("fetch", event => {
2 event.respondWith(handleRequest(event.request))
3})
4
5const html = `<!doctype html>
6<html lang="en">
7 <head>
8 <title>Access Denied</title>
9 <meta charset="utf-8">
10 <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
11 <meta name="robots" content="noindex, nofollow" />
12 <meta name="viewport" content="width=device-width, initial-scale=1">
13 <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous">
14 </head>
15 <body>
16 <div class="container">
17 <h1 class="mt-5 text-center">Oops!</h1>
18 <h2 class="mt-2 text-center text-danger">TOR Network is not allowed.</h2>
19 </div>
20 </body>
21</html>`;
22
23async function handleRequest(request)
24{
25 const clientIP = request.headers.get('CF-Connecting-IP');
26 const ipset = await TOR_COMBINED_LIST.get("ipset", { type: "json", cacheTtl: 600 });
27
28 if (ipset[clientIP])
29 {
30 return new Response(html, {
31 headers: {
32 'content-type': 'text/html;charset=UTF-8',
33 },
34 status: 403
35 });
36 }
37
38 const response = await fetch(request);
39
40 return response;
41}
不要忘記將 KV 綁定添加到此工作人員。
您必須在 Cloudflare 設置的“網絡”選項卡上禁用“洋蔥路由”。否則,“CF-Connecting-IP”標頭將包含 Cloudflare 數據中心 IP,腳本將看不到 TOR 網絡 IP。
部署上述工作人員後,我們啟動 TOR 瀏覽器 並測試:
如您所見,它完全按預期工作。 TOR 網絡 IP 的阻塞、中繼和網橋。
請注意,我已將其從我自己的網站中刪除,因此如果您現在嘗試通過 TOR 訪問,它將起作用(我沒有理由阻止 TOR)。
計算成本
在這篇文章的開頭,我提到了 Free Worker 限制足以阻止 TOR,而且確實如此。我還提到我已經做了很多測試來找出創建這個項目的最佳方式。
在我的測試中,我使用了許多 READ/WRITE/LIST/DELETE 請求,最終每月花費大約 60-100 美元。不理想是嗎? 😳
所以我想出了一種每小時只寫一次的方法。這意味著每天 24 次寫入,每月 744 次寫入(31 天)。
這保留在 Workers KV 的免費層內,您可以阻止 TOR。
有用的鏈接
- 開始使用牧馬人: https://developers.cloudflare.com/workers/wrangler/get-started/
- 開始使用 Workers: https://developers.cloudflare.com/workers/get-started/quickstarts/
- 設置 KV 綁定: https://developers.cloudflare.com/workers/runtime-apis/kv/#kv-bindings
就是這樣,我希望這篇文章和工具對你有所幫助。
讓我知道你的想法!
評論