
مُحلّل DNS محمول بلغة Rust — نطاقات .numa المحلية، حظر الإعلانات، تجاوزات المطور
DNS تملكه. أينما تذهب. — numa.rs
محلّل DNS محمول في ملف ثنائي واحد. احجب الإعلانات على أي شبكة، وسمِّ خدماتك المحلية (frontend.numa)، وتجاوز أي اسم مضيف مع إرجاع تلقائي، واختم كل استعلام صادر باستخدام ODoH (RFC 9230) بحيث لا يرى أي طرف بمفرده هويتك وما سألت عنه — كل ذلك من حاسوبك المحمول، دون حاجة إلى حساب سحابي أو Raspberry Pi.
مبني من الصفر بلغة Rust. لا مكتبات DNS. تخزين مؤقت، وحظر إعلانات، ومجالات الخدمات المحلية جاهزة فورًا. تحليل تكراري اختياري من خوادم الجذر مع التحقق الكامل لسلسلة الثقة DNSSEC، بالإضافة إلى مستمع DNS عبر TLS للاتصالات المشفرة للعملاء (iOS Private DNS، systemd-resolved، إلخ). شغّل numa relay فيتحول الملف الثنائي نفسه إلى نقطة نهاية ODoH عامة أيضًا — قائمة DNSCrypt المنسّقة تحتوي حاليًا على مرحِّل واحد باقٍ، لذا كل نشر لـ Numa يوسع النظام البيئي ماديًا. ملف ثنائي واحد بحجم ~8 ميجابايت، كل شيء مضمّن.

