Zum Hauptinhalt springen

Native Module (für Entwickler)

Für den allgemeinen Gebrauch ist kein Modul erforderlich. Dieses Handbuch richtet sich an Entwickler und Administratoren, die die Funktionalität des Windows- oder Linux-Dienstes mit nativen Bibliotheken erweitern möchten. Das Modul läuft innerhalb eines Dienstes mit Dienstprivilegien. Installieren Sie nur vertrauenswürdigen Code und behalten Sie die Moduldateien, Abhängigkeiten und Konfigurationsdateien im Eigentum der Administratoren.

Modul laden​

Der Dienst liest die Datei *.conf aus dem Verzeichnis modules.d neben der Konfigurationsdatei. Die Standardspeicherorte sind:

BetriebssystemModul-EinstellungsortBibliotheksformat
Linux/etc/mudfish-dns/modules.d/.so
Windows%ProgramData%\Mudfish DNS\modules.d\.dll

Schreiben Sie in jede Datei den absoluten Pfad zur Bibliothek, einen pro Zeile. Der Inhalt von /etc/mudfish-dns/modules.d/10-policy.conf lautet beispielsweise:

/usr/lib/mudfish-dns/modules/policy.so

Liest in der Reihenfolge der Dateinamen und innerhalb jeder Datei in der Reihenfolge der Zeilen. Leerzeilen und Zeilen, die mit # beginnen, werden ignoriert. Umgeben Sie Pfade nicht mit Anführungszeichen, Umgebungsvariablen oder Kommentaren am Zeilenende. Diese Ausdrücke werden nicht interpretiert. Schreiben Sie in Windows den gesamten absoluten Pfad, einschließlich des Pfads mit Leerzeichen, in die Datei.

Starten Sie den Dienst neu, nachdem Sie Module hinzugefügt, geändert oder entfernt haben. Linux verwendet den folgenden Befehl:

sudo systemctl restart mudfish-dns.service

Starten Sie für Windows den Dienst Mudfish DNS in der Dienstverwaltung neu. DNS starten , DNS stoppen und Einstellungen anwenden in der App laden das Modul nicht neu. Der Dienst startet nicht, wenn die Einstellungsdatei nicht gelesen werden kann, der Pfad falsch ist oder ein Lade- und Initialisierungsfehler auftritt. Fehlende oder leere Modulverzeichnisse sind zulässig.

Während der Entwicklung können Sie das Argument --module wiederholt angeben, um Bibliotheken in der Reihenfolge der Argumente zu laden. In diesem Fall ersetzt es modules.d Autoload. --config FILE ändert auch den Speicherort des Modulverzeichnisses neben der Konfigurationsdatei. --restore-dns führt die Wiederherstellung durch, ohne Module zu laden.

Hook-Implementierung​

Lesen Sie den mudfish_dns_module.h-Header oder laden Sie mudfish_dns_module.h herunter. Dieser Header definiert die vom Modul verwendeten Strukturen, Hooks, Aktionen und Datenlebensdauerregeln. In diesem Handbuch wird C ABI v2 verwendet. Exportieren Sie mudfish_dns_module_init_v2() nach außen und überprüfen Sie die Größe der übergebenen Struktur mit MUDFISH_DNS_MODULE_ABI_V2, bevor Sie den Hook füllen. Wenn die Initialisierung erfolgreich ist, wird 0 zurückgegeben.

HakenAufrufzeit
on_dns_queryNach dem Akzeptieren der geparsten Abfrage, bevor der Cache abgefragt oder weitergeleitet wird.
on_dns_responseNachdem eine Antwort ausgewählt wurde, bevor sie im Cache gespeichert oder an den Client zurückgegeben wird. Auch zwischengespeicherte Antworten durchlaufen diesen Hook.
on_web_helloNach dem ersten HTTP Host/TLS SNI Test, vor dem Verbinden oder Verarbeiten erster Daten.
on_web_dataNach dem Lesen nachfolgender Client- oder Serverdaten, jedoch vor der Übertragung.

