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.
Ki kell kapcsolnia az “Onion Routing”-ot a Cloudflare beállítások “Network” lapján. Ellenkező esetben a “CF-Connecting-IP” fejléc a Cloudflare adatközpont IP-jét fogja tartalmazni, és a szkript nem fog TOR hálózati IP-t látni.
A fenti workerrel telepítve indítjuk el a TOR Böngészőt és teszteljük:
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
- A Wrangler használatának megkezdéséhez: https://developers.cloudflare.com/workers/wrangler/get-started/
- A Workers használatának megkezdéséhez: https://developers.cloudflare.com/workers/get-started/quickstarts/
- A KV Bindings beállításához: https://developers.cloudflare.com/workers/runtime-apis/kv/#kv-bindings
Ennyi, remélem ez a cikk és eszköz segített Önnek.
Ossza meg velem a gondolatait!
Hozzászólások