Aller au contenu principal

Modules natifs pour développeurs

Les modules ne sont pas nécessaires pour une utilisation courante. Ce guide s’adresse aux développeurs et administrateurs souhaitant étendre le service Windows ou Linux avec une bibliothèque native. Les modules s’exécutent dans le service avec ses privilèges. Installez uniquement du code de confiance et assurez-vous que les fichiers des modules, leurs dépendances et leur configuration restent la propriété de l’administrateur.

Charger un module​

Le service lit les fichiers *.conf du dossier modules.d situé à côté du fichier de configuration. Les emplacements par défaut sont :

SystèmeConfiguration des modulesFormat de bibliothèque
Linux/etc/mudfish-dns/modules.d/.so
Windows%ProgramData%\Mudfish DNS\modules.d\.dll

Chaque fichier contient un chemin absolu de bibliothèque par ligne. Exemple de contenu de /etc/mudfish-dns/modules.d/10-policy.conf :

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

Les fichiers sont lus dans l’ordre de leur nom et les entrées dans l’ordre des lignes. Les lignes vides et celles commençant par # sont ignorées. N’entourez pas les chemins de guillemets et n’utilisez ni variables d’environnement ni commentaires en fin de ligne : ces expressions ne sont pas interprétées. Sous Windows aussi, indiquez le chemin absolu complet, même s’il contient des espaces.

Après l’ajout, la modification ou la suppression d’un module, redémarrez le service. Sous Linux :

sudo systemctl restart mudfish-dns.service

Sous Windows, redémarrez Mudfish DNS depuis le gestionnaire des services. Les boutons Démarrer le DNS, Arrêter le DNS et Appliquer les paramètres ne rechargent pas les modules. Un fichier de configuration illisible, un chemin incorrect ou une erreur de chargement ou d’initialisation empêche le démarrage du service. Un dossier de modules absent ou vide est accepté.

Pendant le développement, vous pouvez répéter l’argument --module pour charger les bibliothèques dans l’ordre des arguments. Cela remplace le chargement automatique de modules.d. --config FILE modifie aussi l’emplacement du dossier de modules situé à côté du fichier de configuration. --restore-dns effectue la restauration sans charger de modules.

Implémenter les hooks​

Consultez l’en-tête mudfish_dns_module.h ou téléchargez mudfish_dns_module.h. Il définit les structures, hooks, actions et règles de durée de vie des données. Ce guide utilise l’ABI C v2. Exportez mudfish_dns_module_init_v2() et vérifiez MUDFISH_DNS_MODULE_ABI_V2 ainsi que la taille de structure reçue avant de renseigner les hooks. Retournez 0 si l’initialisation réussit.

HookMoment de l’appel
on_dns_queryAprès acceptation de la requête analysée, avant consultation du cache ou transmission.
on_dns_responseAprès sélection de la réponse, avant mise en cache ou retour au client. Les réponses en cache passent aussi par ce hook.
on_web_helloAprès inspection initiale de HTTP Host/TLS SNI, avant connexion ou traitement des données initiales.
on_web_dataAprès lecture des données suivantes du client ou du serveur, avant transmission.

Actions DNS​

Les hooks DNS v2 retournent 0 en cas de succès et définissent result->action.

ActionEffet
MUDFISH_DNS_CONTINUEPoursuit avec le module suivant et le traitement normal.
MUDFISH_DNS_ALLOWTermine la chaîne de hooks courante et poursuit la résolution normale ou renvoie la réponse sélectionnée.
MUDFISH_DNS_BLOCKRenvoie REFUSED.
MUDFISH_DNS_DROPAbandonne la requête sans réponse DNS.
MUDFISH_DNS_ANSWERGénère une réponse avec l’adresse IPv4/IPv6 et le TTL fournis.
MUDFISH_DNS_REPLACEUtilise la réponse DNS complète au format réseau fournie par le module.

Ne retournez pas directement une constante d’action depuis un hook DNS v2. Une valeur de retour non nulle ou un résultat invalide entraîne SERVFAIL. ALLOW termine uniquement la chaîne courante et ne contourne ni les règles de domaine, ni les autorisations de transport, ni la vérification des certificats. Tous les résultats de requête sauf DROP passent également par les hooks de réponse.

Les hooks Web retournent directement MUDFISH_DNS_CONTINUE ou MUDFISH_DNS_REJECT. Rejeter une requête Web ferme la connexion. La protection Web doit être activée pour utiliser ces hooks ; aucun contenu HTTPS déchiffré n’est fourni.

Tampons, threads et cache​

Les événements et tampons d’entrée sont en lecture seule et valides uniquement pendant le callback. Une réponse de remplacement doit utiliser une mémoire appartenant au module et rester valide jusqu’au prochain callback de ce module ou à sa destruction. Ne retournez ni mémoire de pile ni pointeur emprunté à l’événement. L’identifiant DNS, l’opcode et la question doivent correspondre à la requête initiale. Les callbacks d’une instance sont exécutés séquentiellement, mais peuvent être appelés depuis différents threads. Ils doivent se terminer rapidement et ne pas propager d’exceptions à travers la frontière ABI.

Les résultats générés, remplacés, bloqués ou abandonnés ne sont pas stockés dans le cache de l’hôte. Remplacer une réponse issue du cache ne modifie pas l’entrée originale. L’hôte efface le drapeau AD des réponses de remplacement, sans validation DNSSEC ni nouvelle signature. Un module qui modifie des données signées doit gérer lui-même les signatures devenues invalides.

Exemple et en-tête​

Les pages suivantes contiennent le code complet de l’exemple et l’en-tête nécessaire. Il n’est pas nécessaire de télécharger séparément les sources de Mudfish DNS.

FichierContenu
policy.c — exemple de politique DNSAutorisation, blocage et abandon de requêtes, génération de réponses IP, modification d’adresses et de TTL. Comprend les commandes de compilation et de test Linux.
mudfish_dns_module.h — en-tête du moduleDéclarations ABI, signatures des hooks, constantes d’action et règles de propriété des tampons.

Avant compilation, téléchargez policy.c et mudfish_dns_module.h dans le même dossier. La commande de l’exemple génère une bibliothèque Linux .so.