Aujourd’hui, vous apprendrez à bloquer les IP du réseau TOR (relais et ponts) à l’aide de Cloudflare Workers gratuitement.

Avant de creuser quoi que ce soit, je dois vous informer que Cloudflare a récemment introduit Managed Lists où le blocage de TOR peut se faire en un clic. Le seul inconvénient est qu’ils ne sont disponibles que pour les clients Enterprise.

Si vous pouvez vous le permettre, tant mieux; vous pouvez ignorer ce message. Cependant, si vous ne pouvez pas vous permettre un plan d’entreprise, continuez à lire.

Blocage du réseau TOR

Au départ, j’ai créé un travailleur qui ne serait utilisé que comme tâche cron, récupérer les IP TOR, les analyser et les stocker dans des listes Cloudflare. Cette liste serait ensuite utilisée sur tous les sites Web que vous possédez dans le cadre des règles de pare-feu.

Le principal problème avec la fonctionnalité Listes était qu’elle était limitée à 10 000 éléments dans toutes les listes. Donc, cela n’aura pas d’importance même si vous êtes sur un plan Business ou Enterprise, c’est la limite en ce moment comme documenté ici .

L’autre problème était que vous ne pouvez pas stocker d’adresses IPv6 individuelles pour le moment, comme indiqué ici .

Avec ces deux problèmes majeurs, l’utilisation de listes n’est pas une option viable ; alors je suis allé avec Workers KV à la place. Après de nombreux tests et discussions avec plusieurs personnes sur le canal Discord de Cloudflare, j’ai trouvé le meilleur moyen de stocker ces TOP IP et de les interroger.

En utilisant une approche “intelligente”, je stocke une seule entrée (clé: valeur) pour toutes les IP TOR; économiser considérablement sur les coûts.

Cela fonctionne parce que la limite de valeur de Workers KV est de 25 Mb, alors que les nombreuses adresses IP que nous stockons prennent jusqu’à… quelques Ko seulement.

Les limites du forfait gratuit Workers KV sont plus que suffisantes pour écrire/lire ces IP en permanence. Et au cas où cela ne suffirait pas, la mise en cache peut être appliquée à l’intérieur du travailleur (j’ai déjà appliqué une mise en cache de 10 minutes sur READ) et le plan peut être mis à niveau pour seulement 5 $/mois.

Bien sûr, vous pouvez également être intelligent quant à son utilisation et vérifier l’adresse IP de l’utilisateur uniquement dans des zones spécifiques que vous souhaitez protéger, par exemple les zones de connexion et autres.

Le service de worker

J’ai préparé pour vous un worker prêt à l’emploi sur Github .

Tout ce que vous avez à faire est de le cloner, de configurer les exigences et de le publier.

Configuration

Pour que cela fonctionne, vous avez besoin de deux choses:

  • Wrangler
  • Votre identifiant de compte
  • Un espace de noms KV

Pour obtenir votre ID de compte, ouvrez simplement l’un de vos sites Web sur Cloudflare et vérifiez le côté inférieur droit de la page “Aperçu”. Une fois que vous avez l’ID de compte, stockez-le simplement dans wrangler.toml:

1account_id = "..."

Pour créer l’espace de noms Worker KV, exécutez la commande suivante:

sudo wrangler kv:namespace create storage

Le résultat devrait être:

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]

À l’aide de l’ID ci-dessus, modifiez wrangler.toml et stockez l’ID:

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

Veuillez ne pas créer vous-même l’espace de noms KV, utilisez la commande ci-dessus. La liaison KV est requise, ne l’ignorez pas.

Une fois les étapes ci-dessus terminées, publiez le nœud de calcul:

sudo wrangler publier

Le travailleur est configuré pour s’exécuter toutes les 60 minutes (une heure), si vous souhaitez modifier cela, modifiez simplement wrangler.toml. Des périodes plus courtes n’aideront pas car l’API ne se met à jour que toutes les heures.

Utilisation de la liste

Vous avez maintenant une liste d’adresses IP du réseau TOR et il est temps de l’utiliser. C’est extrêmement simple si vous êtes déjà familier avec les travailleurs, si vous ne l’êtes pas, c’est toujours facile.

L’idée est de vérifier l’adresse IP de l’utilisateur entrant par rapport à la liste et s’il y a une correspondance, bloquer la demande. Ci-dessous un script de démarrage simple que vous pouvez simplement copier et coller dans un nouveau 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", { 
 7  headers: {
 8	'content-type': 'text/html;charset=UTF-8',
 9  },
10  status: 403
11});
12}

La recherche est extrêmement rapide car la liste des adresses IP est stockée sous la forme d’un seul objet, vous n’avez donc pas besoin d’analyser ou de rechercher quoi que ce soit.

La mise en cache est également appliquée (vous pouvez la désactiver si vous le souhaitez) pour accélérer encore plus les choses. Le cache Workers KV fonctionne en utilisant Cache API .

Une fois que vous avez récupéré la valeur, vous vérifiez simplement si l’adresse IP existe, si elle renvoie ce que vous voulez.

Utilisez l’extrait ci-dessus n’importe où dans votre travailleur nouveau ou existant (et même dans les pages Cloudflare), tant que l’objet de requête est disponible.

Tester la liste

Comme mentionné précédemment, il est extrêmement facile d’utiliser cette liste même si vous n’avez jamais utilisé Workers auparavant.

J’ai fait un petit exemple que vous pouvez simplement copier coller et l’utiliser sur n’importe lequel de vos sites Web:

 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}

N’oubliez pas d’ajouter la liaison KV à ceci worker.

Avec le travailleur ci-dessus déployé, nous lançons le Navigateur TOR et testons:

Block TOR Result

Comme vous pouvez le voir, cela fonctionne exactement comme prévu. IP du réseau TOR bloqué, relais et ponts.

Veuillez noter que j’ai supprimé ceci de mon propre site Web, donc si vous essayez d’accéder via TOR maintenant, cela fonctionnera (je n’ai aucune raison de bloquer TOR).

Calcul des coûts

Dès le début de cet article, j’ai mentionné que les limites de Free Worker sont suffisantes pour bloquer TOR, et elles le sont. J’ai également mentionné que j’ai fait de nombreux tests pour déterminer la meilleure façon de créer ce projet.

Au cours de mes tests, j’ai utilisé de nombreuses requêtes READ/WRITE/LIST/DELETE qui ont fini par coûter environ 60 à 100 dollars par mois. Pas idéal n’est-ce pas ? 😳

J’ai donc trouvé un moyen de ne faire qu’un seul WRITE par heure. Cela signifie 24 WRITE(s) par jour, 744 WRITE(s) par mois (31 jours).

Cela reste dans le niveau gratuit pour les travailleurs KV et vous pouvez bloquer TOR.

Liens utiles

Voilà, j’espère que cet article et cet outil vous ont aidé.

Dis moi ce que tu penses!