Skip to content
KitploitKITPLOIT
ToolsBlog
Einreichen
ToolsBlog
Einreichen

Hacking-, PenTest- und Cybersicherheits-Tools für Ihr Sicherheitsarsenal!

Kitploit ist ein Verzeichnis von Hacking-, Cybersicherheits- und Pentesting-Tools. Entdecken Sie die neuesten Projekt-Updates, um Schwachstellen zu finden, Systeme zu analysieren, Tests zu automatisieren und Ihre Sicherheit zu stärken.

··Feeds·Kontakt·Datenschutz·© 2026 Kitploit

Tool-Verzeichnis

Kategorien

Alle Kategorien anzeigen
Loading categories
ioc2rpz — ioc2rpz is a place where threat intelligence meets DNS. | Kitploit
Tools/GitHubGitHub/homas/ioc2rpz
Defensive ToolsIndicator of Compromise (IOC) ManagementNetwork SecurityMalware AnalysisThreat IntelligenceIntrusion DetectionDNS FuzzingIncident ResponseDNS Analysis
GitHubhomas/ioc2rpz

ioc2rpz

ioc2rpz is a place where threat intelligence meets DNS.

11621vor 1 MonatVon Kitploit geprüft

Beliebteste

Alle anzeigen →

Entdecken Sie die meistgenutzten Tools unserer Community.

Alle Tools erkunden

Durchsuchen Sie unsere Tool-Sammlung

Alle Tools anzeigen →
Teilen
Repository anzeigen

ioc2rpz™ macht Ihre Bedrohungsinformationen umsetzbar

License Erlang/OTP Docker Hub

Inhaltsverzeichnis

  • Kurzzusammenfassung
  • Übersicht
  • ioc2rpz™ ist der Ort, an dem Bedrohungsinformationen auf DNS treffen
  • Architekturübersicht
  • So verwenden Sie ioc2rpz™
  • ioc2rpz™ Weboberfläche
  • Protokollunterstützung
    • Portübersicht
    • UDP (Port 53)
    • TCP (Port 53)
    • DNS über TLS / DoT (Port 853)
    • DNS über HTTPS / DoH (Port 443/8443)
    • Ratenbegrenzung
    • DNS NOTIFY
  • ioc2rpz™ vs. ISC BIND vs. andere DNS
  • Installation
  • Docker-Container
  • Umgebungsvariablen
  • Docker Compose
  • ioc2rpz™ auf AWS
  • Zertifikatseinrichtung
  • Erstellung aus dem Quellcode
  • ioc2rpz™ Verwaltung
    • über DNS
    • über REST
  • Überwachung & Health Checks
  • Fehlerbehebung
  • Konfigurationsdatei
  • Vordefinierte Konfigurationswerte
  • Wie die AXFR- und IXFR-Caches aktualisiert werden
  • Hot Cache
  • Wie man ioc2rpz™ testet oder Beispiel- und kostenlose RPZ-Feeds, gehostet von ioc2rpz
  • Einige kostenlose Threat-Intelligence-Feeds
  • Weitere Dokumentation
  • Referenzen
  • Unterstützung / Unterstützer
  • Kontakt
  • Lizenz

Kurzzusammenfassung

ioc2rpz™: Die DNS-Sicherheitslösung – ioc2rpz™ ist ein leistungsstarker DNS-Server, der Bedrohungsindikatoren in umsetzbare Response Policy Zone (RPZ) Feeds umwandelt. Es automatisiert den Aktualisierungsprozess und stellt sicher, dass Ihr Netzwerk vor den neuesten Bedrohungen, einschließlich bösartiger Domains und IP-Adressen, geschützt ist. Durch die Umwandlung von IOC-Feeds in RPZs fungiert ioc2rpz™ als entscheidende Verbindung zwischen Threat Intelligence und DNS-Sicherheit, kompatibel mit RPZ-unterstützenden DNS-Servern wie ISC BIND oder PowerDNS.

Übersicht

DNS ist die Kontrollebene des Internets. Normalerweise wird DNS für gute Zwecke genutzt, aber:

  • Es kann verwendet werden, um Standorte und Verhalten von Nutzern zu verfolgen;
  • Malware nutzt DNS zur Kommando- und Kontroll-Kommunikation, zum Exfiltrieren von Daten oder zur Umleitung von Datenverkehr;
  • Laut dem Cisco Jahresbericht zur Sicherheit 2016 nutzen 91,3 % der Malware DNS;
  • Werbeunternehmen verwenden oft separate und obskure Domains, um Werbung zu schalten;
  • Kostenlose DNS-Dienste (z. B. 1.1.1.1, 8.8.8.8, 9.9.9.9 usw.) können helfen, einige Bedenken anzugehen, aber Sie können keine eigenen Schutz- oder Werbefilter definieren.

ISC BIND ist de facto der Standard eines Nameservers. Mit der Einführung von Response Policy Zones (RPZ) in ISC BIND 9.8 wurde es eine einfache Aufgabe, Malware auf DNS-Ebene zu überwachen und einzudämmen. RPZ wird im PowerDNS Recursor ab Version 4.0.0 und späteren Versionen unterstützt. Knot DNS unterstützt RPZ ebenfalls teilweise.

Im Vergleich zu traditionellen Netzwerkschutzlösungen kann ein DNS-Server Millionen von Indikatoren ohne Leistungseinbußen verarbeiten, aber es gab keinen automatisierten und effizienten Weg, um Response Policy Zones auf primären DNS-Servern zu verwalten.

Normalerweise werden Indikatoren für Kompromittierung (IOCs) als Klartext, aber in unterschiedlichen Formaten verteilt, und nur wenige Anbieter von IOCs stellen sie über RPZ zur Verfügung.

ioc2rpz™ ist ein eigener DNS-Server, der Indikatoren (z. B. bösartige FQDNs, IPs) aus verschiedenen Quellen automatisch in RPZ-Feeds umwandelt und sie automatisch pflegt/aktualisiert. Die Feeds können an jeden Open-Source- und/oder kommerziellen DNS-Server verteilt werden, der RPZ unterstützt, z. B. ISC BIND, PowerDNS. Sie können Ihren eigenen DNS-Server mit RPZ-Filterung auf einem Router, Desktop, Server und sogar Raspberry Pi betreiben. Der Systemspeicher ist die einzige Einschränkung.

Mit ioc2rpz™ können Sie Ihre eigenen Feeds und Aktionen definieren und unerwünschte Kommunikation verhindern.

ioc2rpz™ ist der Ort, an dem Bedrohungsinformationen auf DNS treffen

ioc2rpz™ wandelt IOC-Feeds in Response Policy Zones (RPZ) um. Sie können Feeds mischen, um eine einzelne RPZ oder mehrere RPZs zu erzeugen. Vertrauenswürdige Domains und IPs können auf eine Whitelist gesetzt werden. ioc2rpz™ unterstützt den Ablauf von Indikatoren und baut Zonen entsprechend neu auf.
Alt ioc2rpz™ Die aktuelle Version unterstützt: lokale Dateien, Dateien/Anfragen über http/https/ftp und Shell-Skripte, um auf andere Ressourcentypen zuzugreifen. Sie können jedes Dateiformat verwenden, wenn Sie einen REGEX schreiben können, um Indikatoren zu extrahieren, und Indikatoren durch Zeilenumbrüche und/oder Wagenrücklaufzeichen getrennt sind (/n, /r, /r/n).

Architekturübersicht

ioc2rpz ist auf Erlang/OTP mit einem Überwachungsbaum aufgebaut, der Fehlertoleranz und automatische Wiederherstellung gewährleistet. Siehe docs/architecture.md für vollständige Details.``` 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]

root@kitploit:~
Wichtige Module:

| Modul | Verantwortlichkeit |
|--------|---------------|
| `ioc2rpz.erl` | TCP/TLS DNS Worker — akzeptiert, parst, validiert, antwortet |
| `ioc2rpz_udp.erl` | UDP-DNS-Listener — SOA-Abfragen |
| `ioc2rpz_conn.erl` | IOC-Quellenabruf (HTTP/HTTPS/Datei/Shell) |
| `ioc2rpz_db.erl` | ETS-basierter Zonen- und Paket-Cache |
| `ioc2rpz_sup.erl` | Haupt-Supervisor, Konfigurationsladung, Zonenplanung |
| `ioc2rpz_rest.erl` | REST-Management-API (Cowboy) |
| `ioc2rpz_doh.erl` | DNS-over-HTTPS-Handler |

## Verwendung von ioc2rpz™
Sie können ioc2rpz™ mit jedem DNS-Server verwenden, der Response Policy Zones unterstützt, z.B. aktuelle Versionen von ISC BIND, PowerDNS und alle kommerziellen DNS-Server, die auf diesen Produkten basieren (z.B. Infoblox, Blue Cat, Efficient IP). Eine Beispiel-Konfigurationsdatei für BIND (named.conf) wird im Ordner cfg bereitgestellt.
<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™ Weboberfläche
[ioc2rpz.gui](https://github.com/Homas/ioc2rpz.gui) ist eine Management-Weboberfläche, die als separates Projekt entwickelt wird. Sie ist nicht erforderlich, um ioc2rpz™ auszuführen.

## Protokollunterstützung

ioc2rpz™ hört auf mehreren Transportprotokollen. Alle Transporte teilen sich dieselbe Abfrageverarbeitungspipeline: Ratenbegrenzung, TSIG-Validierung, Zonensuche und Antwortgenerierung. Siehe [docs/protocols.md](https://github.com/homas/ioc2rpz/blob/HEAD/docs/protocols.md) für die vollständige Protokolldokumentation.

### Port-Übersicht

| Port | Protokoll | Dienst | Bedingung |
|------|----------|---------|-----------|
| 53 | UDP | DNS-Abfragen (nur SOA) | Immer |
| 53 | TCP | DNS-Abfragen, AXFR/IXFR-Zonentransfers, Management | Immer |
| 853 | TCP+TLS | DoT — wie TCP, aber verschlüsselt | Erfordert `cert`-Konfiguration |
| 443/8443 | TCP+TLS | DoH (`/dns-query`) und REST-API | Erfordert `cert`-Konfiguration |

### UDP (Port 53)

UDP wird für leichte DNS-Abfragen verwendet, hauptsächlich für SOA-Abfragen. Antworten, die 512 Bytes (oder die von EDNS0 angekündigte Puffergröße) überschreiten, setzen das TC-Bit (Truncation) gemäß RFC 1035 §4.2.1, was Clients dazu veranlasst, es über TCP erneut zu versuchen. Management-Befehle werden über UDP nicht unterstützt.```bash
dig @127.0.0.1 zone.ioc2rpz SOA -y hmac-sha256:keyname:base64key

