今天,您將學習如何免費使用 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 綁定添加到此工作人員。

部署上述工作人員後,我們啟動 TOR 瀏覽器 並測試:

阻止 TOR 結果

如您所見,它完全按預期工作。 TOR 網絡 IP 的阻塞、中繼和網橋。

請注意,我已將其從我自己的網站中刪除,因此如果您現在嘗試通過 TOR 訪問,它將起作用(我沒有理由阻止 TOR)。

計算成本

在這篇文章的開頭,我提到了 Free Worker 限制足以阻止 TOR,而且確實如此。我還提到我已經做了很多測試來找出創建這個項目的最佳方式。

在我的測試中,我使用了許多 READ/WRITE/LIST/DELETE 請求,最終每月花費大約 60-100 美元。不理想是嗎? 😳

所以我想出了一種每小時只寫一次的方法。這意味著每天 24 次寫入,每月 744 次寫入(31 天)。

這保留在 Workers KV 的免費層內,您可以阻止 TOR。

有用的鏈接

就是這樣,我希望這篇文章和工具對你有所幫助。

讓我知道你的想法!