ستتعلم اليوم كيفية حظر عناوين IP لشبكة TOR (المرحلات والجسور) باستخدام Cloudflare Workers مجانًا.

قبل البحث في أي شيء ، يجب أن أخبرك أن Cloudflare قد قدمت مؤخرًا القوائم المدارة حيث يمكن أن يتم حظر TOR بنقرة واحدة. الجانب السلبي الوحيد هو أنها متاحة فقط لعملاء Enterprise.

إذا كنت تستطيع تحمله ، عظيم ؛ يمكنك تجاهل هذا المنصب. ومع ذلك ، إذا كنت لا تستطيع تحمل تكلفة خطة Enterprise ، فاستمر في القراءة.

حظر شبكة TOR

في البداية ، قمت بإنشاء عامل يمكن استخدامه فقط كوظيفة cron ، وجلب عناوين IP الخاصة بـ TOR ، وتحليلها وتخزينها في قوائم Cloudflare. سيتم استخدام هذه القائمة بعد ذلك عبر أي موقع ويب تملكه داخل قواعد جدار الحماية.

كانت المشكلة الرئيسية في ميزة القوائم هي أنها تقتصر على 10000 عنصر في جميع القوائم. لذلك لا يهم حتى إذا كنت تستخدم خطة أعمال أو خطة مؤسسية ، فهذا هو الحد الآن كما هو موثق هنا .

كانت المشكلة الأخرى أنه لا يمكنك تخزين عناوين IPv6 الفردية حتى الآن ، كما هو مذكور هنا .

مع هاتين المسألتين الرئيسيتين ، فإن استخدام القوائم ليس خيارًا قابلاً للتطبيق ؛ لذلك ذهبت مع Workers KV بدلاً من ذلك. بعد العديد من الاختبارات والمناقشات مع العديد من الأشخاص على قناة Cloudflare’s Discord ، وجدت أفضل طريقة لتخزين عناوين IP هذه والاستعلام عنها.

باستخدام نهج “ذكي” ، أقوم بتخزين إدخال واحد فقط (مفتاح: القيمة) لجميع TOR IP’s ؛ توفير التكاليف بشكل كبير.

يعمل هذا لأن حد قيمة Workers KV هو 25 ميجا بايت ، في حين أن العديد من عناوين IP التي نخزنها تتطلب ما يصل إلى … بضعة كيلوبايت فقط.

تعد الحدود المفروضة على الخطة المجانية Workers KV أكثر من كافية لكتابة / قراءة عناوين IP هذه باستمرار. وفي حالة عدم كفاية ذلك ، يمكن تطبيق التخزين المؤقت داخل العامل (لقد قمت بالفعل بتطبيق 10 دقائق من التخزين المؤقت على READ) ويمكن ترقية الخطة مقابل 5 دولارات شهريًا فقط.

بالطبع يمكنك أيضًا أن تكون ذكيًا بشأن استخدامه والتحقق من عنوان IP الخاص بالمستخدم فقط في مناطق محددة تريد حمايتها ، على سبيل المثال مناطق تسجيل الدخول وغيرها.

عامل الخدمة

لقد أعددت عامل جاهز للاستخدام من أجلك على Github .

كل ما عليك فعله هو استنساخه وتكوين المتطلبات ونشره.

إعدادات

لكي يعمل هذا ، أنت بحاجة إلى أمرين:

  • رانجلر
  • معرف حسابك
  • واحد KV Namespace

للحصول على معرف الحساب الخاص بك ، ما عليك سوى فتح أي من مواقع الويب الخاصة بك على Cloudflare وتحقق من الجانب الأيمن السفلي في صفحة “نظرة عامة”. بمجرد حصولك على معرف الحساب ، ما عليك سوى تخزينه في wrangler.toml:

1account_id = "..."

لإنشاء Worker KV Namespace ، قم بتنفيذ الأمر التالي:

sudo wrangler kv:namespace create storage

يجب أن تكون النتيجة:

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]

