Ma megtanulja, hogyan blokkolhatja a TOR hálózat IP-jeit (relay-eket és bridge-eket) a Cloudflare Workers segítségével ingyen.

Mielőtt bármibe is belevágnánk, tájékoztatnom kell, hogy a Cloudflare nemrég bevezette a Managed Lists funkciót, amellyel a TOR egyetlen kattintással blokkolható. Az egyetlen hátránya, hogy ezek csak Enterprise ügyfelek számára érhetők el.

Ha megengedheti magának, remek; figyelmen kívül hagyhatja ezt a bejegyzést. Ha azonban nem engedhet meg magának Enterprise csomagot, olvasson tovább.

TOR hálózat blokkolása

Eredetileg létrehoztam egy workert, amelyet csak cron jobként használtam volna, lekérte a TOR IP-ket, feldolgozta és a Cloudflare Lists-ben tárolta. Ezt a listát aztán bármely webhelyen használni lehetett volna a Firewall Rules-ban.

A Lists funkció fő problémája az volt, hogy az összes listára vonatkozóan 10.000 elemre korlátozódott. Tehát nem számít, hogy Business vagy Enterprise csomagja van, ez jelenleg a korlát, ahogy itt dokumentálva van.

A másik probléma az volt, hogy jelenleg nem tárolhat egyedi IPv6 címeket, ahogy itt szerepel.

Ezzel a két nagy problémával a listák használata nem járható út; ezért inkább a Workers KV-t választottam. Számos teszt és több emberrel folytatott beszélgetés után a Cloudflare Discord csatornáján megtaláltam a legjobb módot ezeknek a TOR IP-knek a tárolására és lekérdezésére.

Egy “okos” megközelítéssel csak egy bejegyzést (key:value) tárolok az összes TOR IP-hez; ezzel jelentősen csökkentve a költségeket.

Ez azért működik, mert a Workers KV értékhatára 25 Mb, míg a sok IP, amit tárolunk, csak néhány Kb-ot foglal el.

Az ingyenes Workers KV csomag korlátai bőven elegendőek az IP-k folyamatos írásához/olvasásához. Ha pedig nem lenne elég, a worker-en belül gyorsítótárazás alkalmazható (már alkalmaztam 10 perces gyorsítótárazást az READ-re) és a csomag mindössze 5$/hónapért frissíthető.

Természetesen okosan is használhatja, és csak bizonyos területeken ellenőrizheti a felhasználó IP-jét, amelyeket védeni szeretne, például bejelentkezési területek és mások.

A service worker

Készítettem egy használatra kész workert az Github -on.

Mindössze annyit kell tennie, hogy klónozza, konfigurálja a követelményeket és közzéteszi.

Konfiguráció

Ahhoz, hogy ez működjön, néhány dologra van szüksége:

  • Wrangler
  • Az Account ID-je
  • Egy KV Namespace

Az Account ID megszerzéséhez egyszerűen nyissa meg bármelyik webhelyét a Cloudflare-en és ellenőrizze az “Overview” oldal jobb alsó sarkát. Miután megvan az Account ID, egyszerűen tárolja a wrangler.toml-ban:

1account_id = "..."

A Worker KV Namespace létrehozásához hajtsa végre a következő parancsot:

sudo wrangler kv:namespace create storage

Az eredmény a következő lesz:

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]

A fenti ID használatával szerkessze a wrangler.toml-t és tárolja az ID-t:

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

Kérjük, ne hozza létre magán a KV Namespace-t, használja a fenti parancsot. A KV Binding szükséges, ne hagyja figyelmen kívül.

Miután a fenti lépések befejeződtek, tegye közzé a workert:

sudo wrangler publish

A worker úgy van beállítva, hogy 60 percenként (óránként) fusson. Ha ezt meg szeretné változtatni, egyszerűen szerkessze a wrangler.toml-t. A rövidebb időszakok nem segítenek, mivel az API csak óránként frissül.

A lista használata

Most már van egy listája a TOR hálózat IP-jeiről és ideje használni. Ez rendkívül egyszerű, ha már ismeri a workereket, és ha nem, akkor is könnyű.

Az ötlet az, hogy a bejövő felhasználói IP-t összeveti a listával, és egyezés esetén blokkolja a kérést. Alább egy egyszerű induló szkript, amelyet egyszerűen kimásolhat és beilleszthet egy új workerbe:

 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}

A keresés rendkívül gyors, mert az IP-k listája egyetlen objektumként van tárolva, így nem kell semmit sem elemezni vagy keresni.

A gyorsítótárazás is alkalmazva van (kikapcsolhatja, ha szeretné) a dolgok még gyorsabb elvégzéséhez. A Workers KV gyorsítótár a Cache API segítségével működik.

Miután lekérte az értéket, egyszerűen ellenőrizze, hogy az IP létezik-e, és ha igen, adja vissza, amit szeretne.

Használja a fenti kódrészletet bárhol az új vagy meglévő workerében (sőt Cloudflare Pages-ben is), amíg a request objektum elérhető.

A lista tesztelése

Ahogy korábban említettem, rendkívül egyszerű használni ezt a listát, még akkor is, ha soha nem használt Workers-t.

Készítettem egy kis példát, amelyet egyszerűen kimásolhat, beilleszthet és használhat bármelyik webhelyén:

 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}

Ne felejtse el hozzáadni a KV Binding-ot ehhez a workerhez.

A fenti workerrel telepítve indítjuk el a TOR Böngészőt és teszteljük:

Block TOR Result

Ahogy láthatja, pontosan az elvárásoknak megfelelően működik. TOR hálózati IP-k blokkolva, relay-ek és bridge-ek egyaránt.

Kérjük vegye figyelembe, hogy ezt eltávolítottam a saját webhelyemről, tehát ha most TOR-on keresztül próbál hozzáférni, működni fog (nincs okom blokkolni a TOR-t).

Költségek kiszámítása

Rögtön ennek a bejegyzésnek az elején említettem, hogy az ingyenes Worker-korlátok elegendőek a TOR blokkolásához, és azok is. Említettem azt is, hogy számos tesztet végeztem a projekt legjobb megvalósítási módjának megtalálásához.

A tesztjeim során sok READ/WRITE/LIST/DELETE kérést használtam, amelyek végül körülbelül 60-100$/hónapba kerültek. Nem ideális, ugye? 😳

Tehát találtam egy módot, hogy óránként csak egy WRITE-ot végezzek. Ez napi 24 WRITE-ot jelent, havi 744 WRITE-ot (31 nap).

Ez a Workers KV ingyenes szintjén belül marad, és blokkolhatja a TOR-t.

Hasznos linkek

Ennyi, remélem ez a cikk és eszköz segített Önnek.

Ossza meg velem a gondolatait!