
ioc2rpz is a place where threat intelligence meets DNS.
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.
DNS ist die Kontrollebene des Internets. Normalerweise wird DNS für gute Zwecke genutzt, aber:

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™ 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.
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).
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]
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 übernimmt Zone Transfers (AXFR/IXFR), SOA-Abfragen und Verwaltungsbefehle. Ein Pool von 5 vorab gestarteten Accept-Workern bearbeitet eingehende Verbindungen.```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 ü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
DoH bietet DNS-Auflösung über HTTPS mittels des /dns-query Endpunkts. Unterstützte Methoden:
?dns= Query-ParameterContent-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
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
### 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"], []}}.
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.
ioc2rpz™ ist auf dem Docker Hub verfügbar. Suchen Sie einfach nach ioc2rpz™. Voraussetzungen:
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 ...
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:
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", ""}}.
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.
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.
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 (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
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"
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", ""}}.
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
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"],[],[]}}.
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).
## 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
ioc2rpz-reload-cfg, RR Klasse CHAOS, RR Typ TXTioc2rpz-update-tkeys, RR Klasse CHAOS, RR Typ TXTioc2rpz-update-all-rpz, RR Klasse CHAOS, RR Typ TXTzone_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- 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
#### 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
{
"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
```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
```json
{
"sources": [
{"name": "sample_fqdn", "ioc_count": 150}
]
}
/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
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
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
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
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
/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"
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"
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.
Jeder nicht erkannte Pfad gibt HTTP 200 zurück mit:```json {"status":"error","msg":"Unsupported request"}
## Ü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
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).
### 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.
Siehe docs/deployment.md für die detaillierte Fehlerbehebung.
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:
Der srv-Eintrag wird verwendet, um Standardwerte des Servers zu definieren. Er besteht aus:
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}}.
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"}}.
Der include-Eintrag ermöglicht es, die ioc2rpz™-Konfiguration auf mehrere Dateien aufzuteilen.
Beispiel include-Eintrag:``` {include,"cfg/tkeys.include.cfg"}.
### **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
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
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, ...]}}.
| Feld | Typ | Beschreibung |
|---|---|---|
| GroupName | string | Name der Gruppe (z.B. "customers") |
| Keys | list of strings | Liste 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"]}}.
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"], [], []}}.
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:
"") 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}}.
### **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.
Der Begriff RPZ definiert eine Response Policy Zone.
Der rpz-Eintrag besteht aus:
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;true oder false. Definiert, ob Wildcard-Regeln generiert werden sollen;mixed, fqdn, ip. Wird zur Optimierung verwendet.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}}.
### 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
cache = "true"), da der API-Lookup die IXFR-Cache-Tabelle liest.{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>
## 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";};
};
| Problem | Lö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-Download | Netzwerkkonnektivitä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 Speichernutzung | ETS-Tabellengrößen in der Erlang-Shell prüfen. rate_limits und rpz_hotcache_table werden regelmäßig bereinigt. Erwägen Sie, ?HotCacheTime zu reduzieren. |
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.| Aktion | Konfigurationswert | Beschreibung |
|---|
| 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 |
rpzMaster("94.130.30.123", "phishtank.ioc2rpz", {defpol=Policy.NXDOMAIN, tsigname="ioc2rpz-YOUR-UNIQUE-KEY-NAME", tsigalgo="hmac-sha256", tsigsecret="ioc2rpz-YOUR-UNIQUE-KEY"})
### 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
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
## 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.