TCP (Port 53)

TCP übernimmt Zone Transfers (AXFR/IXFR), SOA-Abfragen und Verwaltungsbefehle. Ein Pool von 5 vorab gestarteten Accept-Workern bearbeitet eingehende Verbindungen.```bash

AXFR zone transfer

dig @127.0.0.1 zone.ioc2rpz AXFR +tcp -y hmac-sha256:keyname:base64key

IXFR incremental transfer

dig @127.0.0.1 zone.ioc2rpz IXFR=12345 +tcp -y hmac-sha256:keyname:base64key

root@kitploit:~
### DNS über TLS / DoT (Port 853)

ioc2rpz™ unterstützt die RPZ-Verteilung über DoT. Der TLS-Listener startet automatisch auf Port 853, wenn ein `cert`-Eintrag in der Konfiguration vorhanden ist. DoT unterstützt dieselben Operationen wie TCP (AXFR, IXFR, SOA, Verwaltung).

- Unterstützte TLS-Versionen: 1.2 und 1.3 (`?TLSVersion = 'tlsv1.2-1.3'`)
- Wiederverwendung von Verbindungen gemäß RFC 7858 §3.4 unterstützt (mehrere Abfragen pro TLS-Sitzung, 30-Sekunden-Leerlauf-Timeout)
- TLS-PIN wird nicht unterstützt
- DNS-NOTIFY-Nachrichten werden unverschlüsselt gesendet (einfaches UDP)
- Zertifikate aktualisieren sich automatisch, wenn Dateien auf der Festplatte ersetzt werden (bis zu ~2 Minuten Verzögerung aufgrund von Erlang-SSL-Caching)

Informationen zur Zertifikatseinrichtung finden Sie unter [Zertifikatseinrichtung](#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

DNS über HTTPS / DoH (Port 443/8443)

DoH bietet DNS-Auflösung über HTTPS mittels des /dns-query Endpunkts. Unterstützte Methoden:

  • GET mit base64url-kodierter DNS-Nachricht im ?dns= Query-Parameter
  • POST mit Content-Type: application/dns-message Body (max 4096 Bytes; größere Payloads erhalten HTTP 413)

Antworten verwenden Content-Type: application/dns-message. DoH überträgt die vollständige DNS-Nachricht im Wire-Format und wird über denselben Pfad wie Do53/DoT verarbeitet, sodass es dieselbe TSIG-Authentifizierung erbt; Zonenübertragungen (AXFR/IXFR) bleiben TCP-only und werden nicht über DoH bedient.```bash

DoH GET request

curl -H "Accept: application/dns-message"
"https://127.0.0.1:443/dns-query?dns=AAABAAABAAAAAAAAA3d3dwdleGFtcGxlA2NvbQAAAQAB" -k

DoH POST request

curl -X POST -H "Content-Type: application/dns-message"
--data-binary @dns_query.bin "https://127.0.0.1:443/dns-query" -k

root@kitploit:~
### Ratenbegrenzung

DNS-Abfragen werden mithilfe eines intelligenten (hybriden) Schlüssels ratenbegrenzt, sodass legitime Multi-Zonen-Clients nicht bestraft werden, während Missbrauch durch Variation des Abfragenamens blockiert wird:

- **Bereitgestellte Zone + unterstützter QTYPE** (`SOA`/`AXFR`/`IXFR`, Klasse `IN`) und **erkannte Verwaltungsbefehle** (Klasse `CHAOS`/`TXT`) werden pro `{Client_IP, Abfragename, Abfragetyp}` verfolgt – so wird ein Sekundärserver, der mehrere Zonen abfragt/überträgt (z. B. `rpz1`, `rpz2`, `rpz3`) plus Verwaltung von einer IP, pro Zone+Typ unabhängig gezählt.
- **Alles andere** (unbekannte/nicht bereitgestellte Zone, nicht unterstützter Abfragetyp, falsche Klasse oder ein nicht erkannter Verwaltungsname) wird pro `{Client_IP}` aggregiert, sodass ein Angreifer die Begrenzung nicht durch Variation des Abfragenamens umgehen kann.

Wenn das Limit überschritten wird, gibt der Server eine DNS-`REFUSED`-Antwort zurück.

| Parameter | Standard | Makro |
|-----------|----------|-------|
| Fenster | 10 Sekunden | `?RATE_LIMIT_WINDOW` (10000 ms) |
| Maximale Anfragen pro Fenster (granular: bekannte Zone+Typ / Verwaltung) | 1 | `?MAX_REQUESTS_PER_WINDOW` |
| Maximale Anfragen pro Fenster (aggregiert: unbekannte Zone / nicht unterstützter Typ) | 1 | `?MAX_UNKNOWN_REQUESTS_PER_WINDOW` |

Die Ratenbegrenzung gilt für alle DNS-Abfragetransporte (UDP, TCP, TLS, DoH). Das Fenster und der Schwellenwert sind über Makros in `include/ioc2rpz.hrl` konfigurierbar.

### DNS NOTIFY

