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

البدء السريع
ثلاث طرق للدخول، من الأقل إلى الأكثر التزامًا. الطريقة الثالثة فقط هي التي تغيّر DNS نظامك.
1. جرّبه في Docker (لا شيء مثبّت على المضيف)
docker run -d --name numa -p 127.0.0.1:5553:53/udp -p 127.0.0.1:5553:53/tcp \
-p 127.0.0.1:5380:5380 ghcr.io/razvandimescu/numa
dig @127.0.0.1 -p 5553 example.com
docker exec numa numa token # dashboard password
افتح http://localhost:5380 وسجّل الدخول بأي اسم مستخدم وذلك الرمز. المنفذ 5553 يتفادى أي شيء يحتل المنفذ 53 بالفعل على المضيف. لن يُحلّ numa.numa هنا، لأن المضيف لا يستخدم Numa لـ DNS. نظّف باستخدام docker rm -f numa.
2. التشغيل في المقدمة (DNS النظام دون مساس)
ثبّت الملف التنفيذي:
# 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 — download from GitHub Releases
# All platforms
cargo install numa
# Nix
nix run github:razvandimescu/numa
sudo numa # Ctrl-C to stop (port 53 requires root/admin)
يستمع Numa على المنفذ 53، لكن نظامك يحتفظ بمحلله الحالي حتى تشغّل numa install، لذا اختبر باستخدام dig @127.0.0.1 example.com. لوحة التحكم على http://localhost:5380. إذا كان المنفذ 53 محتلًا (systemd-resolved على Ubuntu/Mint)، اضبط bind_addr في numa.toml أو استخدم Docker.
3. التعيين كـ DNS النظام
| المنصة | التثبيت | الإلغاء |
|---|---|---|
| macOS | sudo numa install | sudo numa uninstall |
| Linux | sudo numa install | sudo numa uninstall |
| Windows | numa install (admin) + reboot | numa uninstall (admin) + reboot |
install يسجّل خدمة، ويوجّه DNS النظام إلى Numa ويثق بشهادته المحلية CA. uninstall يعكس الثلاثة جميعًا. بمجرد التثبيت، تكون لوحة التحكم أيضًا على http://numa.numa.
على macOS وLinux، يعمل numa كخدمة نظام (launchd/systemd). وحدة systemd غير مميزة (DynamicUser=yes، فقط CAP_NET_BIND_SERVICE)؛ أما خدمة launchd فتعمل بصلاحيات root. يعيد numa install تهيئة systemd-resolved عبر ملف drop-in يزيله numa uninstall؛ أي عملية أخرى تحتل المنفذ 53 (dnsmasq، بما في ذلك الخاص بـ NetworkManager) يجب إيقافها يدويًا. على 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.
تسجيل الدخول
عبر loopback (localhost، 127.0.0.1، numa.numa) لا حاجة لتسجيل الدخول. أي شيء آخر، بما في ذلك تعيين منفذ Docker أو عنوان LAN لهذا الجهاز، يُطلب منه رمز API، الذي يولّده Numa عند أول تشغيل. اطبعه باستخدام sudo numa token (صدفة مسؤول على Windows) وسجّل الدخول بأي اسم مستخدم. ثبّت رمزك الخاص عبر [server] api_token أو NUMA_API_TOKEN.
إزالة كل أثر
uninstall يستعيد DNS لكنه يحتفظ بمجلد البيانات، لذا فإن إعادة التثبيت تحتفظ بنفس الرمز وCA. لإزالة كل شيء، ألغِ التثبيت أولًا، ثم احذف:
| المنصة | ما تبقّى |
|---|---|
| macOS | الملف التنفيذي، /usr/local/var/numa، /usr/local/var/log/numa.log |
| Linux | الملف التنفيذي (/usr/local/bin/numa من install.sh)، /var/lib/numa، /etc/numa |
| Windows | الملف التنفيذي، %PROGRAMDATA%\numa |
عمليات التثبيت عبر مدير الحزم تزيل الملف التنفيذي باستخدام brew uninstall أو pacman -R أو cargo uninstall. على Linux، ينسخ numa install ملفًا تنفيذيًا لا يمكنه تشغيله من موقعه الأصلي (مثل ~/.cargo/bin) إلى /usr/local/bin/numa، ويترك إلغاء التثبيت تلك النسخة.
احذف أيضًا ~/.config/numa إذا أنشأت إعدادات مستخدم، ومسار [server] data_dir إذا قمت بتعيينه.
الخدمات المحلية
سمِّ خدمات التطوير الخاصة بك بدلًا من تذكّر أرقام المنافذ:
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)، أو شارك الخدمات عبر الأجهزة عبر اكتشاف LAN، أو اضبط كل شيء في numa.toml.
حجب الإعلانات والخصوصية
حجب الإعلانات والمتتبعات عبر Hagezi Pro، يُحدَّث يوميًا. يعمل على أي شبكة — المقاهي، الفنادق، المطارات. يرافق حاسوبك المحمول.
ثلاثة أوضاع للحل:
forward(افتراضي) — وكيل شفاف إلى DNS نظامك الحالي. كل شيء يعمل كما كان، فقط مع التخزين المؤقت وحجب الإعلانات فوقه. البوابات المقيدة، VPNs، DNS المؤسسي — كلها محترمة.recursive— الحل مباشرة من خوادم الأسماء الجذرية. لا اعتماد على خادم أعلى، ولا كيان واحد يرى نمط استعلاماتك الكامل. أضف[dnssec] enabled = trueللتحقق الكامل من سلسلة الثقة.auto— يفحص الخوادم الجذرية عند بدء التشغيل، عودي إذا كان يمكن الوصول، وإلا forward عبر DoH إلى Quad9 (https://9.9.9.9/dns-query)، الذي يرى استعلاماتك حينها. استخدمforwardمع[upstream]الخاص بك لاختيار مزوّد مختلف.
يتحقق DNSSEC من سلسلة الثقة الكاملة: توقيعات RRSIG، التحقق من DNSKEY، تفويض DS، إثباتات الرفض NSEC/NSEC3. اقرأ كيف يعمل ←
مستمع DNS-over-TLS (RFC 7858) — اقبل الاستعلامات المشفرة على المنفذ 853 من العملاء الصارمين مثل iOS Private DNS، أو systemd-resolved، أو stubby. وضعان:
- موقّع ذاتيًا (افتراضي) — يولّد numa شهادة CA محلية تلقائيًا. يضيفها
numa installإلى مخزن ثقة النظام على macOS، وLinux (Debian/Ubuntu، Fedora/RHEL/SUSE، Arch)، وWindows، ويزيلهاnuma uninstall. على iOS، ثبّت ملف.mobileconfigمنnuma setup-phone. يحتفظ Firefox بمخزن NSS الخاص به ويتجاهل مخزن النظام — ثق بـ CA هناك يدويًا إذا كنت بحاجة إلى HTTPS لخدمات.numaفي Firefox. - أحضر شهادتك الخاصة — وجّه
[dot] cert_path/key_pathإلى شهادة موثوقة علنًا (مثل Let's Encrypt عبر تحدي DNS-01 على نطاق يشير إلى نسخة numa الخاصة بك). يتصل العملاء دون أي إعداد لمخزن الثقة — نفس تجربة AdGuard Home أو Cloudflare1.1.1.1.
يُعلَن عن ALPN "dot" ويُفرض في كلا الوضعين؛ يُرفض أي handshake بـ ALPN غير مطابق كدفاع ضد الخلط بين البروتوكولات.