Heute lernen Sie, wie Sie TOR-Netzwerk-IPs (Relays und Bridges) mit Cloudflare Workers kostenlos blockieren können.

Bevor wir ins Detail gehen, muss ich Sie darüber informieren, dass Cloudflare kürzlich Managed Lists eingeführt hat, mit denen TOR mit einem Klick blockiert werden kann. Der einzige Nachteil ist, dass diese nur für Enterprise-Kunden verfügbar sind.

Wenn Sie es sich leisten können, großartig; Sie können diesen Beitrag ignorieren. Wenn Sie sich jedoch keinen Enterprise-Plan leisten können, lesen Sie bitte weiter.

TOR-Netzwerk blockieren

Ursprünglich habe ich einen Worker erstellt, der nur als Cron-Job verwendet werden sollte, die TOR-IPs abruft, sie parst und in Cloudflare Lists speichert. Diese Liste würde dann über jede Ihrer Websites in den Firewall Rules verwendet werden.

Das Hauptproblem mit der Lists-Funktion war, dass sie auf 10.000 Einträge über alle Listen begrenzt ist. Es spielt also keine Rolle, ob Sie einen Business- oder Enterprise-Plan haben, das ist derzeit das Limit wie hier dokumentiert.

Das andere Problem war, dass Sie derzeit keine einzelnen IPv6-Adressen speichern können, wie hier angegeben.

Mit diesen beiden großen Problemen ist die Verwendung von Listen keine praktikable Option; also bin ich stattdessen zu Workers KV gewechselt. Nach vielen Tests und Diskussionen mit mehreren Personen auf dem Discord-Kanal von Cloudflare habe ich den besten Weg gefunden, diese TOR-IPs zu speichern und abzufragen.

Mit einem “cleveren” Ansatz speichere ich nur einen Eintrag (key:value) für alle TOR-IPs; was die Kosten erheblich senkt.

Das funktioniert, weil das Workers KV Value-Limit 25 Mb beträgt, während die vielen IPs, die wir speichern, nur ein paar Kb einnehmen.

Die Limits des kostenlosen Workers KV -Plans reichen mehr als aus, um diese IPs ständig zu schreiben/lesen. Und falls es nicht ausreicht, kann Caching innerhalb des Workers angewendet werden (ich habe bereits ein 10-Minuten-Caching auf READ angewendet) und der Plan kann für nur 5$/Monat aufgerüstet werden.

Natürlich können Sie auch clever mit der Nutzung umgehen und die Benutzer-IP nur in bestimmten Bereichen überprüfen, die Sie schützen möchten, zum Beispiel Login-Bereiche und andere.

Der Service Worker

Ich habe einen sofort einsatzbereiten Worker für Sie auf Github vorbereitet.

Alles, was Sie tun müssen, ist ihn zu klonen, die Anforderungen zu konfigurieren und zu veröffentlichen.

Konfiguration

Damit dies funktioniert, benötigen Sie ein paar Dinge:

  • Wrangler
  • Ihre Account ID
  • Einen KV Namespace

Um Ihre Account ID zu erhalten, öffnen Sie einfach eine Ihrer Websites auf Cloudflare und überprüfen Sie die untere rechte Seite auf der “Overview”-Seite. Sobald Sie die Account ID haben, speichern Sie sie einfach in wrangler.toml:

1account_id = "..."

Um den Worker KV Namespace zu erstellen, führen Sie den folgenden Befehl aus:

sudo wrangler kv:namespace create storage

Das Ergebnis sollte sein:

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]

Bearbeiten Sie mit der obigen ID wrangler.toml und speichern Sie die ID:

1[[kv_namespaces]]
2binding = "TOR_COMBINED_LIST"
3id = "cc309bd612d9476f8abdc43ec4f93fd6"

Bitte erstellen Sie den KV Namespace nicht selbst, verwenden Sie den obigen Befehl. KV Binding ist erforderlich, ignorieren Sie es nicht.

Sobald die obigen Schritte abgeschlossen sind, veröffentlichen Sie den Worker:

sudo wrangler publish

Der Worker ist so konfiguriert, dass er alle 60 Minuten (eine Stunde) ausgeführt wird. Wenn Sie dies ändern möchten, bearbeiten Sie einfach wrangler.toml. Kürzere Intervalle helfen nicht, da die API nur stündlich aktualisiert wird.

Die Liste verwenden

Jetzt haben Sie eine Liste von TOR-Netzwerk-IPs und es ist Zeit, sie zu verwenden. Das ist extrem einfach, wenn Sie bereits mit Workers vertraut sind, und wenn nicht, ist es trotzdem einfach.