Nach einer Zonenaktualisierung (AXFR oder IXFR) sendet ioc2rpz™ DNS-NOTIFY-Nachrichten ([RFC 1996](https://tools.ietf.org/html/rfc1996)) über UDP an die in der RPZ-`NotifyList` konfigurierten IP-Adressen. Dies veranlasst sekundäre DNS-Server, die SOA-Seriennummer der Zone zu prüfen und eine Übertragung einzuleiten, falls sich die Seriennummer geändert hat.```erlang
%% NotifyList in RPZ config — last field before whitelists
{rpz, {"zone.ioc2rpz", ..., ["source1"], ["10.0.0.1", "10.0.0.2"], []}}.

ioc2rpz™ vs ISC BIND vs andere DNS:

  • ioc2rpz™ wurde nur für die RPZ-Verteilung entwickelt;
  • ioc2rpz™ unterstützt DoT (DNS over TLS), sodass niemand Ihre RPZs/Indikatoren einfach abhören kann;
  • ioc2rpz™ unterstützt DoH (DNS over HTTPS) für moderne DNS-Clients;
  • ioc2rpz™ unterstützt so viele RPZs, wie Sie benötigen;
  • ioc2rpz™ unterstützt Live-/nicht zwischengespeicherte Zonen. Es erstellt Zonen basierend auf einer eingehenden Anfrage;
  • Indikatoren können aus verschiedenen Quellen und über verschiedene Protokolle (z.B. über REST-API-Aufrufe) abgerufen werden;
  • RPZs werden automatisch aktualisiert;
  • Die IOC-Ablaufzeit wird verwendet, um abgelaufene Indikatoren rechtzeitig zu entfernen;
  • Optimierungen der Leistung und der Zonenübertragungszeit/-größe/-pakete.

Installation

Der einfachste Weg, den Dienst bereitzustellen, ist die Verwendung von Docker-Containern auf dem Docker Hub. Die Anleitung zur Bereitstellung auf Docker finden Sie im ioc2rpz™-Wiki.

Docker container

ioc2rpz™ ist auf dem Docker Hub verfügbar. Suchen Sie einfach nach ioc2rpz™. Voraussetzungen:

  • ioc2rpz™ enthält keine Konfigurationsdatei. Sie müssen /opt/ioc2rpz/cfg in ein Verzeichnis auf einem Hostsystem mit der Konfigurationsdatei (ioc2rpz.conf) einbinden;
  • ioc2rpz™ verwendet die Ports 53/udp (nur SOA-Anfragen), 53/tcp (AXFR, IXFR, SOA, MGMT), 853/tcp (AXFR, IXFR, SOA, MGMT) und 8443/tcp (REST-API, DoH). Die Ports sollten auf einem Hostsystem freigegeben werden;
  • ioc2rpz™ speichert die ETS-Datenbank in Dateien für einen schnelleren Start. Sie können /opt/ioc2rpz/db in ein Verzeichnis auf einem Hostsystem einbinden, um die Datenbank über Neustarts hinweg zu erhalten; Sie können ioc2rpz™ mit dem folgenden Befehl starten:``` sudo docker run -d --name ioc2rpz --log-driver=syslog --restart always --mount type=bind,source=/home/ioc2rpz/cfg,target=/opt/ioc2rpz/cfg --mount type=bind,source=/home/ioc2rpz/db,target=/opt/ioc2rpz/db -p53:53 -p53:53/udp -p853:853 -p8443:8443 pvmdel/ioc2rpz
root@kitploit:~
where die Verzeichnisse /home/ioc2rpz/cfg, /home/ioc2rpz/db auf einem Hostsystem liegen.  
Sie können einen benutzerdefinierten Konfigurationsdateinamen über den Parameter `-e` übergeben. Z.B. `-e CONF=./cfg/ioc2rpz2.conf`

## Umgebungsvariablen

Die folgenden Umgebungsvariablen werden von ioc2rpz™ verwendet, hauptsächlich relevant für Docker-Bereitstellungen. Sie sind in `config/sys.config.src` und `config/vm.args` definiert.

| Variable | Standard | Beschreibung |
|----------|---------|-------------|
| `IPv4` | — | IPv4-Bindeadresse |
| `IPv6` | — | IPv6-Bindeadresse |
| `CONF` | — | Pfad zur Konfigurationsdatei (z.B. `./cfg/ioc2rpz.conf`) |
| `DB` | `/opt/ioc2rpz/db` | Datenbankverzeichnis für ETS-Persistenz |
| `CD` | `/opt/ioc2rpz` | Arbeitsverzeichnis |
| `NODE_NAME` | `ioc2rpz` | Kurzer Erlang-Knotenname |
| `IO2Cookie` | `ioc2rpz` | Erlang-Cookie für verteilte Kommunikation |

Übergib Umgebungsvariablen an Docker mit `-e`:```bash
docker run -d --name ioc2rpz -e CONF=./cfg/custom.conf -e NODE_NAME=mynode ...

Docker Compose

Sie können ioc2rpz™ und ioc2rpz.gui mit Docker Compose bereitstellen. Die kanonische Datei docker-compose.yml finden Sie im Repository ioc2rpz.dc.

Nachfolgend ein Beispiel einer docker-compose.yml, die ioc2rpz mit der Weboberfläche und einem Let's Encrypt Certbot-Seitenwagen zeigt:```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:

root@kitploit:~
Aktualisieren Sie Ihre `ioc2rpz.conf`, um auf den gemounteten Zertifikatspfad zu verweisen:```erlang
{cert, {"ssl/live/ns1.rpz-proxy.com/fullchain.pem", "ssl/live/ns1.rpz-proxy.com/privkey.pem", ""}}.

ioc2rpz™ auf AWS

Sie können ioc2rpz™ und ioc2rpz.gui auf AWS ausführen. Für relativ kleine Bereitstellungen (mehrere hunderttausend Indikatoren) reicht selbst die kostenlose Stufe aus. Das Video unten zeigt, wie Sie ioc2rpz™ und ioc2rpz.gui auf AWS mit ECS einrichten.

Zertifikatseinrichtung

TLS-Zertifikate werden für DoT (Port 853), REST-API (Port 8443) und DoH benötigt. Das gleiche Zertifikat wird für alle TLS-Dienste verwendet. Siehe docs/deployment.md für vollständige Details.

Selbstsigniertes Zertifikat (Entwicklung)```bash

openssl req -x509 -newkey rsa:2048 -keyout cfg/ioc2rpz_dot.key
-out cfg/ioc2rpz_dot.crt -days 365 -nodes -subj "/CN=ioc2rpz"

root@kitploit:~
### Let's Encrypt (Produktion)```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

Automatische Verlängerung```bash

/etc/cron.d/ioc2rpz-cert-renew

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"

root@kitploit:~
Certificates are also reloaded explicitly during a configuration reload (`ioc2rpz-reload-cfg`): when ioc2rpz detects that the certificate files changed, it restarts the TLS listeners with the new certificate immediately, instead of waiting for the ~2 minute Erlang SSL cache. Add an `ioc2rpz-reload-cfg` step to your renewal hook to apply new certificates without downtime.

### Docker Volume Mounting

When running in Docker, mount the certificate directory from the host:```bash
docker run -d --name ioc2rpz \
  --mount type=bind,source=/etc/letsencrypt/live/ns1.rpz-proxy.com,target=/opt/ioc2rpz/ssl,readonly \
  ...

Referenz in ioc2rpz.conf:```erlang {cert, {"ssl/fullchain.pem", "ssl/privkey.pem", ""}}.

root@kitploit:~
Erlang erkennt ersetzte Zertifikatsdateien automatisch innerhalb von etwa 2 Minuten. Zertifikate werden auch bei einem erneuten Laden der Konfiguration (`ioc2rpz-reload-cfg`) explizit neu geladen. Lassen Sie keine Zertifikate ablaufen – erneuern Sie sie vor Ablauf, um einen unterbrechungsfreien Betrieb zu gewährleisten.

## Aus dem Quellcode erstellen

> **Hinweis:** Das Erstellen aus dem Quellcode ist für **Entwicklung und Tests** gedacht. Für die Produktion ist **Docker die empfohlene Bereitstellungsmethode** – siehe [Docker Compose](#docker-compose) und das Repository [ioc2rpz.dc](https://github.com/Homas/ioc2rpz.dc).

### Voraussetzungen

- **Erlang/OTP 24 oder neuer** (`erl -version` zur Überprüfung) und ein passendes [rebar3](https://www.rebar3.org).
- Ein C-Toolkit (zum Erstellen von Abhängigkeiten) und `git`.

### Erstellen & Ausführen```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

Minimale Konfiguration

Standardmäßig liest ioc2rpz™ seine Konfiguration von ./cfg/ioc2rpz.conf, lauscht auf allen Netzwerkschnittstellen und schreibt sein DB-Backup nach ./db. Compile-Time-Standardwerte (Ports, Pfade, Timer) befinden sich in include/ioc2rpz.hrl.

Eine minimale cfg/ioc2rpz.conf mit einem TSIG-Schlüssel, einer Dateiquelle und einer RPZ-Zone:```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"],[],[]}}.

root@kitploit:~
Siehe [docs/configuration.md](https://github.com/homas/ioc2rpz/blob/HEAD/docs/configuration.md) für die maßgebliche Feld-für-Feld-Referenz (source/RPZ tuple layout, SOA timers, key groups, certificates, etc.). Um DoT (port 853), DoH und die HTTPS-REST-API zu aktivieren, fügen Sie einen `{cert,{...}}`-Eintrag hinzu — siehe [Certificate Setup](#certificate-setup).

### Entwicklungsshell (nur für Entwicklung/Tests)

Die folgenden Befehle sind für die lokale Entwicklung und Tests gedacht — nicht für den Produktionseinsatz:```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

In der rebar3 shell können Sie das laufende System direkt ausprobieren, zum Beispiel:```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).

root@kitploit:~
## ioc2rpz™-Verwaltung
### über DNS
ioc2rpz™ unterstützt die Verwaltung über DNS/TCP oder DoT. Es wird empfohlen, DoT oder die REST-API über DNS/TCP zu verwenden. Die aktuelle Version von ioc2rpz™ unterstützt keine separate Verwaltungs-IP/Schnittstelle. In jedem Fall wird dringend empfohlen, einen dedizierten TSIG-Schlüssel (oder Schlüssel) zu erstellen, der nur für die Verwaltung verwendet wird. Sie können die Verwaltung über DNS deaktivieren.  
Unterstützte Aktionen:
- Aktueller Status von ioc2rpz™. Anfrage ``ioc2rpz-status``, Klasse ``CHAOS``, Eintrag ``TXT``. z.B.:```
dig +tcp -y dnsmkey_1:ayVnL+h2QKMszRVohrngagcEuIpN3RkecXKdwSa5WsHD5N4Y5R3NUMGM W8sIGv36gPkAtWtgarqKzN9tmHqEnA== @127.0.0.1 ioc2rpz-status TXT -c CHAOS
  • Konfigurationsdatei neu laden. RR Name ioc2rpz-reload-cfg, RR Klasse CHAOS, RR Typ TXT
  • TSIG-Schlüssel aktualisieren. RR Name ioc2rpz-update-tkeys, RR Klasse CHAOS, RR Typ TXT
  • Vollständige Aktualisierung aller Zonen. RR Name ioc2rpz-update-all-rpz, RR Klasse CHAOS, RR Typ TXT
  • Vollständige Aktualisierung einer Zone. RR Name zone_name, RR Klasse CHAOS, RR Typ TXT. Z.B. vollständige Aktualisierung von dga.ioc2rpz kann aufgerufen werden durch:``` dig +tcp -y dnsmkey_1:ayVnL+h2QKMszRVohrngagcEuIpN3RkecXKdwSa5WsHD5N4Y5R3NUMGM W8sIGv36gPkAtWtgarqKzN9tmHqEnA== @127.0.0.1 dga.ioc2rpz TXT -c CHAOS
root@kitploit:~
- Stoppe ioc2rpz™. RR-Name ``ioc2rpz-terminate``, RR-Klasse ``CHAOS``, RR-Typ ``TXT``
- Fordere eine Beispielzone an. RR-Name ``sample-zone.ioc2rpz``, RR-Klasse ``IN``, RR-Typ ``AXFR``
### über REST
Die REST-API (Port 8443/tcp) ist die bevorzugte Verwaltungsschnittstelle. Aus Sicherheitsgründen muss der gesamte Verwaltungsverkehr verschlüsselt sein und die REST-API wird nicht gestartet, wenn kein SSL-Zertifikat vorhanden ist. Alle Endpunkte akzeptieren sowohl GET- als auch POST-Methoden.

Zur Authentifizierung von Anfragen wird die einfache HTTP-Authentifizierung verwendet. TSIG-Verwaltungsschlüssel dienen der Anfrageauthentifizierung. Der Name des TSIG-Schlüssels wird als HTTP-Benutzername und der TSIG-Schlüssel als Passwort verwendet. Der Zugriff auf die REST-API ist durch die im `srv`-Eintrag definierte ACL eingeschränkt.

Das API-Versionssegment unterstützt sowohl `v1` als auch `v1.0` (z. B. `/api/v1/stats/serv` oder `/api/v1.0/stats/serv`).

Die REST-API unterstützt basierend auf dem `Accept`-Header JSON (Standard) und Plain-Text-Ausgabe:
- `application/json` — JSON-Ausgabe (Standard)
- `text/plain` — Plain-Text-Ausgabe```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

Textantworten verwenden das Format:``` status: ok msg: TSIG keys were updated

root@kitploit:~
#### Pfadparameter

| Parameter | Beschreibung |
|-----------|-------------|
| `:rpz_name` | RPZ-Zonenname (z. B. `dga.ioc2rpz`) |
| `:source_name` | IOC-Quellenname (z. B. `sample_fqdn`) |
| `:ioc` | Indikator zum Nachschlagen (FQDN oder IP, z. B. `baddomain.com`) |

#### Statistik-Endpunkte

`/api/v1/stats/serv` — Serverstatistiken (Knotenname, Gesamtregeln, Speichernutzung)```bash
curl -u "keyname:base64key==" -k https://127.0.0.1:8443/api/v1/stats/serv
root@kitploit:~
{
  "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-Zonenstatistiken```bash curl -u "keyname:base64key==" -k https://127.0.0.1:8443/api/v1/stats/rpz

root@kitploit:~
```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
    }
  ]
}

Der status-Feld (ready, updating, forceAXFR, notready) gibt an, ob die gemeldeten Zähler/Seriennummer aktuell sind; bei updating oder forceAXFR entsprechen sie dem letzten abgeschlossenen Update. Zähler und Seriennummer bleiben über eine Konfigurationsneuladung hinweg erhalten, anstatt auf Null zurückgesetzt zu werden.

/api/v1/stats/source — Quellstatistiken```bash curl -u "keyname:base64key==" -k https://127.0.0.1:8443/api/v1/stats/source

root@kitploit:~
```json
{
  "sources": [
    {"name": "sample_fqdn", "ioc_count": 150}
  ]
}

Management-Endpunkte

/api/v1/mgmt/reload_cfg — Konfigurationsdatei neu laden```bash curl -u "keyname:base64key==" -k https://127.0.0.1:8443/api/v1/mgmt/reload_cfg

root@kitploit:~
Success: `{"status":"ok","msg":"Configuration reloaded"}`
Error (HTTP 520): `{"status":"error","msg":"Configuration reload error"}`

`/api/v1/mgmt/update_tkeys` — TSIG-Schlüssel aus der Konfiguration neu laden```bash
curl -u "keyname:base64key==" -k https://127.0.0.1:8443/api/v1/mgmt/update_tkeys

Erfolg: {"status":"ok","msg":"TSIG keys were updated"} Fehler (HTTP 520): {"status":"error","msg":"TSIG keys update error"}

/api/v1/mgmt/terminate — Sanftes Herunterfahren des Servers```bash curl -u "keyname:base64key==" -k https://127.0.0.1:8443/api/v1/mgmt/terminate

root@kitploit:~
Success: `{"status":"ok","msg":"Terminating"}`

#### Zone Update Endpunkte

`/api/v1/update/all_rpz` — Erzwinge vollständige Aktualisierung aller RPZ-Zonen```bash
curl -u "keyname:base64key==" -k https://127.0.0.1:8443/api/v1/update/all_rpz

Erfolg: {"status":"ok","msg":"All RPZ zones will be updated"}

/api/v1/update/:rpz_name — Erzwinge vollständige Aktualisierung einer bestimmten Zone```bash curl -u "keyname:base64key==" -k https://127.0.0.1:8443/api/v1/update/dga.ioc2rpz

root@kitploit:~
Success: `{"status":"ok","msg":"RPZ dga.ioc2rpz will be updated"}`
Error (HTTP 520): `{"status":"error","msg":"RPZ dga.ioc2rpz not found"}`

#### Cache-Verwaltungs-Endpunkte

`/api/v1/cache/sources/clear/all` — Alle Quellen aus dem Hot-Cache entfernen```bash
curl -u "keyname:base64key==" -k https://127.0.0.1:8443/api/v1/cache/sources/clear/all

Erfolg: {"status":"ok","msg":"All sources were removed from the hotcache"}

/api/v1/cache/sources/clear/:source_name — Entferne eine bestimmte Quelle aus dem Hotcache```bash curl -u "keyname:base64key==" -k https://127.0.0.1:8443/api/v1/cache/sources/clear/sample_fqdn

root@kitploit:~
Success: `{"status":"ok","msg":"sample_fqdn source was removed from the hot cache"}`

`/api/v1/cache/sources/load/all` — Alle Quellen in den Hot-Cache neu laden```bash
curl -u "keyname:base64key==" -k https://127.0.0.1:8443/api/v1/cache/sources/load/all

Feed & IOC-Abfrageendpunkte

/api/v1/feed/:rpz_name — Indikatoren aus einem RPZ-Feed abrufen

Abfrageparameter: ?type=fqdn|ip|both (Standard: both)```bash curl -u "keyname:base64key==" -k "https://127.0.0.1:8443/api/v1/feed/malware.ioc2rpz?type=fqdn"

root@kitploit:~
Erfolg:```json
{
  "status": "ok",
  "rpz": "malware.ioc2rpz",
  "iocs": ["baddomain.com", "evil.example.org"]
}

Fehler (HTTP 520): {"status":"error","msg":"RPZ malware.ioc2rpz not found"}

/api/v1/ioc/:ioc — Überprüfe, ob ein Indikator von einem beliebigen RPZ-Feed blockiert wird

Query parameter: ?tkey=keyname — suche auf Zonen beschränken, die für diesen Schlüssel zugänglich sind (optional)```bash curl -u "keyname:base64key==" -k "https://127.0.0.1:8443/api/v1/ioc/baddomain.com?tkey=dnsproxykey_1"

root@kitploit:~
Erfolg:```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"]
        }
      ]
    }
  ]
}

Error: {"status":"error", "ioc": "nonexistent.com"}

Das additive Feld sources listet die beitragenden Quellennamen pro Feed auf, wenn die Quellenverfolgung aktiviert ist; es ist null, wenn die Verfolgung deaktiviert ist oder die Zuordnung unbekannt ist. Siehe IOC-Quellenattribution für Konfiguration und Semantik.

Nicht unterstützte Endpunkte

Jeder nicht erkannte Pfad gibt HTTP 200 zurück mit:```json {"status":"error","msg":"Unsupported request"}

root@kitploit:~
## Überwachung & Health Checks

### REST API Statistiken```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 Shell-Prüfungen

Wenn Sie sich in einer interaktiven Shell befinden oder an einen laufenden Knoten angeschlossen sind:```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).

root@kitploit:~
### DNS-Integritätsprüfungen```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

Siehe docs/deployment.md für die vollständige Überwachungs- und Log-Referenz.

Fehlerbehebung

Siehe docs/deployment.md für die detaillierte Fehlerbehebung.

Konfigurationsdatei

Die Konfiguration ist eine Erlang-Datei. Jede Konfigurationsoption ist ein Erlang-Term, daher muss die Konfiguration der Erlang-Syntax entsprechen. Der Server validiert Konfigurationseinträge beim Laden/Neuladen: TSIG-Schlüsselcodierung, Existenz der Zertifikatsdatei, Regex-Kompilierung und URL-Syntax. Ungültige Einträge werden protokolliert und übersprungen. Siehe docs/configuration.md für die vollständige Konfigurationsreferenz.

ioc2rpz™ unterstützt die folgenden Konfigurationsparameter:

  • einen einzelnen srv-Eintrag (erforderlich);
  • einen einzelnen cert-Eintrag (optional);
  • null oder mehr key-Einträge (optional);
  • null oder mehr whitelist-Einträge (optional);
  • einen oder mehrere source-Einträge (mindestens eine Quelle ist erforderlich);
  • einen oder mehrere rpz-Einträge (mindestens ein rpz ist erforderlich).

srv-Eintrag

Der srv-Eintrag wird verwendet, um Standardwerte des Servers zu definieren. Er besteht aus:

  • NS-Servername, der im SOA-Eintrag verwendet wird;
  • eine E-Mail-Adresse für den SOA-Eintrag (im SOA-Format);
  • Liste der Verwaltungs-TSIG-Schlüssel (nur Namen). Bitte beachten Sie den Abschnitt Verwaltung für die Details.
  • Liste der ACL-IP-Adressen für die Zugriffskontrolle der REST-API.
  • (optional) TrackSources — der serverweite globale Standard für die Quellenattribution: off | auto | on (Standard off). Angewendet auf jeden Feed, dessen eigenes track_sources nicht gesetzt ist. Siehe IOC-Quellenattribution.

Beispiel für einen srv-Eintrag:``` {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}}.

root@kitploit:~
Das 4-Feld-Formular bleibt gültig und setzt `TrackSources` standardmäßig auf `off`.
### **cert**-Eintrag
Der **cert**-Eintrag wird verwendet, um ein Zertifikat und einen privaten Schlüssel für DNS over TLS, REST API und DoH-Kommunikation zu definieren. Für die Zertifikatserstellung und -verwaltung siehe [Zertifikatseinrichtung](#certificate-setup).

Er besteht aus:
- Pfad zu einer Datei, die ein Zertifikat enthält;
- Pfad zu einer Datei, die einen privaten PEM-codierten Schlüssel enthält;
- Pfad zu einer Datei mit PEM-codierten CA-Zertifikaten.  

Beispiel für einen **cert**-Eintrag:```
{cert,{"cfg/cert.pem", "cfg/key.pem",	"cfg/cacerts.pem"}}.

include-Eintrag

Der include-Eintrag ermöglicht es, die ioc2rpz™-Konfiguration auf mehrere Dateien aufzuteilen.

Beispiel include-Eintrag:``` {include,"cfg/tkeys.include.cfg"}.

root@kitploit:~
### **key** record
TSIG-Schlüssel werden für Authentifizierung und Autorisierung verwendet. Es wird empfohlen, unterschiedliche TSIG-Schlüssel für ioc2rpz™-Verwaltung und Zonentransfers zu verwenden.  
**key**-Eintrag besteht aus:
- TSIG-Schlüsselname;
- Algorithmus. ``md5``, ``sha256`` und ``sha512`` werden unterstützt;
- der Schlüssel;
- (optional) Liste der Schlüsselgruppen, zu denen er gehört.

Beispiel für **key**-Einträge:```
{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"]}}.

Das Dienstprogramm dnssec-keygen kann verwendet werden, um TSIG-Schlüssel zu generieren:```bash

MD5 (512-bit)

dnssec-keygen -a HMAC-MD5 -b 512 -n USER tsig-key

SHA-256 (256-bit)

dnssec-keygen -a HMAC-SHA256 -b 256 -n USER tsig-key

SHA-512 (512-bit)

dnssec-keygen -a HMAC-SHA512 -b 512 -n USER tsig-key

root@kitploit:~
Bitte beachten Sie die Dokumentation von "dnssec-keygen" für Details. Schlüssel können Gruppen zugewiesen werden, um eine gruppenbasierte Autorisierung in der RPZ-Zonen-Zugriffskontrolle zu ermöglichen.

### **key_group** Datensatz
Schlüsselgruppen bieten gruppenbasierte Autorisierung für Zonentransfers und -verwaltung. Anstatt einzelne Schlüssel in `rpz`- oder `srv`-Datensätzen aufzulisten, können Sie Schlüssel benannten Gruppen zuweisen und die Gruppe referenzieren.

Es gibt zwei Möglichkeiten, Schlüssel Gruppen zuzuweisen:
1. Inline über das optionale 4. Feld des `key`-Datensatzes: `{key, {Name, Alg, Secret, [Groups]}}`
2. Explizit über einen `key_group`-Datensatz (unten gezeigt)```erlang
{key_group, {GroupName, [KeyName1, KeyName2, ...]}}.
FeldTypBeschreibung
GroupNamestringName der Gruppe (z.B. "customers")
Keyslist of stringsListe der TSIG-Schlüsselnamen, die zu dieser Gruppe gehören

Beispiel key_group Einträge:```erlang {key_group, {"customers", ["dnsproxykey_1", "dnsproxykey_2"]}}. {key_group, {"public", ["dnsproxykey_3"]}}.

root@kitploit:~
Gruppen werden in `rpz`- und `srv`-Datensätzen unter Verwendung des Tupels `{groups, ["group1", "group2"]}` in der Schlüsselliste referenziert:```erlang
{rpz, {"zone.ioc2rpz", 7202, 3600, 2592000, 7200, "true", "true", "nxdomain",
       ["dnsproxykey_1", {groups, ["customers", "public"]}],
       "fqdn", 86400, 3600, ["source1"], [], []}}.

whitelist-Eintrag

Whitelists werden verwendet, um mögliche Fehler zu verhindern und vertrauenswürdige Domänen und IP-Adressen zu sperren. Die whitelisted IOCs werden aus den Response-Policy-Zonen entfernt. ioc2rpz™ prüft nur auf exakte Übereinstimmung, sodass ein Netzwerk weder aufgeteilt noch verworfen wird, wenn eine whitelisted IP-Adresse in einem blockierten Subnetz enthalten ist und umgekehrt. Eine Whitelist ist eine Textdatei oder ein Feed von Textdaten. Indikatoren sollten durch Zeilenumbruchzeichen (/n, /r oder beide /n/r) getrennt sein. Whitelists müssen gültige FQDNs und/oder IP-Adressen enthalten. ioc2rpz™ unterstützt eine unbegrenzte Anzahl von Indikatoren.
Ein whitelists-Eintrag besteht aus:

  • Name der Whitelist;
  • Pfad der Whitelist. URLs (http/https/ftp) und lokale Dateien werden unterstützt. Das Präfix "file:" wird für lokale Dateien verwendet;
  • REGEX, die zum Extrahieren der Indikatoren verwendet wird. Ein regulärer Ausdruck muss in doppelte Anführungszeichen gesetzt werden. Wenn Sie eine leere REGEX ("") angeben, wird eine Standard-REGEX verwendet ("^([A-Za-z0-9][A-Za-z0-9\-\._]+)[^A-Za-z0-9\-\._]*.*$"). none wird verwendet, wenn keine REGEX erforderlich ist (die Quelle liefert bereits Daten im erforderlichen Format).

Beispiel für einen whitelist-Eintrag:``` {whitelist,{"whitelist_1","file:cfg/whitelist1.txt",none}}.

root@kitploit:~
### **source** record
Eine Quelle ist ein Feed mit bösartigen Indikatoren. FQDNs, IPv4- und IPv6-Adressen werden unterstützt. Eine Quelle ist eine Textdatei oder ein Feed mit Textdaten. Indikatoren sollten durch Zeilenumbruch-/Wagenrücklaufzeichen (/n, /r oder beide /r/n) getrennt sein. ioc2rpz™ unterstützt eine unbegrenzte Anzahl von Indikatoren.  
Ein **source**-Eintrag besteht aus:
- Quellenname;
- Quellenpfad für den vollständigen Quellentransfer (AXFR). URLs (http/https/ftp), lokale Dateien und Skripte werden unterstützt. Das Präfix **file:** wird für lokale Dateien verwendet. Das Präfix **shell:** wird verwendet, um ein lokales Skript/Kommando auf einem Host/Container auszuführen, das Indikatoren und optional ein Ablaufdatum an STDOUT zurückgeben soll;
- Quellenpfad für den inkrementellen Quellentransfer (IXFR). AXFR-, IXFR-Pfade unterstützen Schlüsselwörter zur Verkürzung von URLs und zur Bereitstellung von Zeitzonen-Aktualisierungszeitstempeln:
  - **[:AXFR:]** – vollständiger AXFR-Pfad. Kann nur in IXFR-Pfaden verwendet werden;
  - **[:FTimestamp:]** – Zeitstempel der letzten Aktualisierung der Quelle (z. B. 1507946281)
  - **[:ToTimestamp:]** – aktueller Zeitstempel;
- REGEX, mit dem Indikatoren und ihre Ablaufzeit extrahiert werden. Der erste Treffer ist ein Indikator, der zweite Treffer ist eine Ablaufzeit. Die Ablaufzeit ist ein optionaler Parameter. Ein regulärer Ausdruck muss in doppelte Anführungszeichen eingeschlossen werden. Wenn Sie eine leere REGEX (`""`) angeben, wird eine Standard-REGEX verwendet (`"^([A-Za-z0-9][A-Za-z0-9\-\._]+)[^A-Za-z0-9\-\._]*.*$"`). `none` wird verwendet, wenn keine REGEX erforderlich ist (die Quelle liefert bereits Daten im erforderlichen Format).
Optionale Parameter (alle oder keines müssen verwendet werden):
- Benutzer-ID (intern verwendet).
- Maximale Anzahl von IoCs.
- Vollständige Quellenaktualisierung, Hot-Cache-Zeit (in Sekunden).
- Inkrementelle Quellenaktualisierung, Hot-Cache-Zeit (in Sekunden).

HTTPS-Quellendownloads überprüfen das TLS-Zertifikat des entfernten Servers. Quellen mit ungültigen oder selbstsignierten Zertifikaten können nicht heruntergeladen werden. Verwenden Sie für selbstsignierte Zertifikate eine `shell:`-Quelle mit `curl --insecure`.

**Einschränkungen bei lokalen Dateien:** `file:`-Pfade, die `..` (Elternverzeichnis-Durchlauf) enthalten, werden aus Sicherheitsgründen abgelehnt; verwenden Sie einen Pfad ohne `..` (innerhalb des Arbeits-/Datenverzeichnisses).

**Einschränkungen bei Shell-Befehlen:** Das ausführbare Programm jedes Pipeline-Segments muss ein absoluter Pfad (z. B. `/usr/bin/curl`) oder ein Bare-Name-Safe-Text-Dienstprogramm (`sort`, `uniq`, `grep`, `sed`, `awk`, `gawk` usw.) sein; destruktive Befehle und Shells (`rm`, `bash`, `sh` usw.) werden blockiert, und Befehlssubstitution (`$(...)`, Backticks) sowie Ausgabeumleitung (`>`, `>>`) werden abgelehnt. Abgelehnte Befehle werden nicht ausgeführt und über CEF-Ereignis 151 protokolliert (ausgeführte Befehle über 150). Siehe [docs/configuration.md](https://github.com/homas/ioc2rpz/blob/HEAD/docs/configuration.md#shell-command-restrictions) für den vollständigen Regelsatz.

Wenn eine Quelle weniger als 50 % ihrer vorherigen Indikatoranzahl zurückgibt, wird die Aktualisierung abgelehnt und die vorherigen Daten bleiben erhalten. Dies verhindert, dass degradierte Feeds die RPZ-Abdeckung reduzieren. Konfigurierbar über das Makro `?SOURCE_MIN_IOC_RATIO`.

Beispiel für einen **source**-Eintrag:```
%% 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}}.

Quelle shell: wird verwendet, um die Konnektivitätsoptionen von ioc2rpz™ zu erweitern, die von Haus aus etwas eingeschränkt sind. Der ioc2rpz™-Container enthält dig, grep, awk und python. Z. B. können Sie verschiedene RPZ-Feeds mischen oder Daten aus einer Datenbank abrufen.

Einschränkungen für Shell-Befehle: Alle ausführbaren Dateien müssen absolute Pfade verwenden (z. B. /usr/bin/curl nicht curl). Destruktive Befehle (rm, bash, sh, usw.) sind blockiert. Befehlssubstitution ($(...), Backticks) und Ausgabeumleitung (>, >>) werden abgelehnt. Siehe docs/configuration.md für vollständige Details.

Lokale Dateisicherheit: Dateipfade, die .. (Elternverzeichnis-Traversal) enthalten, werden aus Sicherheitsgründen abgelehnt.

rpz-Eintrag

Der Begriff RPZ definiert eine Response Policy Zone.
Der rpz-Eintrag besteht aus:

  • rpz-Name;
  • SOA-Aktualisierungszeit in Sekunden;
  • SOA-Wiederholungszeit für Updates in Sekunden;
  • SOA-Ablaufzeit in Sekunden;
  • SOA-NXDomain-TTL in Sekunden;
  • Cache. Mögliche Werte: true oder false. true definiert, dass der RPZ zwischengespeichert werden soll, false - nicht zwischengespeichert, Live-Zonenquellen werden heruntergeladen und ein RPZ per AXFR-Anfrage generiert. „Live“-Zonen unterstützen keinen inkrementellen Zonentransfer. Wenn der RPZ-Feed ohnehin nicht zwischengespeichert wird, wird er vorübergehend in einem Hot-Cache gespeichert. Falls eine Anfrage von einem Client ausfällt, können wir beim nächsten Mal antworten. Die AXFR-Zeit wird verwendet, um die Cache-Lebensdauer zu bestimmen;
  • Wildcards. Mögliche Werte: true oder false. Definiert, ob Wildcard-Regeln generiert werden sollen;
  • Aktion. Siehe die RPZ-Aktionen-Tabelle unten;
  • Liste der TSIG-Schlüssel und Schlüsselgruppen;
  • Typ der im RPZ verwendeten IOCs: mixed, fqdn, ip. Wird zur Optimierung verwendet.
  • Vollständige Zonenaktualisierungszeit in Sekunden (AXFR-Zeit). Vollständige Zonenaktualisierung und Neuerstellung, wenn der MD5 für IOCs unterschiedlich ist;
  • Inkrementelle Zonenaktualisierungszeit (IXFR-Zeit). Quellen sollten inkrementelle Updates unterstützen. „0“ bedeutet keine inkrementellen Zonenaktualisierungen;

RPZ-Aktionen

Mehrere lokale Aktionen können in einer Liste kombiniert werden: [{"local_a","127.0.0.1"},{"local_aaaa","fe80::1"},{"local_txt","Blocked"}]

Beispiel für einen rpz-Eintrag:``` {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}}.

root@kitploit:~
### IOC-Quellenattribution
Ein RPZ-Feed wird durch das Zusammenführen von Indikatoren aus mehreren Quellen erstellt. Die Quellenattribution ermöglicht es der IOC-Lookup-API zu melden, **welche Quelle(n) innerhalb eines Feeds** zu einem Indikator beigetragen haben – nützlich für das Triage eines gemeldeten Fehlalarms. Die Nachverfolgung ist **standardmäßig deaktiviert** und wird pro Feed mit einer optionalen serverweiten Standardeinstellung gesteuert.

**Konfiguration**

- Pro Feed: das optionale abschließende (16.) `TrackSources`-Element des Tupels `{rpz,{...}}` – `auto | true | false`.
- Serverweite Standardeinstellung: das optionale abschließende (5.) `TrackSources`-Element des Tupels `{srv,{...}}` – `off | auto | on` (Standard `off`).

Beide sind optional und abwärtskompatibel: vorhandene Konfigurationsdateien (15-Feld-`rpz`, 4-Feld-`srv`) werden unverändert geladen und verhalten sich wie `off`.

**Auflösungsreihenfolge** – der effektive Zustand für einen Feed wird wie folgt aufgelöst:
1. der explizite `track_sources`-Wert des Feeds, falls gesetzt;
2. andernfalls die serverweite Standardeinstellung;
3. andernfalls der integrierte Standard `off`.

`auto` bedeutet: nur **Multi-Source**-Feeds nachverfolgen. Single-Source-Feeds werden nie maskiert – ihr einziger Quellenname wird direkt zurückgegeben (keine Nachverfolgungskosten).

**API – das additive Feld `sources`**

Die Antwort von `/api/v1/ioc/:ioc` erhält ein neues Feld `sources` in jedem Feed-Objekt. Es ist **additiv und abwärtskompatibel**: alle vorhandenen Felder bleiben unverändert, sodass alte Clients, die es ignorieren, weiterhin funktionieren.

- Nachverfolgter Multi-Source-Feed: ein JSON-Array der beitragenden Quellennamen.
- Single-Source-Feed: ein Array mit einem Element, das den einen Quellennamen enthält.
- Nachverfolgung deaktiviert oder Attribution unbekannt (z. B. eine vor dem Upgrade zwischengespeicherte Zeile vor ihrem einmaligen AXFR-Neuaufbau): `null` (JSON) / `(disabled)` oder `(unavailable)` (TXT).```json
{
  "feed": "mixed.ioc2rpz",
  "wildcard": "true",
  "type": "fqdn",
  "rpz_serial": 1709000000,
  "ioc_expiration": 0,
  "sources": ["abuse-ch", "internal-list"]
}

Single-Source-Feed: "sources": ["sample_fqdn"]. Tracking deaktiviert/unbekannt: "sources": null.

Rollout (standardmäßig deaktiviert)

Das Upgrade der Binärdatei ändert nichts – kein Tracking, keine Zonen-Neuerstellung, unveränderte API – bis ein track_sources-Wert gesetzt ist. Feeds werden über die GUI verwaltet; die GUI/Community-Seite wird diese optionalen Konfigurationswerte schreiben und sources in einem späteren Update anzeigen. Das Aktivieren von Tracking für einen zwischengespeicherten Feed löst eine einmalige AXFR-Neuerstellung aus, um die Quellmasken zu befüllen.

Einschränkungen

  • Attribuierung ist nur für zwischengespeicherte Feeds verfügbar (cache = "true"), da der API-Lookup die IXFR-Cache-Tabelle liest.
  • Masken sind nach einer vollständigen AXFR-Neuerstellung maßgeblich. Bei IXFR-Updates werden Masken für neu hinzugefügte Indikatoren korrekt gesetzt, aber eine Maskenänderung für einen bereits vorhandenen Indikator (eine zweite Quelle beginnt mit der Auflistung eines bestehenden IOCs) kann sich erst bei der nächsten AXFR angleichen.
  • Quellmasken sind positionsabhängig pro Zone (Bit i = i-te Quelle). Das Neuordnen oder Bearbeiten der Quellenliste einer Zone erzwingt eine einmalige AXFR-Neuerstellung (erkannt durch eine Quellsignaturprüfung), sodass Masken neu abgeleitet werden.
  • Feeds mit mehr als 63 Quellen verwenden eine breitere binäre Bitmap-Maske (Standard), sodass die Attribuierung korrekt bleibt.
Beispielkonfigurationsdatei (zum Aufklappen klicken)```erlang {srv,{"ns1.rpz-proxy.com","support.rpz-proxy.com",["dnsmkey_3"],["127.0.0.1","10.42.0.10"]}}. {cert,{"cfg/ioc2rpz_dot.crt", "cfg/ioc2rpz_dot.key", ""}}.

{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"],[],[]}}.

root@kitploit:~
</details>

## Vordefinierte Konfigurationswerte - include/ioc2rpz.hrl
include/ioc2rpz.hrl enthält vorkompilierte Parameter.

Standardparameter:
- ``MGMToDNS`` (true/false) - aktiviert Management über DNS/TCP;
- ``DBStorage`` (ets) - definiert DB-Speicher für AXFR- und IXFR-Caches. Die aktuelle Version unterstützt nur ETS;
- ``SaveETS`` (true/false) - definiert, ob ETS-AXFR/IXFR-Tabellen auf der Festplatte gespeichert werden sollen;
- ``Port`` (numerischer Wert, 1 - 65535) - definiert einen DNS-Port, auf dem der Dienst läuft;
- ``PortTLS`` (numerischer Wert, 1 - 65535) - definiert einen DoT-Port, auf dem der Dienst läuft;
- ``PortREST`` (numerischer Wert, 1 - 65535) - definiert einen HTTPS-Port, auf dem der Dienst läuft;
- ``TTL`` (numerischer Wert, in Sekunden) - Standard-TTL für DNS-Einträge/RPZ-Regeln.
- ``DefConf`` (Zeichenfolge) - Standardkonfigurationsdatei;
- ``DefDB`` (Zeichenfolge) - Standard-Datenbankpfad;
- ``logTS`` - falls definiert, wird ein Zeitstempel in Protokollmeldungen hinzugefügt;
- ``debug`` - falls definiert, werden Debug-Protokollmeldungen ausgegeben;
- ``TLSVersion`` ('tlsv1.2-1.3') - unterstützte TLS-Versionen für DoT und REST API;

Optimierungsparameter:
- ``DNSPktMax`` (numerischer Wert, 100 - 65535) - maximale Paketgröße. Empfohlene Werte:
  - 16384 - minimale Zonentransfergröße;
  - 65535 - minimale Anzahl von DNS-Paketen;
- ``Compression`` (numerischer Wert, 0 - 9) - Komprimierungsstufe (0 - keine Komprimierung, 9 - höchste Komprimierung). AXFR-Cache und Tabellen auf der Festplatte speichern komprimierte Daten;
- ``ZoneRefTime`` (numerischer Wert, in Millisekunden) - definiert das Intervall für die Zonenaktualisierungsprüfung;
- ``TCPTimeout`` (numerischer Wert, in Millisekunden) - definiert das TCP-Sitzungs-Timeout;
- ``HotCacheTime`` (numerischer Wert, in Sekunden) - Hot-Cache-Zeit für IOCs, Regeln, Pakete. Live-Zonen werden in einem Hot-Cache gespeichert;
- ``HotCacheTimeIXFR`` (numerischer Wert, in Sekunden) - Hot-Cache-Zeit für IXFR-IOCs in einem Hot-Cache. Standardmäßig werden IXFR-Indikatoren eine Minute lang zwischengespeichert (auch wenn auf 0 gesetzt), da die aktuelle Seriennummer immer auf die vorherige Minute gerundet wird;
- ``RATE_LIMIT_WINDOW`` (numerischer Wert, in Millisekunden, Standard 10000) - Dauer des Ratenbegrenzungsfensters pro IP;
- ``MAX_REQUESTS_PER_WINDOW`` (numerischer Wert, Standard 1) - maximale DNS-Anfragen pro IP pro Ratenbegrenzungsfenster;
- ``ShellMaxRespSize`` (numerischer Wert, Standard 2 GiB) - maximale Antwortgröße für Shell-Befehlsquellen;
- ``SourcePullTimeout`` (numerischer Wert, in Millisekunden, Standard 300000) - Zeitüberschreitung für Quell-Downloads (5 Minuten);

## Wie die AXFR- (vollständig) und IXFR- (inkrementell) Caches aktualisiert werden
- Der AXFR-Cache enthält immer vorgebaute Zonen ohne SOA/NS/TSIG-Einträge. Vorgebaut bedeutet, dass alle Einträge in Pakete aufgeteilt und Labels verkürzt/gezippt wurden.
- Wenn ein Server eine AXFR-Anfrage erhält, ruft er Pakete aus dem AXFR-Cache ab, fügt SOA/NS-Einträge und ggf. TSIG hinzu.
- Die Aktualisierung von AXFR-Zonen sollte als Bereinigungsprozedur betrachtet werden, die regelmäßig stattfinden sollte. Nur um sicherzustellen, dass keine Desynchronisation zwischen den Quellen und dem Cache besteht.
- Bei großen Zonen sollten AXFR-Aktualisierungen selten geplant werden, um die Auswirkungen auf die Serverleistung und die übertragene Datenmenge an alle Clients zu minimieren.
- Alle Änderungen sollten, wenn möglich, über inkrementelle Zonenaktualisierungen erfolgen. In diesem Fall wird der AXFR-Cache nur neu aufgebaut, wenn eine Zone aktualisiert wurde.
- [TODO] Aufgrund einer Optimierung wird nur das letzte Paket für neue IOCs und entsprechende Pakete für abgelaufene IOCs neu aufgebaut.
- Der IXFR-Cache enthält nur IOCs und Ablaufdaten. [TODO] und Paket-IDs (um einen schnellen Wiederaufbau der Zone zu ermöglichen).
- Ein RPZ-Eintrag enthält die aktuelle Zone Serial und Serial_IXFR. Serial_IXFR dient als minimale inkrementelle Zonenseriennummer, die für einen inkrementellen Zonentransfer verfügbar ist.
- Der IXFR-Cache wird nach einer vollständigen Zonenaktualisierung (AXFR) geleert. Serial_IXFR = Serial. Clients erhalten in jedem Fall eine vollständige Zonenaktualisierung, daher ist es wichtig, AXFR-Zonentransfers selten durchzuführen.
- Wenn der IXFR-Cache aktualisiert wird, muss der AXFR-Cache neu aufgebaut werden.
- Wenn eine Zone keine IXFR-Aktualisierungen unterstützt, wird sie nicht in der IXFR-Tabelle gespeichert.
- Live-Zonen werden nicht im AXFR-, IXFR-Cache zwischengespeichert, aber die Quellen (IOCs) können im Hot-Cache zwischengespeichert werden.

## Hot-Cache
Alle IOCs, Regeln, Pakete einschließlich Live-RPZs werden im Hot-Cache gespeichert. Die vorkompilierten Parameter ``HotCacheTime``, ``HotCacheTimeIXFR`` definieren die Speicherzeit.

## Wie man ioc2rpz™ ausprobiert (oder Beispiel- und kostenlose RPZ-Feeds, die von ioc2rpz™ gehostet werden)
### Haftungsausschluss
Der Autor übernimmt keine Verantwortung oder Haftung für Fehler oder Auslassungen im Inhalt dieser RPZ-Feeds. Die Feeds werden "wie besehen" ohne Garantie auf Vollständigkeit, Richtigkeit, Nützlichkeit oder Aktualität bereitgestellt, um nur die ioc2rpz™-Technologie zu demonstrieren. Der Dienst zur Verteilung der RPZ-Feeds kann ohne Vorankündigung unterbrochen oder eingestellt werden. Der Autor haftet nicht für direkte oder indirekte Schäden, die durch die Nutzung dieses Dienstes entstehen.

### RPZ-Feeds
Sie können die ioc2rpz™-Technologie testen, wenn Sie sich in der [ioc2rpz™-Community](https://ioc2rpz.net) mit den folgenden Feeds registrieren:
- [notracking](https://github.com/notracking/hosts-blocklists);
- [Phishtank](https://www.phishtank.com/).

### Beispiel-Bind-Konfiguration```
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";};
};
Tool herunterladen
ProblemLösung
Port bereits belegtÜberprüfen mit lsof -i :53 / lsof -i :853. {reuseaddr, true} ist an den Listening-Sockets für schnelle Neustarts gesetzt.
DoT akzeptiert keine VerbindungenÜberprüfen, ob {cert, ...} konfiguriert ist. TLS-Worker prüfen: supervisor:count_children(ioc2rpz_tls_sup_v6). Prüfen, ob Port 853 nicht durch eine Firewall blockiert wird.
Zonentransfer fehlgeschlagen (TSIG-Konflikt)Überprüfen, ob Schlüsselname und Secret zwischen Client und Server übereinstimmen. Suchen Sie nach CEF 104/105-Ereignissen in den Logs.
Fehler beim Quell-DownloadNetzwerkkonnektivität prüfen. Suchen Sie nach Error downloading feed in den Logs. Der Server wiederholt 3 Mal mit 3s Verzögerung. Für HTTPS-Quellen stellen Sie sicher, dass ein gültiges TLS-Zertifikat vorhanden ist.
Hohe SpeichernutzungETS-Tabellengrößen in der Erlang-Shell prüfen. rate_limits und rpz_hotcache_table werden regelmäßig bereinigt. Erwägen Sie, ?HotCacheTime zu reduzieren.
  • Liste der Quellen;
  • Liste der DNS-Server (IP-Adressen), die bei RPZ-Updates benachrichtigt werden sollen (siehe DNS NOTIFY);
  • Liste der Whitelists.
  • (optional) TrackSources — Quellenattribution pro Feed: auto | true | false. Wenn vorhanden, überschreibt es den globalen Standard des Servers. Wenn ausgelassen (15-Feld-Form), erbt der Feed den Serverstandard (#srv TrackSources, off sofern nicht konfiguriert). Siehe IOC-Quellenattribution.
  • AktionKonfigurationswertBeschreibung
    NXDOMAIN"nxdomain"NXDOMAIN zurückgeben (Domain existiert nicht)
    NODATA"nodata"Leere Antwort zurückgeben (Domain existiert, keine Einträge)
    Passthru"passthru"Anfrage erlauben (Ausnahmeregel)
    Drop"drop"Anfrage stillschweigend verwerfen
    TCP-Only"tcp-only"Client zwingen, über TCP zu wiederholen
    Block NS"blockns"Autoritativen Nameserver blockieren
    Redirect (domain){"redirect_domain","example.com"}Zu einer bestimmten Domain umleiten (Alias für local_cname)
    Redirect (IP){"redirect_ip","127.0.0.1"}Zu einer bestimmten IP umleiten (Alias für local_a/local_aaaa)
    Local A{"local_a","127.0.0.1"}Eine benutzerdefinierte IPv4-Adresse zurückgeben
    Local AAAA{"local_aaaa","fe80::1"}Eine benutzerdefinierte IPv6-Adresse zurückgeben
    Local CNAME{"local_cname","www.example.com"}Eine CNAME-Umleitung zurückgeben
    Local TXT{"local_txt","Text Record"}Einen TXT-Eintrag zurückgeben

    Beispiel einer PowerDNS-Konfiguration```

    rpzMaster("94.130.30.123", "phishtank.ioc2rpz", {defpol=Policy.NXDOMAIN, tsigname="ioc2rpz-YOUR-UNIQUE-KEY-NAME", tsigalgo="hmac-sha256", tsigsecret="ioc2rpz-YOUR-UNIQUE-KEY"})

    root@kitploit:~
    ### Beispiel-Infoblox-Konfiguration (Importdatei)```
    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
    

    Beispiel-DIG (um SOA zu erhalten)```

    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

    root@kitploit:~
    ## Einige kostenlose Threat-Intelligence-Feeds
    - [Netlab](http://data.netlab.360.com)
    - [awesome-threat-intelligence-Liste auf GitHub](https://github.com/hslatman/awesome-threat-intelligence)
    
    Weitere IOC-Feeds findest du auf der Wiki-Seite: https://github.com/Homas/ioc2rpz/wiki/IOC-Sources.
    
    ## Weiterführende Dokumentation
    
    Eine ausführliche Dokumentation findest du im Verzeichnis `docs/`:
    
    - [docs/architecture.md](https://github.com/homas/ioc2rpz/blob/HEAD/docs/architecture.md) — OTP-Supervision-Baum, Modulverantwortlichkeiten, ETS-Tabellen, Datenfluss
    - [docs/configuration.md](https://github.com/homas/ioc2rpz/blob/HEAD/docs/configuration.md) — Vollständige Konfigurationsreferenz mit allen Tuple-Typen und Optionen
    - [docs/deployment.md](https://github.com/homas/ioc2rpz/blob/HEAD/docs/deployment.md) — Build-Anleitungen, Docker-Bereitstellung, Zertifikate, Überwachung, Fehlerbehebung
    - [docs/protocols.md](https://github.com/homas/ioc2rpz/blob/HEAD/docs/protocols.md) — Protokollunterstützung (UDP/TCP/DoT/DoH), REST-API, TSIG, Ratenbegrenzung, DNS NOTIFY
    
    ## Referenzen
    - [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>Referenz der CEF-Ereigniscodes</strong> (zum Erweitern anklicken)</summary>
    
    | Code | Schweregrad | Ereignis | Beschreibung |
    |------|----------|-------|-------------|
    | 101 | Niedrig | Fehlerhaftes DNS-Paket | Fehlerhaftes DNS-Paket empfangen |
    | 102 | Niedrig | Fehlerhafte DNS-Anfrage | Nicht analysierbare DNS-Anfrage |
    | 103 | Mittel | Verweigert | DNS-Anfrage verweigert |
    | 104 | Mittel | TSIG-Schlüssel nicht gefunden | Anfrage verwendete unbekannten TSIG-Schlüssel |
    | 105 | Mittel | TSIG ungültiger MAC | TSIG-Signaturprüfung fehlgeschlagen |
    | 106 | Mittel | TSIG Zeitstempel ungültig | TSIG-Zeitstempel außerhalb des Bereichs |
    | 107 | Mittel | Anderer TSIG-Fehler | Nicht klassifizierter TSIG-Fehler |
    | 108 | Mittel | Falsche TSIG-Position | TSIG-Eintrag an unerwarteter Position |
    | 109 | Niedrig | DNS-Antwort empfangen | Unerwartete DNS-Antwort empfangen |
    | 120 | Mittel | RPZ nicht gefunden | Angeforderte RPZ-Zone existiert nicht |
    | 121 | Niedrig | RPZ nicht bereit | RPZ-Zone wird noch geladen/aktualisiert |
    | 130 | Niedrig | RPZ-Übertragungsfehler | Fehler während der Zonenübertragung (nur RPZ-Übertragung) |
    | 131 | Niedrig | RPZ-Übertragung geschlossen | Remote-Verbindung während der Übertragung geschlossen (nur RPZ-Übertragung) |
    | 140 | Hoch | REST-Basisauthentifizierung fehlgeschlagen | REST-API-Basisauthentifizierung fehlgeschlagen |
    | 141 | Hoch | REST-Authentifizierung fehlgeschlagen | REST-API-Autorisierung fehlgeschlagen |
    | 145 | Hoch | REST-MGMT verweigert | REST-Management-Anfrage durch ACL verweigert |
    | 146 | Hoch | MGMT-Anfrage fehlgeschlagen | Verarbeitung der Management-Anfrage fehlgeschlagen |
    | 147 | Hoch | Nicht unterstützte Anfrage | Unbekannter REST-API-Endpunkt |
    | 148 | Hoch | Zone nicht gefunden | REST-API referenzierte nicht existierende Zone |
    | 150 | Niedrig | Shell-Befehl ausgeführt | Shell-Quellbefehl ausgeführt (Info) |
    | 151 | Hoch | Shell-Befehl abgelehnt | Shell-Quellbefehl abgelehnt (Sicherheit) |
    | 201 | Niedrig | RPZ-Übertragung erfolgreich | Zonenübertragung abgeschlossen |
    | 202 | Niedrig | DNS-Abfrage | Standard-DNS-Abfrage verarbeitet |
    | 221 | Niedrig | DNS-Benachrichtigung | Benachrichtigung an sekundären Server gesendet |
    | 222 | Mittel | DNS-Benachrichtigungsfehler | Benachrichtigung konnte nicht gesendet werden |
    | 230 | Hoch | MGMT-Anfrage | Management-Operation ausgeführt |
    | 301 | Hoch | MGMT-Anfrage verweigert | DNS-Management-Befehl verweigert |
    | 429 | Hoch | Zu viele Anfragen | Ratenlimit überschritten |
    | 501 | Hoch | Möglicher DDoS | CVE-2004-0789-Muster erkannt |
    
    </details>
    
    # Möchtest du das Projekt unterstützen?
    Du kannst das ioc2rpz™-Projekt und die ioc2rpz™-Community (https://ioc2rpz.net) über [GitHub Sponsor](https://github.com/sponsors/Homas) (wiederkehrende Zahlungen) unterstützen. Für eine einmalige Spende kannst du [PayPal](https://paypal.me/ioc2rpz) oder Zelle verwenden (unsere E-Mail: zelle [at] ioc2rpz [.] net).
    
    # Unterstützer
    Ein Dank an **craSH** und **rrbone**, die meine Projekte auf [GitHub Sponsor](https://github.com/sponsors/Homas) unterstützen.
    
    # Kontakt
    Du kannst uns per E-Mail kontaktieren: feedback(at)ioc2rpz[.]net oder auf [Telegram](https://t.me/ioc2rpz).
    
    # Lizenz
    Copyright 2017 - 2025 Vadim Pavlov ioc2rpz[at]gmail[.]com
    
    Lizenziert unter der Apache License, Version 2.0 (der „Lizenz“); Sie dürfen diese Datei nur in Übereinstimmung mit der Lizenz verwenden.
    Eine Kopie der Lizenz erhalten Sie unter  
    
        http://www.apache.org/licenses/LICENSE-2.0  
    
    Sofern nicht durch geltendes Recht vorgeschrieben oder schriftlich vereinbart, wird die unter der Lizenz verteilte Software ohne Mängelgewähr oder Garantie irgendeiner Art, weder ausdrücklich noch stillschweigend, bereitgestellt. Siehe die Lizenz für die spezifischen Berechtigungen und Einschränkungen.