Astăzi vei învăța cum să blochezi IP-urile rețelei TOR (relay-uri și bridge-uri) folosind Cloudflare Workers gratuit.

Înainte de a intra în detalii, trebuie să te informez că Cloudflare a introdus recent Managed Lists unde blocarea TOR se poate face cu un singur click. Singurul dezavantaj este că acestea sunt disponibile doar pentru clienții Enterprise.

Dacă îți permiți, excelent; poți ignora această postare. Cu toate acestea, dacă nu îți poți permite un plan Enterprise, continuă să citești.

Blocarea rețelei TOR

Inițial am creat un worker care trebuia folosit doar ca un cron job, să preia IP-urile TOR, să le parseze și să le stocheze în Cloudflare Lists. Această listă ar fi fost apoi folosită pe orice site web în Firewall Rules.

Problema principală cu funcția Lists era că este limitată la 10.000 de elemente pe toate listele. Deci nu contează dacă ai un plan Business sau Enterprise, aceasta este limita actuală așa cum este documentat aici .

Cealaltă problemă era că nu poți stoca adrese IPv6 individuale în prezent, așa cum este menționat aici .

Cu aceste două probleme majore, folosirea listelor nu este o opțiune viabilă; așa că am trecut la Workers KV. După multe teste și discuții cu mai multe persoane pe canalul Discord al Cloudflare, am găsit cel mai bun mod de a stoca aceste IP-uri TOR și de a le interoga.

Folosind o abordare “inteligentă”, stochez doar o singură intrare (key:value) pentru toate IP-urile TOR; economisind considerabil costurile.

Aceasta funcționează deoarece limita valorii Workers KV este de 25 Mb, în timp ce multe IP-uri pe care le stocăm ocupă doar câțiva Kb.

Limitele planului gratuit Workers KV sunt mai mult decât suficiente pentru a scrie/citi constant aceste IP-uri. Iar în cazul în care nu este suficient, caching-ul poate fi aplicat în interiorul worker-ului (am aplicat deja un caching de 10 minute pe READ) și planul poate fi actualizat pentru doar 5$/lună.

Desigur, poți fi și inteligent în utilizare și să verifici IP-ul utilizatorului doar în anumite zone pe care vrei să le protejezi, de exemplu zone de Login și altele.

Service worker-ul

Am pregătit un worker gata de utilizare pe Github .

Tot ce trebuie să faci este să îl clonezi, să configurezi cerințele și să îl publici.

Configurare

Pentru ca aceasta să funcționeze, ai nevoie de câteva lucruri:

  • Wrangler
  • Account ID-ul tău
  • Un KV Namespace

Pentru a obține Account ID-ul, deschide pur și simplu oricare dintre site-urile tale pe Cloudflare și verifică partea dreaptă de jos a paginii “Overview”. Odată ce ai Account ID-ul, stochează-l în wrangler.toml:

1account_id = "..."

Pentru a crea Worker KV Namespace, execută următoarea comandă:

sudo wrangler kv:namespace create storage

Rezultatul ar trebui să fie:

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]

Folosind ID-ul de mai sus, editează wrangler.toml și stochează ID-ul:

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

Te rog nu crea KV Namespace-ul manual, folosește comanda de mai sus. KV Binding este necesar, nu îl ignora.

Odată ce pașii de mai sus sunt finalizați, publică worker-ul:

sudo wrangler publish

Worker-ul este configurat să ruleze la fiecare 60 de minute (o oră), dacă vrei să schimbi pur și simplu editează wrangler.toml. Perioadele mai scurte nu vor ajuta deoarece API-ul se actualizează doar la fiecare oră.

Folosirea listei

Acum ai o listă de IP-uri ale rețelei TOR și este timpul să o folosești. Aceasta este extrem de simplu dacă ești deja familiarizat cu workers, și dacă nu ești, este totuși ușor.

Ideea este de a verifica IP-ul utilizatorului primit față de listă și dacă există o potrivire, de a bloca cererea. Mai jos un script simplu de pornire pe care îl poți copia și lipi într-un worker nou:

 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}

Căutarea este extrem de rapidă deoarece lista de IP-uri este stocată ca un singur obiect, deci nu trebuie să parsezi sau să cauți nimic.

Caching-ul este de asemenea aplicat (poți să îl dezactivezi dacă vrei) pentru a accelera și mai mult lucrurile. Cache-ul Workers KV funcționează folosind Cache API .

Odată ce ai recuperat valoarea, verifici pur și simplu dacă IP-ul există, și dacă da, returnează ce vrei.

Folosește fragmentul de cod de mai sus oriunde în worker-ul tău nou sau existent (și chiar Cloudflare Pages), atâta timp cât obiectul request este disponibil.

Testarea listei

Așa cum am menționat anterior, este extrem de ușor să folosești această listă chiar dacă nu ai folosit niciodată Workers.

Am făcut un mic exemplu pe care poți pur și simplu să îl copiezi, lipești și să îl folosești pe oricare dintre site-urile tale:

 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}

Nu uita să adaugi KV Binding la acest worker.

Cu worker-ul de mai sus deploiat, pornim TOR Browser și testăm:

Block TOR Result

Așa cum poți vedea, funcționează exact conform așteptărilor. IP-urile rețelei TOR sunt blocate, atât relay-uri cât și bridge-uri.

Te rog să reții că am eliminat aceasta de pe propriul meu site web, deci dacă încerci să accesezi prin TOR acum va funcționa (nu am niciun motiv să blochez TOR).

Calcularea costurilor

Chiar la începutul acestei postări am menționat că limitele gratuite ale Worker sunt suficiente pentru a bloca TOR, și sunt. Am menționat de asemenea că am făcut multe teste pentru a determina cel mai bun mod de a crea acest proiect.

În timpul testelor mele am folosit multe cereri READ/WRITE/LIST/DELETE care au ajuns să coste aproximativ 60-100$ pe lună. Nu tocmai ideal, nu? 😳

Așa că am găsit o modalitate de a face doar un WRITE pe oră. Aceasta înseamnă 24 WRITE-uri pe zi, 744 WRITE-uri pe lună (31 zile).

Aceasta rămâne în cadrul nivelului gratuit pentru Workers KV și poți bloca TOR.

Linkuri utile

Cam asta e tot, sper că acest articol și instrument te-a ajutat.

Spune-mi ce părere ai!