DNS-Betrieb​

Der v2 DNS-Hook gibt bei Erfolg 0 zurück und setzt result->action.

BetriebEffekt
MUDFISH_DNS_CONTINUESetzt die normale Verarbeitung mit dem nächsten Modul fort.
MUDFISH_DNS_ALLOWBeendet die aktuelle Hook-Kette und setzt die normale DNS-Abfrage fort oder gibt die ausgewählte Antwort zurück.
MUDFISH_DNS_BLOCKGibt REFUSED zurück.
MUDFISH_DNS_DROPDNS Verwerfen ohne Senden einer Antwort.
MUDFISH_DNS_ANSWERErzeugt eine Antwort mit den von Ihnen angegebenen Adressen IPv4/IPv6 und TTL.
MUDFISH_DNS_REPLACEEs nutzt die vollständige DNS-Drahtformatantwort, die vom -Modul bereitgestellt wird.

v2 DNS Aktionskonstanten nicht direkt von Hooks zurückgeben. Wenn die Funktion einen anderen Wert als 0 zurückgibt oder das Ergebnis ungültig ist, wird SERVFAIL ausgelöst. ALLOW beendet derzeit nur die Hook-Kette und umgeht keine Domänenregeln, die Akzeptanz von Kommunikationsmethoden oder die Zertifikatsprüfung. Abfrageergebnisse außer DROP durchlaufen ebenfalls einen Antwort-Hook.

Der Webhook gibt MUDFISH_DNS_CONTINUE oder MUDFISH_DNS_REJECT direkt zurück. Wenn eine Webanfrage abgelehnt wird, wird die Verbindung beendet. Für Webhooks muss der Webschutz aktiviert sein und entschlüsselte HTTPS-Inhalte sind nicht verfügbar.

Puffer, Threads, Cache​

Eingabeereignisse und Puffer sind schreibgeschützt und nur während der Rückrufausführung gültig. Die Fallback-Antwort muss Speicher verwenden, der dem Modul gehört, und bis zum nächsten Rückruf oder Exit dieses Moduls gültig bleiben. Geben Sie keine Zeiger zurück, die aus dem Stapelspeicher oder Ereignissen entlehnt wurden. DNS ID, opcode, Fragen in der alternativen Antwort müssen mit der ursprünglichen Abfrage übereinstimmen. Rückrufe von einer Instanz werden nacheinander ausgeführt, können jedoch von verschiedenen Threads aufgerufen werden. Halten Sie Rückrufe kurz und verbreiten Sie keine Ausnahmen über die ABI-Grenze hinaus.

Die Ergebnisse des Erstellens, Ersetzens, Blockierens und Löschens werden nicht im Host-Cache gespeichert. Durch das Ersetzen einer zwischengespeicherten Antwort wird der ursprüngliche Cache-Eintrag nicht geändert. Der Host löscht das AD-Flag in der Ersatzantwort und führt keine DNSSEC-Überprüfung oder Neusignatur durch. Module, die signierte Daten ändern, müssen ungültige Signaturen selbst verarbeiten.

Beispiele und Überschriften​

Die Seite unten enthält die vollständige Beispielquelle und die erforderlichen Kopfzeilen. Es ist nicht erforderlich, den Mudfish DNS-Quellbaum separat herunterzuladen.

DateiInhalt
policy.c – DNS RichtlinienbeispielDNS Anfragen zulassen, blockieren, verwerfen, Antwort generieren IP, Antwortadresse ändern und TTL. Enthält außerdem Linux-Build- und Testbefehle.
mudfish_dns_module.h – ModulkopfABI Deklarationen, Hook-Signaturen, Aktionskonstanten und Pufferbesitzregeln.

Laden Sie vor dem Erstellen policy.c und mudfish_dns_module.h in dasselbe Verzeichnis herunter. Die Build-Befehle im Beispiel erstellen die Bibliotheken Linux und .so.