Die Idee ist, die eingehende Benutzer-IP gegen die Liste zu prüfen und bei einer Übereinstimmung die Anfrage zu blockieren. Unten ein einfaches Starter-Skript, das Sie einfach kopieren und in einen neuen Worker einfügen können:

 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", {
 7headers: {
 8'content-type': 'text/html;charset=UTF-8',
 9},
10status: 403
11});
12}

Die Abfrage ist extrem schnell, da die Liste der IPs als ein Objekt gespeichert wird, sodass Sie nichts parsen oder nachschlagen müssen.

Caching wird ebenfalls angewendet (Sie können es deaktivieren, wenn Sie möchten), um die Dinge noch mehr zu beschleunigen. Workers KV Cache funktioniert über die Cache API .

Sobald Sie den Wert abgerufen haben, überprüfen Sie einfach, ob die IP existiert, und wenn ja, geben Sie zurück, was Sie möchten.

Verwenden Sie das obige Snippet überall in Ihrem neuen oder bestehenden Worker (und sogar Cloudflare Pages), solange das Request-Objekt verfügbar ist.

Die Liste testen

Wie bereits erwähnt, ist es extrem einfach, diese Liste zu verwenden, auch wenn Sie Workers noch nie benutzt haben.

Ich habe ein kleines Beispiel erstellt, das Sie einfach kopieren, einfügen und auf jeder Ihrer Websites verwenden können:

 1addEventListener("fetch", event => {
 2event.respondWith(handleRequest(event.request))
 3})
 4
 5const html = `<!doctype html>
 6
 7<html lang="en">
 8  <head>
 9    <title>Access Denied</title>
10    <meta charset="utf-8">
11    <meta http-equiv="X-UA-Compatible" content="IE=Edge" />
12    <meta name="robots" content="noindex, nofollow" />
13    <meta name="viewport" content="width=device-width, initial-scale=1">
14    <link href="https://cdn.jsdelivr.net/npm/[email protected]/dist/css/bootstrap.min.css" rel="stylesheet" integrity="sha384-EVSTQN3/azprG1Anm3QDgpJLIm9Nao0Yz1ztcQTwFspd3yD65VohhpuuCOmLASjC" crossorigin="anonymous"> 
15  </head>
16  <body>
17    <div class="container">
18      <h1 class="mt-5 text-center">Oops!</h1>
19      <h2 class="mt-2 text-center text-danger">TOR Network is not allowed.</h2>
20    </div>
21  </body>
22</html>`;
23
24async function handleRequest(request)
25{
26const clientIP = request.headers.get('CF-Connecting-IP');
27const ipset = await TOR_COMBINED_LIST.get("ipset", { type: "json", cacheTtl: 600 });
28
29if (ipset[clientIP])
30{
31return new Response(html, {
32headers: {
33'content-type': 'text/html;charset=UTF-8',
34},
35status: 403
36});
37}
38
39const response = await fetch(request);
40
41return response;
42}

Vergessen Sie nicht, das KV Binding zu diesem Worker hinzuzufügen.

Mit dem oben bereitgestellten Worker starten wir den TOR Browser und testen:

Block TOR Result

Wie Sie sehen können, funktioniert es genau wie erwartet. TOR-Netzwerk-IPs blockiert, Relays und Bridges.

Bitte beachten Sie, dass ich dies von meiner eigenen Website entfernt habe. Wenn Sie also jetzt über TOR darauf zugreifen, wird es funktionieren (ich habe keinen Grund, TOR zu blockieren).

Kostenberechnung

Gleich zu Beginn dieses Beitrags habe ich erwähnt, dass die kostenlosen Worker-Limits ausreichen, um TOR zu blockieren, und das tun sie auch. Ich habe auch erwähnt, dass ich viele Tests durchgeführt habe, um den besten Weg für dieses Projekt zu finden.

Während meiner Tests habe ich viele READ/WRITE/LIST/DELETE-Anfragen verwendet, die am Ende etwa 60-100$ pro Monat gekostet haben. Nicht ideal, oder? 😳

Also habe ich einen Weg gefunden, nur einen WRITE pro Stunde durchzuführen. Das bedeutet 24 WRITE(s) pro Tag, 744 WRITE(s) pro Monat (31 Tage).

Das bleibt innerhalb des kostenlosen Tiers für Workers KV und Sie können TOR blockieren.

Das war’s, ich hoffe dieser Artikel und dieses Tool hat Ihnen geholfen.

Lassen Sie mich Ihre Meinung wissen!