今天,您将学习如何免费使用 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/
- 要开始使用 Worker: https://developers.cloudflare.com/workers/get-started/quickstarts/
- 要设置 KV 绑定: https://developers.cloudflare.com/workers/runtime-apis/kv/#kv-bindings
就是这样,我希望这篇文章和工具对你有所帮助。
让我知道你的想法!
评论