باستخدام المعرف أعلاه ، قم بتحرير wrangler.toml وقم بتخزين المعرف:

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

من فضلك لا تقم بإنشاء KV Namespace بنفسك ، استخدم الأمر أعلاه. KV Binding مطلوب ، لا تتجاهله.

بمجرد الانتهاء من الخطوات المذكورة أعلاه ، انشر العامل:

sudo wrangler publish

تم تكوين العامل ليعمل كل 60 دقيقة (ساعة واحدة) ، إذا كنت تريد تغيير هذا ، فقم فقط بتحرير wrangler.toml. لن تساعد الفترات الأقصر على الرغم من تحديث واجهة برمجة التطبيقات كل ساعة فقط.

استخدام القائمة

الآن لديك قائمة بعناوين IP الخاصة بشبكة TOR وحان وقت استخدامها. هذا بسيط للغاية إذا كنت بالفعل على دراية بالعاملين ، وإذا لم تكن كذلك ، فلا يزال الأمر سهلاً.

الفكرة هي التحقق من عنوان IP الخاص بالمستخدم الوارد مقابل القائمة وإذا كان هناك تطابق ، فقم بحظر الطلب. أدناه نص بسيط للمبتدئين يمكنك ببساطة نسخه ولصقه في عامل جديد:

 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}

البحث سريع للغاية لأنه يتم تخزين قائمة عناوين IP ككائن واحد ، لذلك لا تحتاج إلى تحليل أو البحث عن أي شيء.

يتم أيضًا تطبيق التخزين المؤقت (يمكنك تعطيله إذا كنت تريد) لتسريع الأمور أكثر. تعمل ذاكرة التخزين المؤقت Workers KV باستخدام Cache API .

بمجرد استرداد القيمة ، يمكنك ببساطة التحقق مما إذا كان عنوان IP موجودًا ، وما إذا كان سيعيد ما تريد.

استخدم المقتطف أعلاه في أي مكان داخل العامل الجديد أو الحالي (وحتى صفحات Cloudflare) ، طالما كان لديك كائن الطلب متاحًا.

اختبار القائمة

كما ذكرنا سابقًا ، من السهل جدًا استخدام هذه القائمة حتى لو لم تستخدم العمال من قبل.

لقد قمت بعمل مثال صغير يمكنك ببساطة نسخ اللصق واستخدامه على أي من مواقع الويب الخاصة بك:

 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}

لا تنس إضافة ربط KV لهذا العامل.

مع نشر العامل أعلاه ، أطلقنا متصفح TOR ونختبر:

Block TOR Result

كما ترى ، يعمل تمامًا كما هو متوقع. محجوب ومرحلات وجسور TOR Network IP.

يرجى ملاحظة أنني قمت بإزالة هذا من موقع الويب الخاص بي ، لذلك إذا حاولت الوصول عبر TOR الآن فسوف يعمل (ليس لدي سبب لحظر TOR).

حساب التكاليف

في بداية هذه المنشورات ، ذكرت أن حدود العامل المجاني كافية لحظر TOR ، وهي كذلك. لقد ذكرت أيضًا أنني أجريت العديد من الاختبارات لمعرفة أفضل طريقة لإنشاء هذا المشروع.

خلال اختباراتي ، استخدمت العديد من طلبات READ / WRITE / LIST / DELETE التي انتهى بها الأمر بتكلفة تتراوح بين 60 و 100 دولار شهريًا. ليست مثالية أليس كذلك؟ & # 128563 ؛

لذلك اكتشفت طريقة للقيام بالكتابة مرة واحدة في الساعة. هذا يعني 24 WRITE (s) في اليوم ، 744 WRITE (s) في الشهر (31 يومًا).

يبقى هذا ضمن الطبقة المجانية للعمال KV ويمكنك حظر TOR.

روابط مفيدة

حسنًا ، هذا كل شيء ، آمل أن تساعدك هذه المقالة والأداة.

دعني ارى آراءك!