# macOS
brew install razvandimescu/tap/numa
# Linux
curl -fsSL https://raw.githubusercontent.com/razvandimescu/numa/main/install.sh | sh
# Arch Linux
pacman -S numa
# Windows — تنزيل من إصدارات GitHub
# جميع المنصات
cargo install numa
# Docker
docker run -d --name numa --network host ghcr.io/razvandimescu/numa
# Nix
nix run github:razvandimescu/numa
sudo numa # تشغيل في المقدمة (المنفذ 53 يتطلب صلاحيات جذر/مدير)
افتح لوحة التحكم: http://numa.numa (أو http://localhost:5380)
تعيين DNS كنظام:
في macOS و Linux، يعمل Numa كخدمة نظام (launchd/systemd). في Windows، يبدأ Numa تلقائيًا عند تسجيل الدخول عبر التسجيل. يرتبط Windows أيضًا بـ 127.0.0.2:53 (يمتلك Dnscache المدمج 127.0.0.1:53) ويُثبّت قاعدة NRPT لتوجيه الاستعلامات إليه — لذا حرّر bind_addr/api_bind_addr مقابل 127.0.0.2 وليس 127.0.0.1.
سمِّ خدمات التطوير بدلاً من تذكر أرقام المنافذ:
curl -X POST localhost:5380/services \
-d '{"name":"frontend","target_port":5173}'
الآن يعمل https://frontend.numa في متصفحك — قفل أخضر، شهادة صالحة، تمرير WebSocket لـ HMR. بدون mkcert، بدون nginx، بدون /etc/hosts.
أضف توجيهًا قائمًا على المسار (app.numa/api → :5001)، وشارك الخدمات عبر الأجهزة عبر اكتشاف الشبكة المحلية، أو هيّئ كل شيء في numa.toml.
يتم حظر أكثر من 385 ألف نطاق عبر قائمة Hagezi Pro. يعمل على أي شبكة — مقاهٍ، فنادق، مطارات. يسافر مع حاسوبك المحمول.
ثلاثة أوضاع تحليل:
forward (افتراضي) — وكيل شفاف إلى نظام DNS الحالي. كل شيء يعمل كما كان، مع إضافة التخزين المؤقت وحظر الإعلانات. بوابات الاشتراك، شبكات VPN، DNS المؤسسي — كلها محترمة.recursive — التحليل مباشرة من خوادم الجذر. لا اعتماد على مزود خارجي، لا كيان واحد يرى نمط استعلاماتك كاملاً. أضف [dnssec] enabled = true للتحقق الكامل لسلسلة الثقة.auto — فحص خوادم الجذر عند بدء التشغيل، تحليل تكراري إذا كانت متاحة، وإلا العودة إلى DoH مشفّر إذا كان محظورًا.يُتحقق DNSSEC من سلسلة الثقة الكاملة: توقيعات RRSIG، والتحقق من DNSKEY، وتفويض DS، وإثباتات الرفض NSEC/NSEC3. اقرأ كيف يعمل ←
مستمع DNS عبر TLS (RFC 7858) — اقبل الاستعلامات المشفّرة على المنفذ 853 من العملاء الصارمين مثل iOS Private DNS و systemd-resolved و stubby. وضعان:
numa install إلى مخزن الثقة النظامي في macOS و Linux (Debian/Ubuntu و Fedora/RHEL/SUSE و Arch) و Windows. في iOS، ثبت ملف .mobileconfig من numa setup-phone. يحتفظ Firefox بمخزن NSS خاص به ويتجاهل مخزن النظام — ثق بهيئة التصديق يدويًا هناك إذا كنت بحاجة إلى HTTPS لخدمات .numa في Firefox.[dot] cert_path / key_path إلى شهادة موثوقة عمومًا (مثل Let's Encrypt عبر تحدي DNS-01 على نطاق يشير إلى مثيل Numa الخاص بك). يتصل العملاء دون أي إعداد لمخزن الثقة — نفس تجربة المستخدم مع AdGuard Home أو Cloudflare 1.1.1.1.يتم الإعلان عن ALPN "dot" وتطبيقه في كلا الوضعين؛ يُرفض المصافحة مع ALPN غير مطابق كدفاع ضد الخلط بين البروتوكولات.
إعداد الهاتف — وجّه هاتف iPhone أو Android إلى Numa في خطوة واحدة:
numa setup-phone
يطبع رمز QR. امسحه ضوئيًا، ثبّت الملف الشخصي، بدّل الثقة بالشهادة — سيتجه DNS هاتفك الآن عبر Numa عبر TLS. يتطلب [mobile] enabled = true في numa.toml.
شغّل Numa على أجهزة متعددة. تجد بعضها البعض تلقائيًا عبر mDNS:
الجهاز A (192.168.1.5) الجهاز B (192.168.1.20)
┌──────────────────────┐ ┌──────────────────────┐
│ Numa │ mDNS │ Numa │
│ - api (منفذ 8000) │◄───────────►│ - grafana (3000) │
│ - frontend (5173) │ discovery │ │
└──────────────────────┘ └──────────────────────┘
من الجهاز B: curl http://api.numa ← يتم توجيهه إلى منفذ 8000 الخاص بالجهاز A. فعّل باستخدام numa lan on.
وضع المحور: شغّل مثيلاً واحدًا مع bind_addr = "0.0.0.0:53" ووجّه DNS الأجهزة الأخرى إليه — تحصل على حظر الإعلانات + تحليل .numa دون تثبيت أي شيء. يقبل bind_addr أيضًا قائمة لربط مجموعة فرعية معينة من الواجهات.
# موصى به — شبكة المضيف (Linux)
docker run -d --name numa --network host ghcr.io/razvandimescu/numa
# تعيين المنافذ (macOS/Windows Docker Desktop)
docker run -d --name numa -p 53:53/udp -p 53:53/tcp -p 5380:5380 ghcr.io/razvandimescu/numa
لوحة التحكم على http://localhost:5380. الصورة تربط API والوكيل بـ 0.0.0.0 افتراضيًا. يمكن تجاوزه بإعداد مخصص:
docker run -d --name numa --network host \
-v /path/to/numa.toml:/root/.config/numa/numa.toml \
ghcr.io/razvandimescu/numa
متعدد المعماريات: linux/amd64 و linux/arm64.
وصفات compose جاهزة:
packaging/client/ — وضع عميل ODoH (DNS مجهول)، Numa + ملف numa.toml ابتدائي.packaging/relay/ — مرحّل ODoH عام، Numa + Caddy + ACME.0.1 مللي ثانية للاستعلامات المخزنة — يضاهي Unbound و AdGuard Home. التخزين المؤقت على مستوى الحزمة يخزّن البايتات الخام مع تعديل TTL في المكان. تحوط الطلبات يزيل ذروة p99: p99 للتحليل التكراري البارد 538 مللي ثانية مقابل 748 مللي ثانية لـ Unbound (−28%)، σ 4 مرات أضيق. المقاييس ←
.numa المحلية — TLS تلقائي، توجيه المسار، وكيل WebSockettls://)numa relay، RFC 9230)MIT
| المنصة | التثبيت | إلغاء التثبيت |
|---|
| macOS | sudo numa install | sudo numa uninstall |
| Linux | sudo numa install | sudo numa uninstall |
| Windows | numa install (مسؤول) + إعادة تشغيل | numa uninstall (مسؤول) + إعادة تشغيل |
| Pi-hole | AdGuard Home | Unbound | Numa |
|---|
| وكيل الخدمة المحلية + TLS تلقائي | — | — | — | مجالات .numa، HTTPS، WebSocket |
| اكتشاف خدمات الشبكة المحلية | — | — | — | mDNS، بدون إعداد |
| تجاوزات المطوّر (REST API) | — | — | — | إرجاع تلقائي، قابل للبرمجة |
| محلل تكراري | — | — | نعم | نعم، مع اختيار SRTT |
| التحقق من DNSSEC | — | — | نعم | نعم (RSA, ECDSA, Ed25519) |
| حظر الإعلانات | نعم | نعم | — | أكثر من 385 ألف نطاق |
| واجهة إدارة ويب | كاملة | كاملة | — | لوحة تحكم |
| مزود علوي مشفّر (DoH/DoT) | يحتاج cloudflared | DoH فقط | DoT فقط | DoH + DoT (tls://) |
| عملاء مشفّرون (مستمع DoT) | يحتاج ستونيل جانبي | نعم | نعم | أصلي (RFC 7858) |
| نقطة نهاية خادم DoH | — | نعم | — | نعم (RFC 8484) |
| تحوط الطلبات | — | — | — | جميع البروتوكولات (UDP, DoH, DoT) |
| خدمة قديمة + جلب مسبق | — | — | جلب مسبق عند 90% TTL | RFC 8767، جلب مسبق عند 90% TTL |
| التوجيه الشرطي | — | نعم | نعم | نعم (قواعد حسب اللاحقة) |
| قابلية الحمل (حاسوب محمول) | لا (جهاز تطبيقي) | لا (جهاز تطبيقي) | خادم | ملف ثنائي واحد، macOS/Linux/Windows |
| نضج المجتمع | 56 ألف نجمة، 10 سنوات | 33 ألف نجمة | 20 سنة | جديد |
setup-phone، API جوال، ملفات توصيف mobileconfig.numa عالمية — مدعومة بـ DHT، بدون مسجل