今天,您将学习如何免费使用 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。

有用的链接

就是这样,我希望这篇文章和工具对你有所帮助。

让我知道你的想法!