Oggi imparerai come bloccare gli IP della rete TOR (relay e bridge) usando Cloudflare Workers gratuitamente.

Prima di addentrarci in qualsiasi cosa, devo informarti che Cloudflare ha recentemente introdotto le Managed Lists dove il blocco di TOR può essere fatto con un clic. L’unico svantaggio è che queste sono disponibili solo per i clienti Enterprise.

Se te lo puoi permettere, ottimo; puoi ignorare questo post. Se invece non puoi permetterti un piano Enterprise, continua a leggere.

Bloccare la rete TOR

Inizialmente ho creato un worker che sarebbe stato usato solo come cron job, per recuperare gli IP TOR, analizzarli e archiviarli nelle Cloudflare Lists. Questa lista sarebbe stata poi usata su qualsiasi sito web nelle Firewall Rules.

Il problema principale con la funzione Lists era che è limitata a 10.000 elementi su tutte le liste. Quindi non importa se hai un piano Business o Enterprise, questo è il limite attuale come documentato qui .

L’altro problema era che attualmente non puoi memorizzare singoli indirizzi IPv6, come indicato qui .

Con questi due problemi principali, usare le liste non è un’opzione praticabile; quindi sono passato a Workers KV. Dopo molti test e discussioni con diverse persone sul canale Discord di Cloudflare, ho trovato il modo migliore per memorizzare questi IP TOR e interrogarli.

Usando un approccio “intelligente”, memorizzo solo una voce (key:value) per tutti gli IP TOR; risparmiando considerevolmente sui costi.

Questo funziona perché il limite di valore di Workers KV è 25 Mb, mentre i molti IP che memorizziamo occupano fino a… solo pochi Kb.

I limiti del piano gratuito di Workers KV sono più che sufficienti per scrivere/leggere questi IP costantemente. E nel caso non bastasse, il caching può essere applicato all’interno del worker (ho già applicato un caching di 10 minuti su READ) e il piano può essere aggiornato per soli 5$/mese.

Naturalmente puoi anche essere intelligente nell’utilizzo e controllare l’IP dell’utente solo in aree specifiche che vuoi proteggere, ad esempio aree di Login e altre.

Il service worker

Ho preparato un worker pronto all’uso per te su Github .

Tutto quello che devi fare è clonarlo, configurare i requisiti e pubblicarlo.

Configurazione

Affinché questo funzioni, hai bisogno di alcune cose:

  • Wrangler
  • Il tuo Account ID
  • Un KV Namespace

Per ottenere il tuo Account ID, apri semplicemente uno qualsiasi dei tuoi siti web su Cloudflare e controlla il lato inferiore destro nella pagina “Overview”. Una volta ottenuto l’Account ID, memorizzalo semplicemente in wrangler.toml:

1account_id = "..."

Per creare il Worker KV Namespace esegui il seguente comando:

sudo wrangler kv:namespace create storage

Il risultato dovrebbe essere:

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]

Usando l’ID sopra, modifica wrangler.toml e memorizza l’ID:

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

Per favore non creare il KV Namespace manualmente, usa il comando sopra. Il KV Binding è necessario, non ignorarlo.

Una volta completati i passaggi sopra, pubblica il worker:

sudo wrangler publish

Il worker è configurato per essere eseguito ogni 60 minuti (un’ora), se vuoi cambiare basta modificare wrangler.toml. Periodi più brevi non aiuteranno poiché l’API si aggiorna solo ogni ora.

Usare la lista

Ora hai una lista di IP della rete TOR ed è ora di usarla. Questo è estremamente semplice se hai già familiarità con i workers, e se non ce l’hai è comunque facile.

L’idea è controllare l’IP dell’utente in ingresso rispetto alla lista e se c’è una corrispondenza, bloccare la richiesta. Di seguito uno script di avvio semplice che puoi semplicemente copiare e incollare in un nuovo worker:

 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}

La ricerca è estremamente veloce perché la lista degli IP è memorizzata come un singolo oggetto, quindi non è necessario analizzare o cercare nulla.

Il caching è anche applicato (puoi disabilitarlo se vuoi) per velocizzare ulteriormente le cose. La cache di Workers KV funziona usando la Cache API .

Una volta recuperato il valore, controlla semplicemente se l’IP esiste, e se sì restituisci quello che vuoi.

Usa lo snippet sopra ovunque all’interno del tuo worker nuovo o esistente (e anche Cloudflare Pages), purché l’oggetto request sia disponibile.

Testare la lista

Come menzionato in precedenza, è estremamente facile usare questa lista anche se non hai mai usato Workers prima.

Ho creato un piccolo esempio che puoi semplicemente copiare, incollare e usare su qualsiasi dei tuoi siti web:

 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}

Non dimenticare di aggiungere il KV Binding a questo worker.

Con il worker sopra distribuito, avviamo il TOR Browser e testiamo:

Block TOR Result

Come puoi vedere, funziona esattamente come previsto. IP della rete TOR bloccati, relay e bridge.

Tieni presente che ho rimosso questo dal mio sito web, quindi se provi ad accedere tramite TOR ora funzionerà (non ho motivo di bloccare TOR).

Calcolo dei costi

All’inizio di questo post ho menzionato che i limiti gratuiti dei Worker sono sufficienti per bloccare TOR, e lo sono. Ho anche menzionato che ho fatto molti test per capire il modo migliore di creare questo progetto.

Durante i miei test ho usato molte richieste READ/WRITE/LIST/DELETE che sono finite per costare circa 60-100$ al mese. Non ideale vero? 😳

Quindi ho trovato un modo per fare solo un WRITE all’ora. Ciò significa 24 WRITE al giorno, 744 WRITE al mese (31 giorni).

Questo rimane entro il livello gratuito per Workers KV e puoi bloccare TOR.

Bene, questo è tutto, spero che questo articolo e strumento ti sia stato utile.

Fammi sapere cosa ne pensi!