منظومة أسماء سيادية: تصميم وقياس ومقارنة
كل رقم في هذه الورقة مُقاس على شجرة الكود هذه، بالأمر المكتوب تحته — لا تقديرات ولا أرقام من بحث آخر.
الملخص
تحل هذه الورقة مشكلة واحدة محددة: جهاز جديد يدخل الشبكة ويصل إلى اسم لم يُشترَ ولم يُعدَّل —
بلا تطبيق، بلا حساب، بلا إعداد يدوي. نعرض منظومة تتحقق من ذلك بثلاثة أبواب: بوابة عامة واحدة تحمل
*.gw.jemo.dev بشهادة ثقة عامة، جذر خاص تُوقَّع مناطقه بمفتاح Ed25519 وتُربط
هشه في الجذر الأب، وبوابة DoH تخفي الأسماء المسجّلة عن غير المسجّلة حتى لا تصبح قاعدة بياناتها
أداة استكشاف. القياسات: 2041.8 تفويض/ثانية (p50 0.409 مللي ثانية)،
6471.8 قرار إخفاء/ثانية، ونظام اختبارات يمضي 192 اختبار وحدة و
89 بوابة حيّة موزّعة على سبع بوابات. المقارنة مع البدائل موثّقة بخانة-مصدر، وأهم نتيجة
قياسية خارج مشروعنا: من خوادم OpenNIC المعلنة 0 من 54 يصل جذرها المعلن.
النظام في خمس قطع
كل قطعة موجودة وتعمل على الشجرة الحالية، وكل واحدة لها بوابة اختبار خاصة بها.
البوابة العامة
اسم واحد تحت gw.jemo.dev بشهادة عامة يفتح عند أي شخص بلا أي إعداد. تتحقق من توقيع المنطقة قبل كل طلب، وترفض أي استضافة لا تملك مفتاحاً.
التفويض السيادي
كل منطقة موقّعة بمفتاح Ed25519، وهش المفتاح مربوط في الجذر الأب. تعديل المنطقة بعد التوقيع = رفض. والمفتاح الخاص لا يُنسخ داخل حزمة الإيداع، لكنه يبقى عند المشغّل — فملكيتك للمفتاح غير مؤمَّنة لك اليوم.
إخفاء DoH
اسم مسجّل واسم غير مسجّل داخل نطاقنا يعطيان استجابة متطابقة بالبايت. بدون هذا، كل استعلام يكشف «هذا الاسم موجود وهذا ليس موجوداً» — قاعدة بيانات مكشوفة للاستكشاف.
الإيداع (Escrow)
حزمة إيداع تحمل التوقيع والمفتاح العام فقط. إثبات مكتوب ومبني على الشبكة أن المفتاح الخاص لا يُنسخ إلى أي مكان.
جهاز الشبكة
علبة واحدة تدير شبكة LAN: تعلن نفسها كـ resolver وكبوابة وك نطاق بحث عبر DHCP. جهاز لم يفعل شيئاً سوى تلقي عقد إيجار يفتح كلمة واحدة في شريط العنوان.
حزمة القياس
bench.py يبني موقعاً حقيقياً (منطقة موقّعة حقيقية بـ openssl) ويقيس التفويض والإخفاء والاستضافة بلا شبكة وبلا ساعة داخل الحلقات.
نموذج التهديد
ستة مهاجمين، ضابط لكل واحد، والدليل اختبار يفشل بدون الضابط.
| المهاجم | يريد | الضابط | الدليل |
|---|---|---|---|
| مسجّل خبيث | أخذ أسماء الآخرين دفعة واحدة | حد 5 تسجيلات/ساعة لكل عنوان، والحد على الفعل نفسه | test_registration_is_rate_limited — بعد الحد يرجع 429 حتى لاسم فارغ |
| مهاجم على الباب | تهريب طلب/رد (smuggling) | Transfer-Encoding مرفوض من الأساس، وContent-Length وحده على GET |
gateway.py:935 + قسم smuggling في docs/gateway-deploy.md |
| مالك منطقة موقّعة | SSRF: الوصول لبيانات السحابة أو loopback | فحص عنوان الهدف قبل الجلب | TestSsrfinAZone — metadata وloopback يُرفضان |
| متصفّح خبيث | عدّ كل الأسماء المسجّلة | إخفاء: المسجّل وغير المسجّل بروحي متطابقان | test_doh.py — RCODE مخفي = NXDOMAIN متطابق |
| مُحمِّل اتصالات | إبقاء sockets مفتوحة حتى الموت | مهلة مصافحة 15 ثانية ومهلة قراءة 60 ثانية | Handler.timeout وhandshake_timeout |
| مشغّل الجذر | تغيير تفويض بعد توقيعه | توقيع المنطقة + ربط هش المفتاح في الأب | TestRefusals — تعديل بعد التوقيع أو مفتاح خاطئ = رفض |
docs/coverage.md بتاريخ اليوم نفسه.
القياسات — 28 سبتمبر 2026
كل رسم أدناه يحمل أمر إعادة الإنتاج ومصدره. لا رقم بلا مصدر.
الthroughput على الأبواب الثلاثة
أعلى = أسرع · python3 bench.py · 20.07 ثانية · موقعاً حقيقياً مبنياً بـ openssl
التفويض يُقاس بـ CPU time داخل الحلقة (لا ساعة جدارية)، والقرار المحمي هو نقطة الفشل المتعمدة في البوابة.
زمن الاستجابة للتفويض
مللي ثانية · أدنى = أسرع · نفس جلسة bench.py
240 تفويضاً في 0.12 ثانية CPU — القياس لا يتأثر بحمل الآلة الأخرى.
مسار التحسين — قبل/بعد ذاكرة نص المنطقة
تفويض/ثانية · كل عمود من الالتزام المذكور تحته
المصادر: الالتزامان 7b85c02 و4819c52 وقياس اليوم. الالتزام التأكيدي يوثّق صراحةً أن ست عينات لنفس الشجرة تتراوح 1365–1832/ث، فالأثر داخل مستوى الضوضاء — وهذا مكتوب هناك لا هنا.
OpenNIC: هل يوصل خوادمها المعلنة إلى جذرها؟
قياس مباشر لـ 54 خادماً · python3 docs/opennic/probe.py · 2026-09-27
الضابط يثبت أن الشبكة ليست ميتة: 54/54 تحل الويب، وصفر منها يجيب على TXT tlds.opennic.glue — السجل الذي تقرأه أدوات إعدادهم نفسها. المصدر: docs/opennic/INVENTORY.md.
بوابات الفحص — كلها خضراء اليوم
سبع بوابات من شجرة واحدة · make gates يشغّلها بأمر واحد
| البوابة | النتيجة | الأمر |
|---|---|---|
| اختبارات الوحدة | 192 ناجح | make test |
| DoH | 47 ناجح | make test-doh |
| الشبكة الحية | 23/23 | make verify |
| الجهاز الحيّ (DHCP) | 8/8 | make site-test |
| الإيداع | 5/5 | make escrow-verify |
| متصفح حقيقي | 6/6 | make browser |
| صحة التهيئة | ناجح | ./nd check |
متصفحان حقيقيان (Chromium وFirefox) يفتحان الاسم فوق مُحلّينا — هذا هو ادعاء «أي متصفح». ملاحظة شفافة: أول تشغيل لبوابة المتصفح فشل لأن إعادة بناء escrow أعادت تشغيل الحاويات أثناء الجلسة؛ أعيد التشغيل بعد استقرار الشبكة ومرّ 6/6.
المقارنة مع البدائل
خمسة أنظمة، خمسة محاور، وكل خانة تحمل رقمها ومصدرها. خانة بلا مصدر تُكتب «غير مُستشهد» ولا تُملأ تخميناً.
| النظام | جهاز جديد بلا إعداد | HTTPS بلا تحذير | كلفة الاسم | الملكية والاسترجاع |
|---|---|---|---|---|
نظامنا — الجسر .gw.jemo.dev |
نعم — رابط واحد، بلا تطبيق ولا حساب [1] | نعم — شهادة ثقة عامة | 0 — الخدمة مجانية [2] | استضافة تحت حيازة المشغّل، والمنطقة موقّعة بمفتاحه + إيداع باختبار 5/5 [3] |
نظامنا — السيادي .eng |
يحتاج تفعيل الجهاز مرة واحدة (ملف أو شبكة مُدارة) [1] | نعم بعد تثبيت CA المشروع (ملف واحد من البوابة) [4] | 0 | المفتاح يبقى عند المشغّل اليوم، والإيداع علني وإمكانية استلامه بك مُنجَزة |
| DNS العادي (ICANN) | نعم — الجذر العالمي | نعم | ≈13 $/سنة لاسم عربي داخل الجذر [5] | إيجار من المسجّل — لا ملكية فعلية [6] |
| OpenNIC | لا — تغيير DNS يدوي، وقياسنا: 0/54 من خوادمها يصل جذرها [7] | غير مُقاس هنا | غير مُستشهد | ميثاق وتصويت مجتمعي [8] |
Namecoin .bit |
لا — يحتاج resolver أو إضافة [9] | عبر بوابة، لا للاسم السيادي [6] | غير مُستشهد | على السلسلة [9] |
| Handshake | لا — يحتاج resolver أو بوابة [9] | عبر بوابة [6] | غير مُستشهد | على السلسلة، من الجذر للمنطقة [10] |
ENS .eth |
لا — يحتاج محفظة أو بوابة/إضافة [9] | عبر بوابة (eth.limo) [6] | 5 $/سنة للمحارات 5+، 160 $ لثلاثية [11] | عقد على Ethereum [9] |
docs/reach.md: أي اسم خارج الجذر العالمي يحتاج شيئاً يعيد مسار أول حزمة
(resolver، خيار DHCP، إعداد متصفح، إضافة، VPN). ادعاءنا أن جسرنا يختصر هذا الحائط،
وأن القياس يثبت أنه يختصره فعلاً — لا أن الحائط لم يوجد.
دراسات حالة وجدناها بالتشغيل لا بالقراءة
أعطال حقيقية اكتُشفت أثناء قياس حي، وكلها موثّقة بالالتزام أو بالتقرير.
1. اختبار كان يسأل المحلّي ويظن أنه يسألنا
الوحيدة NXDOMAIN في verify.sh كانت الاستعلام الوحيد بلا خادم صريح، فتسأل DNS الخاص بالحاوية وتفشل ~50% من الجولات. لم يكن يختبر مُحلّنا أبداً. الإصلاح: خادم صريح + 5/5 متتالية حتمية. المصدر: REPORT.md.
2. الراوتر الذي لا يُوجِّه
الجهاز كان يحلّ الاسم ثم تنتهي المهلة عند الصفحة: العلبة كانت بوابة الجهاز بدون forwarding ولا masquerade. لا عدد من dig كان سيرى هذا أبداً — الاكتشاف جاء بفتح صفحة فعلية من جهاز له عقد إيجار فقط. الآن هو اختبار ثامن ثابت.
3. خانة TC في المكان الخطأ
فحص DoH للـ TC bit كان يقرأ data[3]&0x02 — أي البت المحجوز Z، لا TC — فمحاولة إعادة الإرسال عبر TCP لا تطلق أبداً وأي استجابة كبيرة تفشل. عثرنا عليه بالقياس، وأصلحناه مع ذاكرة المنطقة في 7b85c02.
4. unbound 1.20 لا ينفذ وثيقته
http-endpoint يمر unbound-checkconf وينظّف ثم لا يخدم شيئاً على أي منفذ. البوابة DoH صغيرة ومكتوبة بـ stdlib وتنقل البايت كما هو وتسجل كل QNAME — كل استعلام منسوب.
5. dnsmasq بدون -d يتفرّع ويموت بصمت
الأب يخرج، PID 1 يموت، العلبة تنطفئ، وكل إدعاء DNS يفشل بـ «connection refused». إصلاح بحرف واحد — لكنه كان يخفي عطل المنتج خلف عطل الاختبار.
القيود الصريحة
ما الذي لا تحلّه هذه المنظومة — مكتوب بلا تخفيف.
لا يوجد اسم خارج الجذر يصل للجميع بلا فعل
.alt وعدٌ بعدم وجوده في الجذر (RFC 9476 §3.2.7). التفاصيل في docs/reach.md.Android Private DNS غير متاح هنا
PUBLIC_DNS_HOSTNAME ولم يُفعَّل.خلف CGNAT: الاسم يصل ولا يصل الموقع
كلمة مفردة للزائر الغريب غير ممكنة
demo بلا نطاق لا تصل لغريب تحت أي مسار هنا. قائمة البحث ما تحوّل كلمة واحدة إلى اسم كامل، وقائمة البحث شيء تسلّمه الشبكة — وهو عمل جهاز الشبكة على شبكات نديرها.تغطية الاختبارات لها ثغرات معروفة
docs/coverage.md (قياس اليوم) يوثّق: مسارات admin الرايع بلا اختبار موجب لـ token الإعداد، وطبقة السكربتات/systemd بلا تغطية آلية إطلاقاً. «الاختبار يمر» ليس «الفجوة مغلقة».الشيء service worker نصف إثبات فقط
tests/sw-scope-probe.sh يسجّل أن هذا Chromium لا يعرض API serviceWorker أصلاً. نصف الحجة (قواعد نطاق المتصفح) قائم على المنصة لا على تشغيل — والنص يقول ذلك بدل أن يدّعي العكس.إعادة إنتاج كل رقم في هذه الورقة
من شجرة نظيفة، بالأوامر نفسها التي أنتجت الأرقام أعلاه.
make gates # كل البوابات بأمر واحد + ملخص
python3 bench.py # throughput + p50/p95 (20 ثانية)
python3 docs/opennic/probe.py # 54/54 مقابل 0/54
المخرجات التي اقتبسناها: METRIC authorise_per_s=2041.8 وdoh_conceal_per_s=6471.8
وregistrar_hosted_per_s=1309.3، وRan 192 tests … OK، وLAN pass: 23 ok،
وsite pass: 8 ok، وescrow: 5 ok، وbrowsers: 6 ok.
المراجع
- [1] تقرير التسليم — الوصل بصفر إعداد:
REPORT.md، وبواباتmake site-test/make browser. - [2] صفحة الأسعار في الموقع: لا رسوم تسجيل ولا سنوية —
site/index.html. - [3] حزمة الإيداع:
make escrow-verify(5/5) — المفتاح الخاص لا يُنسخ، والدليل مبني على إعادة بناء الشبكة. - [4] CA مقيّد بالأسماء وبوابة التفعيل:
generated/www/portal.htmlوnetwork.mobileconfig، والجدول المرجعي للأنظمة فيdocs/research/the-solution.md. - [5] كلفة اسم عربي داخل الجذر ≈13 $/سنة:
docs/reach.md. - [6] جدران الاسم الداخلي — CA/Browser Forum Baseline Requirements v2.2.2 (12 Jan 2026) §1.6.6 و§7.1.4، منقولة مع الاقتباس في
docs/reach.md. - [7] قياس OpenNIC المباشر (54 معلناً، 0 يصل الجذر):
docs/opennic/INVENTORY.mdوdocs/opennic/probe.py، 2026-09-27. - [8] ميثاق OpenNIC وقواعد Tier 1/2:
docs/opennic/CHARTER.md(نسخة موثّقة بتاريخ 2026-09-27). - [9] مراجعة الأنظمة البديلة: ICANN OCTO-034 «Challenges with Alternative Name Systems» — icann.org، وOCTO-039 «Introduction to Blockchain Name System Technologies» — icann.org.
- [10] تحليل Handshake: «A Deeper Grasp of Handshake» (2024) — orbilu.uni.lu، ودراسة تصادم أسماء TLD في الأنظمة السلسلية — dl.acm.org.
- [11] تسعير ENS الرسمي — docs.ens.domains/faq: 5 $/سنة (5+ محارف)، 160 $ (4)، 640 $ (3).
- [RFC] RFC 2826 (الجذر الفريد) · RFC 9476 (
.alt) · RFC 8484 (DoH) · RFC 9462 (DDR) — كلها منقولة ومحلَّلة فيdocs/reach.mdوdocs/architecture.md.