
ioc2rpz هو المكان الذي يلتقي فيه استخبارات التهديدات مع DNS.
ioc2rpz™: حل أمان DNS - ioc2rpz™ هو خادم DNS قوي يحول مؤشرات التهديد إلى خلاصات منطقة سياسة الاستجابة (RPZ) قابلة للتنفيذ. يقوم بأتمتة عملية التحديث، مما يضمن حماية شبكتك من أحدث التهديدات، بما في ذلك النطاقات الضارة وعناوين IP. من خلال تحويل خلاصات IOC إلى RPZ، يعمل ioc2rpz™ كحلقة وصل حاسمة بين استخبارات التهديدات وأمان DNS، متوافقاً مع خوادم DNS التي تدعم RPZ مثل ISC Bind أو PowerDNS.
DNS هو مستوى التحكم في الإنترنت. عادةً ما يُستخدم DNS للأغراض الجيدة ولكن:

ISC Bind هو المعيار الفعلي لخادم الأسماء. مع إدخال مناطق سياسة الاستجابة في ISC BIND 9.8 أصبحت مراقبة البرامج الضارة واحتوائها على طبقة DNS مهمة بسيطة. يتم دعم RPZ في PowerDNS recursor 4.0.0 والإصدارات الأحدث. كما يدعم Knot DNS RPZ جزئياً.
بالمقارنة مع حلول حماية الشبكة التقليدية، يمكن لخادم DNS التعامل مع ملايين المؤشرات دون تأثير على الأداء، لكن لم تكن هناك طريقة آلية وفعالة للحفاظ على مناطق سياسة الاستجابة على خوادم DNS الأساسية.
عادةً ما يتم توزيع مؤشرات الاختراق بنص عادي ولكن بتنسيقات مختلفة، ولا يتوفر سوى عدد قليل من مزودي IOC لها عبر RPZ.
ioc2rpz™ هو خادم DNS مخصص يقوم تلقائياً بتحويل المؤشرات (مثل أسماء النطاقات الكاملة المؤهلة الخبيثة، عناوين IP) من مصادر مختلفة إلى خلاصات RPZ ويحافظ عليها/يحدّثها تلقائياً. يمكن توزيع الخلاصات على أي خوادم DNS مفتوحة المصدر و/أو تجارية تدعم RPZ، مثل ISC Bind و PowerDNS. يمكنك تشغيل خادم DNS الخاص بك مع تصفية RPZ على جهاز التوجيه أو سطح المكتب أو الخادم وحتى Raspberry Pi. ذاكرة النظام هي القيد الوحيد.
مع ioc2rpz™ يمكنك تحديد الخلاصات والإجراءات الخاصة بك ومنع الاتصالات غير المرغوب فيها.
يقوم ioc2rpz™ بتحويل خلاصات IOC إلى مناطق سياسة الاستجابة (RPZ). يمكنك خلط الخلاصات لإنشاء RPZ واحد أو عدة RPZs. يمكن إدراج النطاقات وعناوين IP الموثوقة في القائمة البيضاء. يدعم ioc2rpz™ انتهاء صلاحية المؤشرات ويعيد بناء المناطق وفقاً لذلك.
يدعم الإصدار الحالي: الملفات المحلية، الملفات/الطلبات عبر http/https/ftp والنصوص البرمجية shell للوصول إلى أنواع الموارد الأخرى. يمكنك استخدام أي تنسيق ملف إذا كان بإمكانك كتابة REGEX لاستخراج المؤشرات، ويتم فصل المؤشرات بحرف سطر جديد و/أو إرجاع العربة (/n, /r, /r/n).
تم بناء ioc2rpz على Erlang/OTP مع شجرة إشراف تضمن تحمل الأخطاء والاسترداد التلقائي. انظر docs/architecture.md للحصول على التفاصيل الكاملة.``` ioc2rpz_app (application) └── ioc2rpz_sup (supervisor) ├── ioc2rpz_db_sup — ETS table heir process ├── ioc2rpz_tcp_sup — TCP listener pool (5 workers) ├── ioc2rpz_udp_sup — UDP listener ├── ioc2rpz_tls_sup — TLS/DoT listener pool (5 workers) [if cert configured] └── ioc2rpz_rest_sup — Cowboy HTTPS (REST API + DoH) [if cert configured]
الوحدات الأساسية:
| الوحدة | المسؤولية |
|--------|---------------|
| `ioc2rpz.erl` | عامل DNS TCP/TLS — استقبال، تحليل، تحقق، استجابة |
| `ioc2rpz_udp.erl` | مستمع DNS UDP — استعلامات SOA |
| `ioc2rpz_conn.erl` | جلب مصدر IOC (HTTP/HTTPS/ملف/شل) |
| `ioc2rpz_db.erl` | ذاكرة تخزين مؤقت للمناطق والحزم قائمة على ETS |
| `ioc2rpz_sup.erl` | المشرف الرئيسي، تحميل التكوين، جدولة المناطق |
| `ioc2rpz_rest.erl` | واجهة برمجة تطبيقات إدارة REST (Cowboy) |
| `ioc2rpz_doh.erl` | معالج DNS عبر HTTPS |
## كيفية استخدام ioc2rpz™
يمكنك استخدام ioc2rpz™ مع أي خادم DNS يدعم مناطق سياسة الاستجابة (Response Policy Zones) مثل الإصدارات الحديثة من ISC BIND و PowerDNS وأي خادم DNS تجاري مبني على هذه المنتجات (مثل Infoblox و Blue Cat و Efficient IP). يتم توفير ملف تكوين نموذجي لـ BIND (named.conf) في مجلد cfg.
<p align="center"><a href="http://www.youtube.com/watch?feature=player_embedded&v=bvhyMFa_mBM" target="_blank"><img src="https://raw.githubusercontent.com/Homas/ioc2rpz/master/ioc2rpz_demo.png"></a></p>
## واجهة الويب لـ ioc2rpz™
[ioc2rpz.gui](https://github.com/Homas/ioc2rpz.gui) هي واجهة ويب إدارية تم تطويرها كمشروع منفصل. لا تتطلب تشغيل ioc2rpz™.
## دعم البروتوكولات
يستمع ioc2rpz™ على بروتوكولات نقل متعددة. تشترك جميع بروتوكولات النقل في نفس خط أنابيب معالجة الاستعلام: تحديد المعدل، التحقق من TSIG، البحث في المنطقة، وتوليد الاستجابة. راجع [docs/protocols.md](https://github.com/homas/ioc2rpz/blob/master/docs/protocols.md) للوثائق الكاملة للبروتوكولات.
### ملخص المنافذ
| المنفذ | البروتوكول | الخدمة | الشرط |
|------|----------|---------|-----------|
| 53 | UDP | استعلامات DNS (SOA فقط) | دائمًا |
| 53 | TCP | استعلامات DNS، نقل المناطق AXFR/IXFR، الإدارة | دائمًا |
| 853 | TCP+TLS | DoT — نفس TCP ولكن مشفر | يتطلب تكوين `cert` |
| 443/8443 | TCP+TLS | DoH (`/dns-query`) و REST API | يتطلب تكوين `cert` |
### UDP (المنفذ 53)
يستخدم UDP للاستعلامات الخفيفة DNS، بشكل أساسي استعلامات SOA. الاستجابات التي تتجاوز 512 بايت (أو حجم المخزن المؤقت المعلن عنه في EDNS0) تقوم بتعيين بت الاقتطاع (TC) وفقًا لـ RFC 1035 §4.2.1، مما يدفع العملاء إلى إعادة المحاولة عبر TCP. لا يتم دعم أوامر الإدارة عبر UDP.```bash
dig @127.0.0.1 zone.ioc2rpz SOA -y hmac-sha256:keyname:base64key
يتعامل TCP مع نقل النطاقات (AXFR/IXFR)، واستعلامات SOA، وأوامر الإدارة. يتولى مجموعة من 5 عمال قبول مسبق التشغيل التعامل مع الاتصالات الواردة.```bash
dig @127.0.0.1 zone.ioc2rpz AXFR +tcp -y hmac-sha256:keyname:base64key
dig @127.0.0.1 zone.ioc2rpz IXFR=12345 +tcp -y hmac-sha256:keyname:base64key
### DNS عبر TLS / DoT (المنفذ 853)
يدعم ioc2rpz™ توزيع RPZ عبر DoT. يبدأ مستمع TLS تلقائيًا على المنفذ 853 عندما يكون سجل `cert` موجودًا في التكوين. يدعم DoT نفس العمليات التي يدعمها TCP (AXFR و IXFR و SOA والإدارة).
- إصدارات TLS المدعومة: 1.2 و 1.3 (`?TLSVersion = 'tlsv1.2-1.3'`)
- إعادة استخدام الاتصال مدعومة وفقًا لـ RFC 7858 §3.4 (استعلامات متعددة لكل جلسة TLS، مهلة الخمول 30 ثانية)
- TLS PIN غير مدعوم
- يتم إرسال رسائل NOTIFY الخاصة بـ DNS بدون تشفير (UDP عادي)
- يتم تحديث الشهادات تلقائيًا عند استبدال الملفات على القرص (تأخير يصل إلى ~دقيقتين بسبب تخزين Erlang SSL المؤقت)
لإعداد الشهادة، راجع [إعداد الشهادة](#certificate-setup).```bash
# SOA query over DoT
kdig @127.0.0.1 -p 853 zone.ioc2rpz SOA +tls -y hmac-sha256:keyname:base64key
# AXFR over DoT
dig @127.0.0.1 -p 853 zone.ioc2rpz AXFR +tls +tcp -y hmac-sha256:keyname:base64key
يوفر DoH تحليل DNS عبر HTTPS من خلال نقطة النهاية /dns-query. الطرق المدعومة:
?dns=Content-Type: application/dns-message (الحد الأقصى 4096 بايت؛ الحمولات الأكبر تحصل على HTTP 413)تستخدم الردود Content-Type: application/dns-message. يحمل DoH رسالة DNS كاملة بتنسيق السلك ويتم معالجتها عبر نفس المسار مثل Do53/DoT، لذلك يرث نفس مصادقة TSIG؛ تظل نقل النطاقات (AXFR/IXFR) عبر TCP فقط ولا يتم تقديمها عبر DoH.```bash
curl -H "Accept: application/dns-message"
"https://127.0.0.1:443/dns-query?dns=AAABAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQAB" -k
curl -X POST -H "Content-Type: application/dns-message"
--data-binary @dns_query.bin "https://127.0.0.1:443/dns-query" -k
### تحديد معدل الاستعلامات
يتم تحديد معدل استعلامات DNS باستخدام مفتاح ذكي (هجين) بحيث لا يتم معاقبة العملاء الشرعيين متعددي المناطق بينما يتم حظر إساءة استخدام تنويع اسم الاستعلام:
- **المنطقة المزوَّدة + نوع الاستعلام المدعوم** (`SOA`/`AXFR`/`IXFR`، الفئة `IN`) و**أوامر الإدارة المعترف بها** (الفئة `CHAOS`/`TXT`) يتم تتبعها لكل `{client_IP, query_name, query_type}` — بحيث يتم حساب الاقتراع/النقل الثانوي لعدة مناطق (مثل `rpz1`، `rpz2`، `rpz3`) بالإضافة إلى الإدارة من عنوان IP واحد بشكل مستقل لكل منطقة+نوع.
- **كل شيء آخر** (منطقة غير معروفة/غير مزوَّدة، نوع استعلام غير مدعوم، فئة خاطئة، أو اسم إدارة غير معروف) يتم تجميعه لكل `{client_IP}`، وبالتالي لا يمكن للمهاجم تجاوز الحد بتغيير اسم الاستعلام.
عند تجاوز الحد، يرد الخادم باستجابة DNS `REFUSED`.
| المعامل | الافتراضي | الماكرو |
|-----------|---------|-------|
| النافذة | 10 ثوانٍ | `?RATE_LIMIT_WINDOW` (10000 ms) |
| الحد الأقصى للطلبات لكل نافذة (دقيق: منطقة معروفة+نوع / إدارة) | 1 | `?MAX_REQUESTS_PER_WINDOW` |
| الحد الأقصى للطلبات لكل نافذة (إجمالي: منطقة غير معروفة / نوع غير مدعوم) | 1 | `?MAX_UNKNOWN_REQUESTS_PER_WINDOW` |
ينطبق تحديد المعدل على جميع وسائط نقل استعلامات DNS (UDP، TCP، TLS، DoH). يمكن تكوين النافذة والحد عبر الماكرو في `include/ioc2rpz.hrl`.
### إشعار DNS
بعد تحديث المنطقة (AXFR أو IXFR)، يرسل ioc2rpz™ رسائل إشعار DNS ([RFC 1996](https://tools.ietf.org/html/rfc1996)) عبر UDP إلى عناوين IP المكونة في `NotifyList` في RPZ. يؤدي هذا إلى حث خوادم DNS الثانوية على التحقق من الرقم التسلسلي لـ SOA للمنطقة وبدء النقل إذا تغير الرقم التسلسلي.```erlang
%% NotifyList in RPZ config — last field before whitelists
{rpz, {"zone.ioc2rpz", ..., ["source1"], ["10.0.0.1", "10.0.0.2"], []}}.
أسهل طريقة لنشر الخدمة هي استخدام حاويات docker على docker hub. يمكنك العثور على دليل النشر على Docker في wiki الخاص بـ ioc2rpz™.
ioc2rpz™ متاح على Docker Hub. فقط ابحث عن ioc2rpz™. المتطلبات الأساسية:
حيث دليل /home/ioc2rpz/cfg، /home/ioc2rpz/db على نظام المضيف.
يمكنك تمرير اسم ملف تكوين مخصص عبر الوسيط ``-e``. مثال: ``-e CONF=./cfg/ioc2rpz2.conf``
## متغيرات البيئة
تستخدم ioc2rpz™ متغيرات البيئة التالية، وهي ذات صلة أساسية بنشر Docker. يتم تعريفها في `config/sys.config.src` و `config/vm.args`.
| متغير | القيمة الافتراضية | الوصف |
|----------|---------|-------------|
| `IPv4` | — | عنوان ربط IPv4 |
| `IPv6` | — | عنوان ربط IPv6 |
| `CONF` | — | مسار ملف التكوين (مثل `./cfg/ioc2rpz.conf`) |
| `DB` | `/opt/ioc2rpz/db` | دليل قاعدة البيانات لاستمرار ETS |
| `CD` | `/opt/ioc2rpz` | دليل العمل |
| `NODE_NAME` | `ioc2rpz` | اسم عقدة Erlang القصير |
| `IO2Cookie` | `ioc2rpz` | ملف تعريف توزيع Erlang |
مرر متغيرات البيئة إلى Docker باستخدام `-e`:```bash
docker run -d --name ioc2rpz -e CONF=./cfg/custom.conf -e NODE_NAME=mynode ...
يمكنك نشر ioc2rpz™ و ioc2rpz.gui باستخدام Docker Compose. يمكن العثور على ملف docker-compose.yml الأساسي في مستودع ioc2rpz.dc.
فيما يلي مثال docker-compose.yml يُظهر ioc2rpz مع واجهة الويب و حاوية مساعدة لـ Let's Encrypt certbot:```yaml
version: "3.8"
services:
ioc2rpz:
image: pvmdel/ioc2rpz
container_name: ioc2rpz
restart: always
logging:
driver: syslog
ports:
- "53:53/tcp"
- "53:53/udp"
- "853:853/tcp"
- "8443:8443/tcp"
volumes:
- ./cfg:/opt/ioc2rpz/cfg
- ./db:/opt/ioc2rpz/db
- letsencrypt-certs:/opt/ioc2rpz/ssl:ro
ioc2rpz-gui: image: pvmdel/ioc2rpz.gui container_name: ioc2rpz-gui restart: always ports: - "443:443" depends_on: - ioc2rpz
certbot: image: certbot/certbot container_name: certbot volumes: - letsencrypt-certs:/etc/letsencrypt - letsencrypt-www:/var/www/certbot entrypoint: "/bin/sh -c 'trap exit TERM; while :; do certbot renew --quiet; sleep 12h; done'"
volumes: letsencrypt-certs: letsencrypt-www:
قم بتحديث ملف `ioc2rpz.conf` الخاص بك للإشارة إلى مسار الشهادة المُثبت:```erlang
{cert, {"ssl/live/ns1.rpz-proxy.com/fullchain.pem", "ssl/live/ns1.rpz-proxy.com/privkey.pem", ""}}.
يمكنك تشغيل ioc2rpz™ و ioc2rpz.gui على AWS. بالنسبة للنشرات الصغيرة نسبيًا (مئات الآلاف من المؤشرات) حتى الطبقة المجانية كافية. يُظهر الفيديو أدناه كيفية إعداد ioc2rpz™ و ioc2rpz.gui على AWS باستخدام ECS.
شهادات TLS مطلوبة لـ DoT (المنفذ 853) و REST API (المنفذ 8443) و DoH. تُستخدم نفس الشهادة لجميع خدمات TLS. راجع docs/deployment.md للحصول على التفاصيل الكاملة.
openssl req -x509 -newkey rsa:2048 -keyout cfg/ioc2rpz_dot.key
-out cfg/ioc2rpz_dot.crt -days 365 -nodes -subj "/CN=ioc2rpz"
### Let's Encrypt (Production)```bash
# Obtain certificate
sudo certbot certonly --standalone -d ns1.rpz-proxy.com
# Copy to ioc2rpz cfg directory
cp /etc/letsencrypt/live/ns1.rpz-proxy.com/fullchain.pem cfg/ioc2rpz_dot.crt
cp /etc/letsencrypt/live/ns1.rpz-proxy.com/privkey.pem cfg/ioc2rpz_dot.key
0 3 * * * root certbot renew --quiet --deploy-hook "cp /etc/letsencrypt/live/ns1.rpz-proxy.com/fullchain.pem /opt/ioc2rpz/cfg/ioc2rpz_dot.crt && cp /etc/letsencrypt/live/ns1.rpz-proxy.com/privkey.pem /opt/ioc2rpz/cfg/ioc2rpz_dot.key"
يتم أيضًا إعادة تحميل الشهادات صراحةً أثناء إعادة تحميل التكوين (`ioc2rpz-reload-cfg`): عندما يكتشف ioc2rpz أن ملفات الشهادة قد تغيرت، فإنه يعيد تشغيل مستمعي TLS بالشهادة الجديدة فورًا، بدلاً من انتظار ذاكرة التخزين المؤقت لـ SSL الخاصة بـ Erlang والتي تبلغ حوالي دقيقتين. أضف خطوة `ioc2rpz-reload-cfg` إلى خطاف التجديد الخاص بك لتطبيق الشهادات الجديدة دون فترة تعطل.
### تركيب حجم Docker
عند التشغيل في Docker، قم بتركيب دليل الشهادة من المضيف:```bash
docker run -d --name ioc2rpz \
--mount type=bind,source=/etc/letsencrypt/live/ns1.rpz-proxy.com,target=/opt/ioc2rpz/ssl,readonly \
...
المرجع في ioc2rpz.conf:```erlang
{cert, {"ssl/fullchain.pem", "ssl/privkey.pem", ""}}.
يقوم إرلانج تلقائيًا بالتقاط ملفات الشهادات المُستبدلة خلال حوالي دقيقتين. يتم أيضًا إعادة تحميل الشهادات بشكل صريح أثناء إعادة تحميل الإعدادات (`ioc2rpz-reload-cfg`). لا تدع الشهادات تنتهي صلاحيتها — جددها قبل انتهاء الصلاحية لضمان الخدمة دون انقطاع.
## البناء من المصدر
> **ملاحظة:** البناء من المصدر مخصص لـ **التطوير والاختبار**. للإنتاج، **طريقة النشر الموصى بها هي Docker** — انظر [Docker Compose](#docker-compose) ومستودع [ioc2rpz.dc](https://github.com/Homas/ioc2rpz.dc).
### المتطلبات الأساسية
- **Erlang/OTP 24 أو أحدث** (للتحقق استخدم `erl -version`) و [rebar3](https://www.rebar3.org) متوافق.
- سلسلة أدوات C (لبناء التبعيات) و `git`.
### البناء والتشغيل```bash
# 1. Clone the repository
git clone https://github.com/Homas/ioc2rpz.git
cd ioc2rpz
# 2. Build a release
rebar3 release
# 3. Edit the configuration (see the minimal example below)
$EDITOR cfg/ioc2rpz.conf
# 4. Start the server (foreground console, or 'start' for background)
_build/default/rel/ioc2rpz/bin/ioc2rpz console
# or: _build/default/rel/ioc2rpz/bin/ioc2rpz start
بشكل افتراضي، يقرأ ioc2rpz™ إعداداته من ./cfg/ioc2rpz.conf، ويستمع على جميع واجهات الشبكة، ويكتب نسخه الاحتياطية لقاعدة البيانات إلى ./db. توجد الإعدادات الافتراضية وقت التجميع (المنافذ، المسارات، المؤقتات) في include/ioc2rpz.hrl.
ملف cfg/ioc2rpz.conf أدنى يحتوي على مفتاح TSIG واحد، ومصدر ملف واحد، ومنطقة RPZ واحدة:```erlang
%% Server NS record, admin mailbox, management key(s), and management ACL
{srv,{"ns1.example.com","hostmaster.example.com",["mgmtkey"],["127.0.0.1","::1"]}}.
%% A TSIG key (name, algorithm, base64 secret) used for management / zone transfers {key,{"mgmtkey","sha256","5Yvt70eJnf95+LJeI8H3TgKGeVparmMB7udA0pv/JRE="}}.
%% An IOC source: a local file parsed as a full (AXFR) feed of domains {source,{"sample","file:cfg/small_ioc.txt","[:AXFR:]","^([0-9A-Za-z.-]+\.[0-9A-Za-z.-]+)$","",0,0,0,"mixed",true}}.
%% An RPZ zone built from the source, served with the nxdomain action {rpz,{"rpz.example.com",86400,3600,2592000,7200,"true","true","nxdomain",["mgmtkey"],"mixed",604800,86400,["sample"],[],[]}}.
انظر [docs/configuration.md](https://github.com/homas/ioc2rpz/blob/master/docs/configuration.md) للحصول على المرجع الموثوق لكل حقل (source/RPZ tuple layout, SOA timers, key groups, certificates, etc.). لتفعيل DoT (المنفذ 853), DoH, وواجهة برمجة التطبيقات HTTPS REST، أضف إدخال `{cert,{...}}` — انظر [إعداد الشهادة](#certificate-setup).
### شل التطوير (للتطوير/الاختبار فقط)
الأوامر التالية مخصصة للتطوير والاختبار المحلي — وليس للاستخدام في الإنتاج:```bash
# Compile only (no release)
rebar3 compile
# Run the EUnit test suite
rebar3 eunit
# Run tests for a single module
rebar3 eunit --module=ioc2rpz_fun
# Start an interactive shell with the application and all deps loaded
rebar3 shell
في rebar3 shell يمكنك اختبار النظام الجاري مباشرة، على سبيل المثال:```erlang
%% Inspect the listener pools and ETS tables
supervisor:which_children(ioc2rpz_sup).
ets:info(cfg_table, size).
ets:info(rpz_hotcache_table, size).
%% Trigger a configuration reload / forced zone update ioc2rpz_sup:reload_config3(reload). ioc2rpz_sup:update_all_zones(true).
## إدارة ioc2rpz™
### عبر DNS
يدعم ioc2rpz™ الإدارة عبر DNS/TCP أو DoT. يُوصى باستخدام DoT أو REST API عبر DNS/TCP. الإصدار الحالي من ioc2rpz™ لا يدعم عنوان IP/واجهة إدارة منفصلة. على أي حال، يُوصى بشدة بإنشاء مفتاح TSIG مخصص (أو مفاتيح) سيتم استخدامه للإدارة فقط. يمكنك إيقاف تشغيل الإدارة عبر DNS.
الإجراءات المدعومة:
- الحالة الحالية لـ ioc2rpz™. طلب ``ioc2rpz-status``، الفئة ``CHAOS``، السجل ``TXT``. مثال:```
dig +tcp -y dnsmkey_1:ayVnL+h2QKMszRVohrngagcEuIpN3RkecXKdwSa5WsHD5N4Y5R3NUMGM W8sIGv36gPkAtWtgarqKzN9tmHqEnA== @127.0.0.1 ioc2rpz-status TXT -c CHAOS
ioc2rpz-reload-cfg, RR Class CHAOS, RR Type TXTioc2rpz-update-tkeys, RR Class CHAOS, RR Type TXTioc2rpz-update-all-rpz, RR Class CHAOS, RR Type TXTzone_name, RR Class CHAOS, RR Type TXT. مثال: يمكن استدعاء التحديث الشامل لـ dga.ioc2rpz بواسطة:```
dig +tcp -y dnsmkey_1:ayVnL+h2QKMszRVohrngagcEuIpN3RkecXKdwSa5WsHD5N4Y5R3NUMGM W8sIGv36gPkAtWtgarqKzN9tmHqEnA== @127.0.0.1 dga.ioc2rpz TXT -c CHAOS- إيقاف ioc2rpz™. اسم RR ``ioc2rpz-terminate``، فئة RR ``CHAOS``، نوع RR ``TXT``
- طلب منطقة عينة. اسم RR ``sample-zone.ioc2rpz``، فئة RR ``IN``، نوع RR ``AXFR``
### عبر REST
REST API (المنفذ 8443/tcp) هي واجهة الإدارة المفضلة. لأسباب أمنية، يجب تشفير جميع حركة المرور الإدارية ولا يتم تشغيل REST API في حالة عدم وجود شهادة SSL. تقبل جميع نقاط النهاية كلاً من طريقتي GET و POST.
يتم استخدام المصادقة الأساسية لـ HTTP لمصادقة الطلبات. تُستخدم مفاتيح TSIG الإدارية لمصادقة الطلبات. يُستخدم اسم مفتاح TSIG كاسم مستخدم HTTP ومفتاح TSIG ككلمة المرور. يتم تقييد الوصول إلى REST API باستخدام قائمة التحكم في الوصول (ACL) المحددة في سجل `srv`.
يدعم جزء إصدار API كلاً من `v1` و `v1.0` (مثل `/api/v1/stats/serv` أو `/api/v1.0/stats/serv`).
يدعم REST API إخراج JSON (الافتراضي) والنص العادي بناءً على رأس `Accept`:
- `application/json` — إخراج JSON (الافتراضي)
- `text/plain` — إخراج نص عادي```bash
# Example: plain text output
curl -u "keyname:base64key==" -k -H "Accept: text/plain" https://127.0.0.1:8443/api/v1/mgmt/update_tkeys
تستخدم الاستجابات النصية التنسيق:``` status: ok msg: TSIG keys were updated
#### معلمات المسار
| المعلمة | الوصف |
|---------|-------|
| `:rpz_name` | اسم منطقة RPZ (مثل `dga.ioc2rpz`) |
| `:source_name` | اسم مصدر IOC (مثل `sample_fqdn`) |
| `:ioc` | المؤشر المراد البحث عنه (FQDN أو IP، مثل `baddomain.com`) |
#### نقاط نهاية الإحصائيات
`/api/v1/stats/serv` — إحصائيات الخادم (اسم العقدة، إجمالي القواعد، استخدام الذاكرة)```bash
curl -u "keyname:base64key==" -k https://127.0.0.1:8443/api/v1/stats/serv
{
"srv": {
"node_name": "ioc2rpz@hostname",
"srv_total_rules": 15000,
"hot_cache_mem": "12.5 Mb",
"axfr_table_mem": "45.2 Mb",
"ixfr_table_mem": "8.1 Mb"
},
"rpz": [...],
"sources": [...]
}
/api/v1/stats/rpz — إحصائيات منطقة RPZ```bash
curl -u "keyname:base64key==" -k https://127.0.0.1:8443/api/v1/stats/rpz
```json
{
"rpz": [
{
"name": "malware.ioc2rpz",
"status": "ready",
"rule_count": 5000,
"ioc_count": 4500,
"serial": 1709000000,
"serial_ixfr": 1708990000,
"update_time": 1709000000,
"ixfr_update_time": 1708995000,
"ixfr_nz_update_time": 1708995000
}
]
}
يشير حقل status (ready، updating، forceAXFR، notready) إلى ما إذا كانت الأعداد/الرقم التسلسلي المبلغ عنها حالية؛ عندما يكون الحقل updating أو forceAXFR فإنها تعكس آخر تحديث مكتمل. يتم الاحتفاظ بالأعداد والرقم التسلسلي عبر إعادة تحميل التهيئة بدلاً من إعادة تعيينها إلى الصفر.
/api/v1/stats/source — إحصائيات المصدر```bash
curl -u "keyname:base64key==" -k https://127.0.0.1:8443/api/v1/stats/source
```json
{
"sources": [
{"name": "sample_fqdn", "ioc_count": 150}
]
}
/api/v1/mgmt/reload_cfg — إعادة تحميل ملف التكوين```bash
curl -u "keyname:base64key==" -k https://127.0.0.1:8443/api/v1/mgmt/reload_cfg
نجاح: `{"status":"ok","msg":"Configuration reloaded"}`
خطأ (HTTP 520): `{"status":"error","msg":"Configuration reload error"}`
`/api/v1/mgmt/update_tkeys` — إعادة تحميل مفاتيح TSIG من التهيئة```bash
curl -u "keyname:base64key==" -k https://127.0.0.1:8443/api/v1/mgmt/update_tkeys
نجاح: {"status":"ok","msg":"TSIG keys were updated"}
خطأ (HTTP 520): {"status":"error","msg":"TSIG keys update error"}
/api/v1/mgmt/terminate — إيقاف تشغيل الخادم بلطف```bash
curl -u "keyname:base64key==" -k https://127.0.0.1:8443/api/v1/mgmt/terminate
نجاح: `{"status":"ok","msg":"Terminating"}`
#### نقاط نهاية تحديث المنطقة
`/api/v1/update/all_rpz` — فرض تحديث كامل لجميع مناطق RPZ```bash
curl -u "keyname:base64key==" -k https://127.0.0.1:8443/api/v1/update/all_rpz
Success: {"status":"ok","msg":"سيتم تحديث جميع مناطق RPZ"}
/api/v1/update/:rpz_name — فرض تحديث كامل لمنطقة معينة```bash
curl -u "keyname:base64key==" -k https://127.0.0.1:8443/api/v1/update/dga.ioc2rpz
نجاح: `{"status":"ok","msg":"RPZ dga.ioc2rpz will be updated"}`
خطأ (HTTP 520): `{"status":"error","msg":"RPZ dga.ioc2rpz not found"}`
#### نقاط نهاية إدارة ذاكرة التخزين المؤقت
`/api/v1/cache/sources/clear/all` — إزالة جميع المصادر من ذاكرة التخزين المؤقت الساخنة```bash
curl -u "keyname:base64key==" -k https://127.0.0.1:8443/api/v1/cache/sources/clear/all
نجاح: {"status":"ok","msg":"All sources were removed from the hotcache"}
/api/v1/cache/sources/clear/:source_name — إزالة مصدر معين من ذاكرة التخزين المؤقت الساخنة```bash
curl -u "keyname:base64key==" -k https://127.0.0.1:8443/api/v1/cache/sources/clear/sample_fqdn
نجاح: `{"status":"ok","msg":"sample_fqdn source was removed from the hot cache"}`
`/api/v1/cache/sources/load/all` — إعادة تحميل جميع المصادر إلى الذاكرة المؤقتة الساخنة```bash
curl -u "keyname:base64key==" -k https://127.0.0.1:8443/api/v1/cache/sources/load/all
Success: {"status":"ok","msg":"All sources will loaded to the hot cache"}
/api/v1/feed/:rpz_name — احصل على المؤشرات من تغذية RPZ
معامل الاستعلام: ?type=fqdn|ip|both (الافتراضي: both)```bash
curl -u "keyname:base64key==" -k "https://127.0.0.1:8443/api/v1/feed/malware.ioc2rpz?type=fqdn"
نجاح:```json
{
"status": "ok",
"rpz": "malware.ioc2rpz",
"iocs": ["baddomain.com", "evil.example.org"]
}
خطأ (HTTP 520): {"status":"error","msg":"RPZ malware.ioc2rpz not found"}
/api/v1/ioc/:ioc — تحقق مما إذا كان المؤشر محظورًا بأي خلاصة RPZ
معلمة الاستعلام: ?tkey=keyname — قصر البحث على النطاقات التي يمكن الوصول إليها بواسطة ذلك المفتاح (اختياري)```bash
curl -u "keyname:base64key==" -k "https://127.0.0.1:8443/api/v1/ioc/baddomain.com?tkey=dnsproxykey_1"
نجاح:```json
{
"ioc": "baddomain.com",
"tkey": "dnsproxykey_1",
"data": [
{
"ioc": "baddomain.com",
"feeds": [
{
"feed": "malware.ioc2rpz",
"wildcard": "true",
"type": "fqdn",
"rpz_serial": 1709000000,
"ioc_expiration": 0,
"sources": ["abuse-ch", "internal-list"]
}
]
}
]
}
خطأ: {"status":"error", "ioc": "nonexistent.com"}
الحقل الإضافي sources يسرد أسماء المصادر المساهمة لكل تغذية عند تمكين تتبع المصدر؛ ويكون null عند تعطيل التتبع أو عدم معرفة الإسناد. راجع إسناد مصدر IOC للتكوين والدلالات.
أي مسار غير معروف يعيد HTTP 200 مع:```json {"status":"error","msg":"Unsupported request"}
## المراقبة وفحوصات الصحة
### إحصائيات REST API```bash
# Server statistics
curl -u "keyname:key==" -k https://127.0.0.1:8443/api/v1/stats/serv
# RPZ zone statistics (indicator counts, serials, update times)
curl -u "keyname:key==" -k https://127.0.0.1:8443/api/v1/stats/rpz
# Source statistics
curl -u "keyname:key==" -k https://127.0.0.1:8443/api/v1/stats/source
إذا كنت تعمل في شل تفاعلي أو متصلاً بعقدة قيد التشغيل:```erlang %% Check supervisor children supervisor:which_children(ioc2rpz_sup). supervisor:count_children(ioc2rpz_tls_sup_v6). supervisor:count_children(ioc2rpz_tcp_sup_v6).
%% Check ETS table sizes (memory usage) ets:info(cfg_table, size). ets:info(rpz_hotcache_table, size). ets:info(rate_limits, size).
### فحوصات صحة DNS```bash
# SOA query over UDP
dig @localhost -p 53 your-zone.rpz SOA +short
# Zone transfer over TCP
dig @localhost -p 53 your-zone.rpz AXFR +tcp -y hmac-sha256:keyname:base64key
# DoT query
dig @localhost -p 853 +tls your-zone.rpz SOA
# Sample zone (built-in test zone)
dig @localhost sample-zone.ioc2rpz AXFR +tcp
انظر إلى docs/deployment.md للحصول على مرجع كامل للمراقبة والسجلات.
انظر إلى docs/deployment.md لاستكشاف الأخطاء وإصلاحها بالتفصيل.
التكوين هو ملف Erlang. كل خيار تكوين هو مصطلح Erlang لذا يجب أن يتوافق التكوين مع صيغة Erlang. يتحقق الخادم من صحة إدخالات التكوين عند التحميل/إعادة التحميل: ترميز مفتاح TSIG، وجود ملف الشهادة، تجميع التعبير العادي، وصيغة URL. يتم تسجيل الإدخالات غير الصالحة وتجاوزها. انظر إلى docs/configuration.md للحصول على مرجع كامل للتكوين.
يدعم ioc2rpz™ معلمات التكوين التالية:
يستخدم سجل srv لتحديد القيم الافتراضية للخادم. يتكون من:
TrackSources — الإعداد الافتراضي العام على مستوى الخادم لإسناد المصدر: off | auto | on (الافتراضي off). يُطبق على أي مصدر تغذية لم يتم تعيين track_sources الخاص به. انظر إسناد مصدر IOC.نموذج سجل srv:``` {srv,{"ns1.example.com","support.email.example.com",["dnsmkey_1","dnsmkey_2","dnsmkey_3"],["acl_ip1","acl_ip2"]}}.
%% With the optional global source-tracking default (5-field form): {srv,{"ns1.example.com","support.email.example.com",["dnsmkey_1"],["acl_ip1"],auto}}.
يظل نموذج الحقول الأربعة صالحًا ويضبط `TrackSources` افتراضيًا على `off`.
### **cert** سجل
يُستخدم سجل **cert** لتحديد شهادة ومفتاح خاص لاتصالات DNS عبر TLS و REST API و DoH. لإنشاء الشهادات وإدارتها، راجع [إعداد الشهادة](#certificate-setup).
يتكون من:
- مسار إلى ملف يحتوي على شهادة؛
- مسار إلى ملف يحتوي على مفتاح خاص مشفّر بصيغة PEM؛
- مسار إلى ملف يحتوي على شهادات CA بصيغة PEM.
نموذج سجل **cert**:```
{cert,{"cfg/cert.pem", "cfg/key.pem", "cfg/cacerts.pem"}}.
سجل include يسمح بتقسيم تكوين ioc2rpz™ إلى ملفات متعددة.
مثال include سجل:``` {include,"cfg/tkeys.include.cfg"}.
### **key** سجل
تُستخدم مفاتيح TSIG للمصادقة والترخيص. يُوصى باستخدام مفاتيح TSIG مختلفة لإدارة ioc2rpz™ ونقل المناطق.
يتكون سجل **key** من:
- اسم مفتاح TSIG;
- الخوارزمية. مدعوم من ``md5``، ``sha256`` و ``sha512``;
- المفتاح;
- (اختياري) قائمة مجموعات المفاتيح التي ينتمي إليها.
عينات من سجلات **key**:```
{key,{"key_name_1","md5","ayVnL+h2QKMszRVohrngagcEuIpN3RkecXKdwSa5WsHD5N4Y5R3NUMGM W8sIGv36gPkAtWtgarqKzN9tmHqEnA=="}}.
{key,{"key_name_2","sha256","5Yvt70eJnf95+LJeI8H3TgKGeVparmMB7udA0pv/JRE="}}.
{key,{"key_name_3","sha512","03uuaGl9kqfenjRgIeCv6e29lVvMwviB1+cDX1I0jcVOcTU4jWFwRkfo3ULRMD+NGDfwzYvXkJ94FNEaAW4vzw==",["customers","public"]}}.
يمكن استخدام أداة dnssec-keygen لتوليد مفاتيح TSIG:```bash
dnssec-keygen -a HMAC-MD5 -b 512 -n USER tsig-key
dnssec-keygen -a HMAC-SHA256 -b 256 -n USER tsig-key
dnssec-keygen -a HMAC-SHA512 -b 512 -n USER tsig-key
يرجى الرجوع إلى وثائق "dnssec-keygen" للحصول على التفاصيل. يمكن تعيين المفاتيح إلى مجموعات للتفويض القائم على المجموعات في التحكم في الوصول إلى منطقة RPZ.
### **key_group** سجل
توفر مجموعات المفاتيح تفويضًا قائمًا على المجموعات لنقل المناطق وإدارتها. بدلاً من سرد المفاتيح الفردية في سجلات `rpz` أو `srv`، يمكنك تعيين المفاتيح إلى مجموعات مسماة والإشارة إلى المجموعة.
هناك طريقتان لتعيين المفاتيح إلى المجموعات:
1. مضمنًا عبر الحقل الرابع الاختياري لسجل `key`: `{key, {Name, Alg, Secret, [Groups]}}`
2. صراحةً عبر سجل `key_group` (موضح أدناه)```erlang
{key_group, {GroupName, [KeyName1, KeyName2, ...]}}.
| Field | Type | Description |
|---|---|---|
| GroupName | string | اسم المجموعة (مثل "customers") |
| Keys | list of strings | قائمة بأسماء مفاتيح TSIG التابعة لهذه المجموعة |
نموذج لسجلات key_group:```erlang {key_group, {"customers", ["dnsproxykey_1", "dnsproxykey_2"]}}. {key_group, {"public", ["dnsproxykey_3"]}}.
يتم الإشارة إلى المجموعات في سجلات `rpz` و `srv` باستخدام الصيغة `{groups, ["group1", "group2"]}` في قائمة المفاتيح:```erlang
{rpz, {"zone.ioc2rpz", 7202, 3600, 2592000, 7200, "true", "true", "nxdomain",
["dnsproxykey_1", {groups, ["customers", "public"]}],
"fqdn", 86400, 3600, ["source1"], [], []}}.
تُستخدم القوائم البيضاء لمنع الأخطاء المحتملة وحجب النطاقات وعناوين IP الموثوقة. تتم إزالة مؤشرات القائمة البيضاء من مناطق سياسة الرد. يقوم ioc2rpz™ بالتحقق من التطابق التام فقط، لذلك لن يقوم بتقسيم أو تجاهل شبكة إذا تم تضمين عنوان IP مدرج في القائمة البيضاء ضمن شبكة فرعية محظورة والعكس صحيح. القائمة البيضاء هي ملف نصي أو مصدر تغذية ببيانات نصية. يجب فصل المؤشرات بأحرف السطر الجديد (/n, /r أو كليهما /n/r). يجب أن تحتوي القوائم البيضاء على أسماء نطاقات مؤهلة بالكامل (FQDNs) و/أو عناوين IP صالحة. يدعم ioc2rpz™ عددًا غير محدود من المؤشرات.
يتكون سجل القوائم البيضاء من:
"")، فسيتم استخدام تعبير عادي افتراضي ("^([A-Za-z0-9][A-Za-z0-9\-\._]+)[^A-Za-z0-9\-\._]*.*$"). يُستخدم none إذا لم يكن التعبير العادي مطلوبًا (يوفر المصدر بالفعل بيانات بالتنسيق المطلوب).نموذج سجل القائمة البيضاء:``` {whitelist,{"whitelist_1","file:cfg/whitelist1.txt",none}}.
### **سجل المصدر**
المصدر هو تغذية تحتوي على مؤشرات ضارة. يتم دعم أسماء النطاقات المؤهلة بالكامل وعناوين IPv4 وIPv6. المصدر هو ملف نصي أو تغذية بيانات نصية. يجب فصل المؤشرات بواسطة أحرف السطر الجديد/الرجوع ( /n, /r أو كليهما /r/n ). يدعم ioc2rpz™ عددًا غير محدود من المؤشرات.
يتكون **سجل المصدر** من:
- اسم المصدر;
- مسار المصدر لنقل المصدر الكامل (AXFR). يتم دعم عناوين URL (http/https/ftp)، والملفات المحلية، والبرامج النصية. يتم استخدام البادئة **file:** للملفات المحلية. يتم استخدام البادئة **shell:** لتنفيذ برنامج نصي/أمر محلي على مضيف/حاوية يجب أن يُرجع المؤشرات وتاريخ انتهاء الصلاحية اختياريًا إلى STDOUT;
- مسار المصدر لنقل المصدر المتزايد (IXFR). تدعم مسارات AXFR و IXFR كلمات مفتاحية لتقصير عناوين URL وتوفير طوابع زمنية لتحديث المنطقة:
- **[:AXFR:]** - مسار AXFR الكامل. يمكن استخدامه فقط في مسارات IXFR;
- **[:FTimestamp:]** - الطابع الزمني لآخر تحديث للمصدر (مثال: 1507946281)
- **[:ToTimestamp:]** - الطابع الزمني الحالي;
- تعبير REGEX يُستخدم لاستخراج المؤشرات ووقت انتهاء صلاحيتها. المطابقة الأولى هي المؤشر، المطابقة الثانية هي وقت انتهاء الصلاحية. وقت انتهاء الصلاحية هو معامل اختياري. يجب تضمين التعبير النمطي بين علامتي اقتباس مزدوجتين. إذا حددت تعبير REGEX فارغًا (`""`)، فسيتم استخدام تعبير REGEX افتراضي (`"^([A-Za-z0-9][A-Za-z0-9\-\._]+)[^A-Za-z0-9\-\._]*.*$"`). يتم استخدام `none` إذا لم يكن هناك حاجة إلى REGEX (المصدر يوفر البيانات بالفعل بالتنسيق المطلوب).
المعاملات الاختيارية (يجب استخدام الكل أو لا شيء):
- UserID (يستخدم داخليًا).
- الحد الأقصى لعدد مؤشرات الاختراق (IoCs).
- تحديث المصدر الكامل، وقت التخزين المؤقت الساخن (بالثواني).
- تحديث المصدر المتزايد، وقت التخزين المؤقت الساخن (بالثواني).
تقوم تنزيلات المصدر عبر HTTPS بالتحقق من شهادة TLS للخادم البعيد. ستفشل تنزيلات المصادر ذات الشهادات غير الصالحة أو الموقعة ذاتيًا. بالنسبة للشهادات الموقعة ذاتيًا، استخدم مصدرًا من نوع `shell:` مع `curl --insecure`.
**قيود الملفات المحلية:** يتم رفض مسارات `file:` التي تحتوي على `..` (التنقل إلى المجلد الأصلي) لأسباب أمنية؛ استخدم مسارًا بدون `..` (داخل دليل العمل/البيانات).
**قيود أوامر shell:** يجب أن يكون الملف القابل للتنفيذ لكل جزء من خط الأنابيب مسارًا مطلقًا (مثل `/usr/bin/curl`) أو أداة نصوص آمنة ذات اسم بسيط (`sort`, `uniq`, `grep`, `sed`, `awk`, `gawk`, إلخ)؛ يتم حظر الأوامر المدمرة وواجهات الأوامر (`rm`, `bash`, `sh`, إلخ)، ويتم رفض استبدال الأوامر (`$(...)`, backticks) وإعادة توجيه الإخراج (`>`, `>>`). لا يتم تنفيذ الأوامر المرفوضة ويتم تسجيلها عبر حدث CEF 151 (الأوامر المنفذة عبر 150). راجع [docs/configuration.md](https://github.com/homas/ioc2rpz/blob/master/docs/configuration.md#shell-command-restrictions) للحصول على مجموعة القواعد الكاملة.
إذا أرجع مصدر أقل من 50% من عدد مؤشراته السابقة، يتم رفض التحديث ويتم الاحتفاظ بالبيانات السابقة. يمنع هذا التغذية المتدهورة من تقليل تغطية RPZ. يمكن تكوينه عبر ماكرو `?SOURCE_MIN_IOC_RATIO`.
نموذج **سجل المصدر**:```
%% Local file source — indicators without expiration
{source,{"sample_fqdn","file:cfg/sample_ioc_fqdn.txt","[:AXFR:]",none}}.
%% Local file source — indicators with expiration timestamps (tab-separated)
{source,{"sample_expire","file:cfg/sample_ioc_expire.txt","[:AXFR:]","^([A-Za-z0-9][A-Za-z0-9\-\._]+)\t([0-9TZ:\-]+)$"}}.
%% Shell source — fetch RPZ via AXFR and extract CNAMEs
{source,{"base.rpz1","shell:/usr/bin/dig -y KEYNAME:TSIGKEY @127.0.0.1 base.rpz.ioc2rpz.local axfr | /bin/grep -e CNAME | /bin/grep -v '*.' | /usr/bin/awk -F '.base.rpz' '{print $1}'","",none}}.
يُستخدم مصدر shell: لتوسيع خيارات الاتصال الخاصة بـ ioc2rpz™ والتي تكون محدودة بعض الشيء بشكل أصلي. تحتوي حاوية ioc2rpz™ على dig وgrep وawk وpython. على سبيل المثال، يمكنك مزج خلاصات RPZ مختلفة أو جلب البيانات من قاعدة بيانات.
قيود أوامر Shell: يجب أن تستخدم جميع الملفات القابلة للتنفيذ مسارات مطلقة (مثل /usr/bin/curl وليس curl). الأوامر المدمرة (rm وbash وsh إلخ.) محظورة. استبدال الأوامر ($(...) وعلامات الاقتباس الخلفية) وإعادة توجيه الإخراج (> و>>) مرفوضة. انظر docs/configuration.md للحصول على التفاصيل الكاملة.
أمان الملفات المحلية: يتم رفض مسارات الملفات التي تحتوي على .. (انتقال الدليل الأصل) لأسباب أمنية.
مصطلح RPZ يحدد منطقة سياسة الاستجابة.
سجل rpz يتكون من:
true أو false. true تحدد أنه يجب تخزين RPZ مؤقتًا، false - غير مخزنة مؤقتًا، يتم تنزيل مصادر المنطقة الحية وإنشاء RPZ بواسطة طلب AXFR. المناطق "الحية" لا تدعم نقل المنطقة المتزايد. إذا لم يتم تخزين خلاصة RPZ مؤقتًا على أي حال، يتم تخزينها مؤقتًا في ذاكرة تخزين مؤقتة ساخنة. في حالة انتهاء مهلة الطلب من العميل، سنتمكن من الرد في المرة القادمة. سيتم استخدام وقت AXFR لتحديد عمر ذاكرة التخزين المؤقت;true أو false. تحدد ما إذا كان يجب إنشاء قواعد البدائل;mixed، fqdn، ip. يتم استخدامه للتحسين.يمكن دمج إجراءات محلية متعددة في قائمة: [{"local_a","127.0.0.1"},{"local_aaaa","fe80::1"},{"local_txt","Blocked"}]
نموذج لسجل rpz:``` {rpz,{"zone_name",soa_refresh, soa_update_retry,soa_expire,soa_nxdomain_ttl,"cache","wildcards","action",["key1","key2"],"Zone_type",AXFT_Time, IXFR_Time,["source1","source2"],["notify_ip1","notify_ip2"],["whitelist_1","whitelist_2"]}}.
{rpz,{"zone_name",soa_refresh, soa_update_retry,soa_expire,soa_nxdomain_ttl,"cache","wildcards","action",["key1","key2",{groups,["group1","group2"]}],"Zone_type",AXFT_Time, IXFR_Time,["source1","source2"],["notify_ip1","notify_ip2"],["whitelist_1","whitelist_2"]}}.
{rpz,{"mixed.ioc2rpz",7202,3600,2592000,7200,"true","true","passthru",["dnsproxykey_1","dnsproxykey_2"],"mixed",86400,3600,["sample_fqdn","sample_expire","sample_ip"],[],["whitelist_1","whitelist_2"]}}.
{rpz,{"mixed.ioc2rpz",7202,3600,2592000,7200,"true","true","passthru",["dnsproxykey_1","dnsproxykey_2",{groups,["public","ip2"]}],"mixed",86400,3600,["sample_fqdn","sample_expire","sample_ip"],[],["whitelist_1","whitelist_2"]}}.
%% With explicit per-feed source tracking (16-field form; trailing auto):
{rpz,{"mixed.ioc2rpz",7202,3600,2592000,7200,"true","true","passthru",["dnsproxykey_1"],"mixed",86400,3600,["sample_fqdn","sample_expire","sample_ip"],[],["whitelist_1"],auto}}.
### إسناد مصدر IOC
يتم بناء تغذية RPZ من خلال دمج المؤشرات من مصادر متعددة. يتيح إسناد المصدر لواجهة برمجة تطبيقات البحث عن IOC الإبلاغ عن **المصدر (المصادر) داخل التغذية** الذي ساهم في المؤشر — وهو مفيد لفرز الإبلاغ عن إيجابية خاطئة. التتبع **معطل افتراضيًا** ويتم التحكم فيه لكل تغذية مع إعداد افتراضي عام اختياري على مستوى الخادم.
**الإعدادات**
- لكل تغذية: العنصر الاختياري الختامي (السادس عشر) `TrackSources` من المجموعة `{rpz,{...}}` — `auto | true | false`.
- الإعداد الافتراضي العام للخادم: العنصر الاختياري الختامي (الخامس) `TrackSources` من المجموعة `{srv,{...}}` — `off | auto | on` (الافتراضي `off`).
كلا الخيارين اختياري ومتوافق مع الإصدارات السابقة: ملفات التكوين الحالية (حقل `rpz` بـ 15 حقلًا، وحقل `srv` بـ 4 حقول) تُحمَّل دون تغيير وتعمل كمعطلة.
**أسبقية الدقة** — يتم تحديد الحالة الفعلية للتغذية على النحو التالي:
1. قيمة `track_sources` الصريحة للتغذية، إذا تم تعيينها؛
2. وإلا الإعداد الافتراضي العام للخادم؛
3. وإلا الإعداد الافتراضي المدمج `off`.
`auto` يعني: تتبع فقط التغذيات **متعددة المصادر**. التغذيات ذات المصدر الواحد لا تُخفى أبدًا — يتم إرجاع اسم المصدر الواحد مباشرة (بدون تكلفة تتبع).
**API — الحقل الإضافي `sources`**
يحتوي رد `/api/v1/ioc/:ioc` على حقل جديد `sources` في كل كائن تغذية. إنه **إضافي ومتوافق مع الإصدارات السابقة**: جميع الحقول الحالية لم تتغير، لذا تستمر العملاء القديمة التي تتجاهله في العمل.
- تغذية متعددة المصادر متتبعة: مصفوفة JSON بأسماء المصادر المساهمة.
- تغذية ذات مصدر واحد: مصفوفة من عنصر واحد باسم ذلك المصدر الواحد.
- التتبع معطل، أو الإسناد غير معروف (مثل صف مخبأ قبل الترقية قبل إعادة بناء AXFR لمرة واحدة): `null` (JSON) / `(disabled)` أو `(unavailable)` (TXT).```json
{
"feed": "mixed.ioc2rpz",
"wildcard": "true",
"type": "fqdn",
"rpz_serial": 1709000000,
"ioc_expiration": 0,
"sources": ["abuse-ch", "internal-list"]
}
خلاصة مصدر واحد: "sources": ["sample_fqdn"]. التتبع معطل/غير معروف: "sources": null.
الطرح (معطل افتراضيًا)
ترقية الملف الثنائي لا تغير شيئًا — لا تتبع، لا إعادة بناء للمنطقة، API دون تغيير — حتى يتم تعيين قيمة track_sources. الخلاصات تُدار عبر الواجهة الرسومية؛ الواجهة/الموقع المجتمعي سيكتبان قيم التكوين الاختيارية هذه ويعرضان sources في تحديث لاحق. تفعيل التتبع لخلاصة مخبأة يؤدي إلى إعادة بناء AXFR لمرة واحدة لملء أقنعة المصادر.
القيود
cache = "true")، حيث أن استعلام API يقرأ جدول ذاكرة التخزين المؤقت IXFR.{key,{"dnsproxykey_1","md5","apXqLsDs90H213eV6LS9ryYp5tY8YTpkttOkRCve7dp1Zeob3SGAbaVU9BShpsW25MmR8mTiX5OY0Qetv977Yw=="}}. {key,{"dnsproxykey_2","sha512","03uuaGl9kqfenjRgIeCv6e29lVvMwviB1+cDX1I0jcVOcTU4jWFwRkfo3ULRMD+NGDfwzYvXkJ94FNEaAW4vzw=="}}. {key,{"dnsmkey_3","sha512","03uuaGl9kqfenjRgIeCv6e29lVvMwviB1+cDX1I0jcVOcTU4jWFwRkfo3ULRMD+NGDfwzYvXkJ94FNEaAW4vzw=="}}.
{whitelist,{"whitelist_1","file:cfg/sample_whitelist.txt",none}}. {whitelist,{"whitelist_2","file:cfg/whitelist2.txt",""}}.
{source,{"sample_fqdn","file:cfg/sample_ioc_fqdn.txt","[:AXFR:]",none}}. {source,{"sample_expire","file:cfg/sample_ioc_expire.txt","[:AXFR:]","^([A-Za-z0-9][A-Za-z0-9\-\._]+)\t([0-9TZ:\-]+)$"}}. {source,{"sample_ip","file:cfg/sample_ioc_ip.txt","[:AXFR:]",none}}.
{rpz,{"localdata.ioc2rpz",7202,3600,2592000,7200,"false","true",[{"local_aaaa","fe80::1"},{"local_a","127.0.0.1"},{"local_a","127.0.0.2"},{"local_a","127.0.0.3"},{"local_a","127.0.0.4"},{"local_cname","www.example.com"},{"local_txt","Text Record www.example.com"},{"local_txt","Text Record 2"}],["dnsproxykey_1", "dnsproxykey_2"],"mixed",30,30,["sample_fqdn"],[],["whitelist_1","whitelist_2"]}}. {rpz,{"dga.ioc2rpz",7202,3600,2592000,7200,"true","true","nodata",["dnsproxykey_1","dnsproxykey_2"],"fqdn",172800,3600,["sample_expire"],[],[]}}. {rpz,{"mixed.ioc2rpz",7202,3600,2592000,7200,"true","true","passthru",["dnsproxykey_1", "dnsproxykey_2"],"mixed",86400,3600,["sample_fqdn","sample_expire"],[],["whitelist_1","whitelist_2"]}}. {rpz,{"ip-block.ioc2rpz",7202,3600,2592000,7200,"false","true","nxdomain",["dnsproxykey_1","dnsproxykey_2"],"ip",172800,0,["sample_ip"],[],[]}}.
</details>
## قيم التهيئة المحددة مسبقًا – include/ioc2rpz.hrl
يحتوي include/ioc2rpz.hrl على معاملات مجمعة مسبقًا.
المعاملات القياسية:
- ``MGMToDNS`` (true/false) – تمكين الإدارة عبر DNS/TCP؛
- ``DBStorage`` (ets) – يحدد تخزين قاعدة البيانات لذاكرة التخزين المؤقت لـ AXFR و IXFR. الإصدار الحالي يدعم ETS فقط؛
- ``SaveETS`` (true/false) – يحدد ما إذا كان يجب حفظ جداول ETS الخاصة بـ AXFR/IXFR على القرص؛
- ``Port`` (قيمة رقمية، 1 – 65535) – يحدد منفذ DNS الذي تعمل عليه الخدمة؛
- ``PortTLS`` (قيمة رقمية، 1 – 65535) – يحدد منفذ DoT الذي تعمل عليه الخدمة؛
- ``PortREST`` (قيمة رقمية، 1 – 65535) – يحدد منفذ HTTPs الذي تعمل عليه الخدمة؛
- ``TTL`` (قيمة رقمية، بالثواني) – TTL الافتراضي لسجلات DNS/قواعد RPZ.
- ``DefConf`` (سلسلة نصية) – ملف التهيئة الافتراضي؛
- ``DefDB`` (سلسلة نصية) – مسار قاعدة البيانات الافتراضي؛
- ``logTS`` – إذا تم تعريفه، تتم إضافة طابع زمني إلى رسائل السجل؛
- ``debug`` – إذا تم تعريفه، تتم طباعة رسائل سجل التصحيح؛
- ``TLSVersion`` ('tlsv1.2-1.3') – إصدارات TLS المدعومة لـ DoT و REST API؛
معاملات التحسين:
- ``DNSPktMax`` (قيمة رقمية، 100 – 65535) – الحد الأقصى لحجم الحزمة. القيم الموصى بها:
- 16384 – الحد الأدنى لحجم نقل المنطقة؛
- 65535 – الحد الأدنى لعدد حزم DNS؛
- ``Compression`` (قيمة رقمية، 0 – 9) – مستوى الضغط (0 – بدون ضغط، 9 – أعلى ضغط). تخزن ذاكرة التخزين المؤقت لـ AXFR والجداول على القرص بيانات مضغوطة؛
- ``ZoneRefTime`` (قيمة رقمية، بالميلي ثانية) – يحدد الفاصل الزمني للتحقق من تحديث المنطقة؛
- ``TCPTimeout`` (قيمة رقمية، بالميلي ثانية) – يحدد مهلة جلسة TCP؛
- ``HotCacheTime`` (قيمة رقمية، بالثواني) – وقت الذاكرة المؤقتة الساخنة لـ IOCs والقواعد والحزم. يتم تخزين المناطق الحية في الذاكرة المؤقتة الساخنة؛
- ``HotCacheTimeIXFR`` (قيمة رقمية، بالثواني) – وقت الذاكرة المؤقتة الساخنة لـ IXFR IOCs في الذاكرة المؤقتة الساخنة. بشكل افتراضي، يتم تخزين مؤشرات IXFR مؤقتًا لمدة دقيقة (حتى إذا تم ضبطها على 0) لأن الرقم التسلسلي الحالي يتم تقريبه دائمًا إلى الدقيقة السابقة؛
- ``RATE_LIMIT_WINDOW`` (قيمة رقمية، بالميلي ثانية، افتراضي 10000) – مدة نافذة الحد من المعدل لكل IP؛
- ``MAX_REQUESTS_PER_WINDOW`` (قيمة رقمية، افتراضي 1) – الحد الأقصى لطلبات DNS لكل IP لكل نافذة حد من المعدل؛
- ``ShellMaxRespSize`` (قيمة رقمية، افتراضي 2 جيجابايت) – الحد الأقصى لحجم الاستجابة لمصادر أوامر الصدفة؛
- ``SourcePullTimeout`` (قيمة رقمية، بالميلي ثانية، افتراضي 300000) – مهلة تنزيل المصادر (5 دقائق)؛
## كيفية تحديث ذاكرة التخزين المؤقت لـ AXFR (الكامل) و IXFR (التزايدي)
- تحتوي ذاكرة التخزين المؤقت لـ AXFR دائمًا على مناطق مبنية مسبقًا بدون سجلات SOA/NS/TSIG. المبني مسبقًا يعني أن جميع السجلات مقسمة إلى حزم وتم تقصير/ضغط التسميات.
- إذا تلقى الخادم طلب AXFR، فإنه يسترجع الحزم من ذاكرة التخزين المؤقت لـ AXFR، ويضيف سجلات SOA/NS و TSIG إذا لزم الأمر.
- يجب اعتبار تحديث مناطق AXFR إجراء تنظيف يجب أن يتم بشكل دوري. فقط للتأكد من عدم وجود فك تزامن بين المصادر والذاكرة المؤقتة.
- بالنسبة للمناطق الكبيرة، يجب جدولة تحديثات AXFR بشكل غير متكرر لتقليل التأثير على أداء الخادم وكمية البيانات المنقولة إلى جميع العملاء.
- يجب إجراء جميع التغييرات، إذا أمكن، عبر تحديثات المناطق التزايدية. في هذه الحالة، سيتم إعادة بناء ذاكرة التخزين المؤقت لـ AXFR فقط إذا تم تحديث المنطقة.
- [TODO] بسبب التحسين، سيتم إعادة بناء الحزمة الأخيرة فقط لـ IOCs الجديدة والحزم ذات الصلة والمتوافقة لـ IOCs المنتهية الصلاحية.
- تحتوي ذاكرة التخزين المؤقت لـ IXFR فقط على IOCs وتواريخ انتهاء الصلاحية. [TODO] ومعرفات الحزم (لجعل إعادة بناء المنطقة سريعة).
- يحتوي سجل RPZ على الرقم التسلسلي الحالي للمنطقة و Serial_IXFR. يعمل Serial_IXFR كحد أدنى للرقم التسلسلي للمنطقة التزايدية المتاح لنقل المنطقة التزايدي.
- يتم مسح ذاكرة التخزين المؤقت لـ IXFR بعد تحديث المنطقة بالكامل (AXFR). Serial_IXFR = Serial. سيحصل العملاء على تحديث المنطقة بالكامل في أي حال، ولهذا السبب من المهم أن يكون نقل منطقة AXFR غير متكرر.
- عندما يتم تحديث ذاكرة التخزين المؤقت لـ IXFR، يجب إعادة بناء ذاكرة التخزين المؤقت لـ AXFR.
- إذا كانت المنطقة لا تدعم تحديثات IXFR -> فلا يتم حفظها في جدول IXFR.
- لا يتم تخزين المناطق الحية مؤقتًا في ذاكرة التخزين المؤقت لـ AXFR و IXFR ولكن يمكن تخزين المصادر (IOCs) مؤقتًا في الذاكرة المؤقتة الساخنة.
## الذاكرة المؤقتة الساخنة
يتم تخزين جميع IOCs والقواعد والحزم بما في ذلك RPZs الحية في الذاكرة المؤقتة الساخنة. تحدد المعاملات المجمعة مسبقًا ``HotCacheTime`` و ``HotCacheTimeIXFR`` وقت التخزين.
## كيفية تجربة ioc2rpz™ (أو خلاصات RPZ عينة ومجانية مستضافة بواسطة ioc2rpz™)
### إخلاء مسؤولية
لا يتحمل المؤلف أي مسؤولية أو التزام قانوني عن أي أخطاء أو سهو في محتوى خلاصات RPZ هذه. يتم توفير الخلاصات على أساس "كما هي" دون أي ضمانات للاكتمال أو الدقة أو الفائدة أو التوقيت المناسب فقط لعرض تقنية ioc2rpz™. قد يتم مقاطعة خدمة توزيع خلاصات RPZ أو إيقافها دون أي إشعار مسبق. المؤلف غير مسؤول عن أي أضرار مباشرة أو غير مباشرة ناتجة عن استخدام هذه الخدمة.
### خلاصات RPZ
يمكنك اختبار تقنية ioc2rpz™ إذا قمت بالتسجيل في [مجتمع ioc2rpz™](https://ioc2rpz.net) مع الخلاصات التالية:
- [notracking](https://github.com/notracking/hosts-blocklists)؛
- [Phishtank](https://www.phishtank.com/).
### تهيئة bind عينة```
options {
#This is just options for RPZs. Add other options as required
recursion yes;
response-policy {
####FQDN only zones
####Mixed zones
zone "phishtank.ioc2rpz" policy nxdomain;
####IP only zones
} qname-wait-recurse no break-dnssec yes;
};
key "ioc2rpz-YOUR-UNIQUE-KEY-NAME"{
algorithm hmac-sha256; secret "ioc2rpz-YOUR-UNIQUE-KEY";
};
zone "phishtank.ioc2rpz" {
type slave;
file "/var/cache/bind/phishtank.ioc2rpz";
masters {94.130.30.123 key "ioc2rpz-YOUR-UNIQUE-KEY-NAME";};
};
| المشكلة | الحل |
|---|
| المنفذ قيد الاستخدام بالفعل | تحقق باستخدام lsof -i :53 / lsof -i :853. تم تعيين {reuseaddr, true} على مآخذ الاستماع لإعادة التشغيل السريع. |
| DoT لا يقبل الاتصالات | تأكد من تكوين {cert, ...}. تحقق من عمال TLS: supervisor:count_children(ioc2rpz_tls_sup_v6). تأكد من أن المنفذ 853 غير محظور بواسطة جدار الحماية. |
| فشل نقل المنطقة (عدم تطابق TSIG) | تحقق من تطابق اسم المفتاح والسر بين العميل والخادم. ابحث عن أحداث CEF 104/105 في السجلات. |
| فشل تنزيل المصادر | تحقق من اتصال الشبكة. ابحث عن Error downloading feed في السجلات. يقوم الخادم بإعادة المحاولة 3 مرات بتأخير 3 ثوانٍ. لمصادر HTTPS، تأكد من صحة شهادة TLS. |
| استخدام ذاكرة عالي | تحقق من أحجام جداول ETS في Erlang shell. يتم تنظيف rate_limits و rpz_hotcache_table بشكل دوري. فكر في تقليل ?HotCacheTime. |
TrackSources — إسناد المصدر لكل خلاصة: auto | true | false. عند وجوده، فإنه يتجاوز الإعداد الافتراضي العالمي للخادم. عند حذفه (نموذج 15 حقلًا)، ترث الخلاصة الإعداد الافتراضي للخادم (#srv TrackSources، off ما لم يتم تكوينه). انظر إسناد مصدر IOC.| الإجراء | قيمة التهيئة | الوصف |
|---|
| NXDOMAIN | "nxdomain" | إرجاع NXDOMAIN (المجال غير موجود) |
| NODATA | "nodata" | إرجاع إجابة فارغة (المجال موجود، لا توجد سجلات) |
| Passthru | "passthru" | السماح بالاستعلام (قاعدة استثناء) |
| Drop | "drop" | إسقاط الاستعلام بصمت |
| TCP-Only | "tcp-only" | إجبار العميل على إعادة المحاولة عبر TCP |
| Block NS | "blockns" | حظر خادم الأسماء الموثوق |
| Redirect (domain) | {"redirect_domain","example.com"} | إعادة التوجيه إلى مجال محدد (اسم مستعار لـ local_cname) |
| Redirect (IP) | {"redirect_ip","127.0.0.1"} | إعادة التوجيه إلى عنوان IP محدد (اسم مستعار لـ local_a/local_aaaa) |
| Local A | {"local_a","127.0.0.1"} | إرجاع عنوان IPv4 مخصص |
| Local AAAA | {"local_aaaa","fe80::1"} | إرجاع عنوان IPv6 مخصص |
| Local CNAME | {"local_cname","www.example.com"} | إرجاع إعادة توجيه CNAME |
| Local TXT | {"local_txt","Text Record"} | إرجاع سجل TXT |
rpzMaster("94.130.30.123", "phishtank.ioc2rpz", {defpol=Policy.NXDOMAIN, tsigname="ioc2rpz-YOUR-UNIQUE-KEY-NAME", tsigalgo="hmac-sha256", tsigsecret="ioc2rpz-YOUR-UNIQUE-KEY"})
### نموذج تكوين Infoblox (ملف استيراد)```
header-responsepolicyzone,fqdn*,zone_format*,rpz_policy,substitute_name,view,zone_type,external_primaries,grid_secondaries,priority
responsepolicyzone,phishtank.ioc2rpz,FORWARD,Nxdomain,,default,responsepolicy,srv_1/94.130.30.123/FALSE/FALSE/TRUE/ioc2rpz-YOUR-UNIQUE-KEY-NAME/ioc2rpz-YOUR-UNIQUE-KEY/HMAC-SHA256,infoblox.localdomain/False/False/False,0
dig @94.130.30.123 -y hmac-sha256:ioc2rpz-YOUR-UNIQUE-KEY-NAME:ioc2rpz-YOUR-UNIQUE-KEY phishtank.ioc2rpz SOA
kdig @94.130.30.123 -y hmac-sha256:ioc2rpz-YOUR-UNIQUE-KEY-NAME:ioc2rpz-YOUR-UNIQUE-KEY phishtank.ioc2rpz SOA +tls
## بعض مصادر استخبارات التهديد المجانية
- [Netlab](http://data.netlab.360.com)
- [قائمة رائعة لاستخبارات التهديد على GitHub](https://github.com/hslatman/awesome-threat-intelligence)
يمكنك العثور على خلاصات IOC أخرى في صفحة الويكي: https://github.com/Homas/ioc2rpz/wiki/IOC-Sources.
## توثيق إضافي
للحصول على توثيق مفصل، راجع دليل `docs/`:
- [docs/architecture.md](https://github.com/homas/ioc2rpz/blob/master/docs/architecture.md) — شجرة الإشراف OTP، مسؤوليات الوحدات، جداول ETS، تدفق البيانات
- [docs/configuration.md](https://github.com/homas/ioc2rpz/blob/master/docs/configuration.md) — مرجع تكوين كامل مع جميع أنواع الصيغ والخيارات
- [docs/deployment.md](https://github.com/homas/ioc2rpz/blob/master/docs/deployment.md) — تعليمات البناء، نشر Docker، الشهادات، المراقبة، استكشاف الأخطاء وإصلاحها
- [docs/protocols.md](https://github.com/homas/ioc2rpz/blob/master/docs/protocols.md) — دعم البروتوكولات (UDP/TCP/DoT/DoH)، REST API، TSIG، تحديد المعدل، DNS NOTIFY
## المراجع
- [RFC-6895 Domain Name System (DNS) IANA Considerations](https://tools.ietf.org/html/rfc6895)
- [RFC-1035 Domain Names - Implementation and Specification](https://tools.ietf.org/html/rfc1035)
- [RFC-1995 Incremental Zone Transfer in DNS](https://tools.ietf.org/html/rfc1995)
- [DNS Response Policy Zones (RPZ)](https://tools.ietf.org/html/draft-ietf-dnsop-dns-rpz-00) + [vixie](https://tools.ietf.org/html/draft-vixie-dns-rpz-02)
- [RFC-2845 Secret Key Transaction Authentication for DNS (TSIG)](https://tools.ietf.org/html/rfc2845)
- [RFC-2104 HMAC: Keyed-Hashing for Message Authentication](https://tools.ietf.org/html/rfc2104)
- [RFC-4635 HMAC SHA TSIG Algorithm Identifiers](https://tools.ietf.org/html/rfc4635)
- [RFC-5966 DNS Transport over TCP - Implementation Requirements](https://tools.ietf.org/html/rfc5966)
- [RFC-1996 A Mechanism for Prompt Notification of Zone Changes (DNS NOTIFY)](https://tools.ietf.org/html/rfc1996)
- [Extension Mechanisms for DNS (EDNS(0))](https://tools.ietf.org/html/rfc6891) + [EDNS Option Codes](https://www.iana.org/assignments/dns-parameters/dns-parameters.xhtml#dns-parameters-11)
- [RFC-7873 Domain Name System (DNS) Cookies](https://tools.ietf.org/html/rfc7873)
- [RFC-7858 Specification for DNS over Transport Layer Security (TLS)](https://tools.ietf.org/html/rfc7858)
- [Cowboy Web Server](https://ninenines.eu)
- [Rebar3](https://www.rebar3.org)
<details>
<summary><strong>مرجع رموز أحداث CEF</strong> (انقر للتوسيع)</summary>
| الرمز | الخطورة | الحدث | الوصف |
|------|----------|-------|-------------|
| 101 | منخفض | حزمة DNS سيئة | تم استلام حزمة DNS مشوهة |
| 102 | منخفض | طلب DNS سيئ | طلب DNS غير قابل للتحليل |
| 103 | متوسط | مرفوض | تم رفض طلب DNS |
| 104 | متوسط | مفتاح TSIG غير موجود | استخدم الطلب مفتاح TSIG غير معروف |
| 105 | متوسط | TSIG MAC سيئ | فشل التحقق من توقيع TSIG |
| 106 | متوسط | وقت TSIG سيئ | الطابع الزمني TSIG خارج النطاق |
| 107 | متوسط | خطأ TSIG آخر | خطأ TSIG غير مصنف |
| 108 | متوسط | موضع TSIG خاطئ | سجل TSIG في موضع غير متوقع |
| 109 | منخفض | استلام استجابة DNS | تم استلام استجابة DNS غير متوقعة |
| 120 | متوسط | RPZ غير موجود | منطقة RPZ المطلوبة غير موجودة |
| 121 | منخفض | RPZ غير جاهزة | منطقة RPZ لا تزال في طور التحميل/التحديث |
| 130 | منخفض | خطأ في نقل RPZ | خطأ أثناء نقل المنطقة (نقل RPZ فقط) |
| 131 | منخفض | إغلاق نقل RPZ | أغلقت الخادم البعيد الاتصال أثناء النقل (نقل RPZ فقط) |
| 140 | عالي | فشل مصادقة REST الأساسية | فشلت مصادقة REST API الأساسية |
| 141 | عالي | فشل تفويض REST | فشل تفويض REST API |
| 145 | عالي | تم رفض طلب REST MGMT | تم رفض طلب إدارة REST بواسطة ACL |
| 146 | عالي | فشل طلب الإدارة | فشل معالجة طلب الإدارة |
| 147 | عالي | طلب غير مدعوم | نقطة نهاية REST API غير معروفة |
| 148 | عالي | المنطقة غير موجودة | تشير REST API إلى منطقة غير موجودة |
| 150 | منخفض | تنفيذ أمر Shell | تم تنفيذ أمر مصدر Shell (معلومات) |
| 151 | عالي | رفض أمر Shell | تم رفض أمر مصدر Shell (أمان) |
| 201 | منخفض | نجاح نقل RPZ | تم إكمال نقل المنطقة |
| 202 | منخفض | استعلام DNS | تمت معالجة استعلام DNS قياسي |
| 221 | منخفض | إشعار DNS | تم إرسال إشعار إلى الخادم الثانوي |
| 222 | متوسط | خطأ في إشعار DNS | فشل إرسال الإشعار |
| 230 | عالي | طلب إدارة | تم تنفيذ عملية إدارية |
| 301 | عالي | رفض طلب إدارة | تم رفض أمر إدارة DNS |
| 429 | عالي | طلبات كثيرة جدًا | تجاوز حد المعدل |
| 501 | عالي | هجوم DDoS محتمل | تم اكتشاف نمط CVE-2004-0789 |
</details>
# هل تريد دعم المشروع؟
يمكنك دعم مشروع ioc2rpz™ ومجتمع ioc2rpz™ (https://ioc2rpz.net) عبر [GitHub Sponsor](https://github.com/sponsors/Homas) (مدفوعات متكررة). لإجراء تبرع لمرة واحدة، يمكنك استخدام [PayPal](https://paypal.me/ioc2rpz) أو Zelle (بريدنا الإلكتروني: zelle [at] ioc2rpz [.] net).
# الداعمون
تحية خاصة إلى **craSH** و **rrbone** اللذان يدعمان مشاريعي على [GitHub Sponsor](https://github.com/sponsors/Homas).
# اتصل بنا
يمكنك الاتصال بنا عبر البريد الإلكتروني: feedback(at)ioc2rpz[.]net أو في [Telegram](https://t.me/ioc2rpz).
# الترخيص
حقوق النشر 2017 - 2025 فاديم بافلوف ioc2rpz[at]gmail[.]com
مرخص بموجب ترخيص Apache، الإصدار 2.0 ("الترخيص")؛ لا يجوز لك استخدام هذا الملف إلا وفقًا للترخيص.
يمكنك الحصول على نسخة من الترخيص على
http://www.apache.org/licenses/LICENSE-2.0
ما لم ينص القانون المعمول به أو الموافقة الكتابية على خلاف ذلك، يتم توزيع البرنامج المرخص بموجب هذا الترخيص على أساس "كما هو"، دون ضمانات أو شروط من أي نوع، سواء كانت صريحة أو ضمنية. راجع الترخيص لمعرفة اللغة المحددة التي تحكم الأذونات والقيود بموجب الترخيص.