Encore un petit projet perso sur lequel je bosse depuis plusieurs mois, RestDNS, un logiciel de gestion de ses DNS. J’ai longtemps hésité avant de me lancer dans un n-ième projet, d’autant plus que la gestion des DNS n’est pas un sujet vraiment original. Cependant, après de longues recherches, je n’ai trouvé aucun projet existant qui ne soit pas une usine à gaz, abandonné, ou fonctionnellement adapté à mon usage (qui n’est pourtant pas bien extraordinaire).

Je recherchais :

  • Un logiciel léger, simple a installer et à utiliser
  • Une compatibilité avec n’importe quel serveur DNS, ou tout du moins, la possibilité de développer facilement un connecteur pour les serveurs pas encore pris en charge
  • Une architecture en “pull”, c’est à dire où ce sont les serveurs DNS qui viennent chercher leur configuration, et pas le gestionnaire de configuration qui la pousse
  • Une interface simple à utiliser, et pas forcément orientée web, mais si c’est le cas, je voulais quelque chose de moderne et pratique
  • Une interface “bas niveau”, c’est à dire qui me laisse éditer moi même mes enregistrements avec les vrais types et paramètres pour chacun d’entre eux. Je ne suis cependant pas contre quelques “helpers”, comme par exemple la création assistée d’enregistrement PTR avec conversion en nom DNS des adresses IP.

Je me suis donc lancé dans le développement d’un outil répondant à ces critères.

Comme son nom l’indique, le projet se base sur un web-service REST programmé avec Django et utilisant une base de données SQL pour stocker les informations sur les zones. Des clients (connecteur de serveurs DNS, interface de gestion) se connectent ensuite sur ce web-service pour récupérer les informations et les modifier.

RestDNS RestDNS-Bind RestDNS-CLI fichier de zone rest Génération des fichiers de zonerest

Le web-service est conçu comme un “stockage stupide”, son rôle est de stocker les informations des zones, de valider que ces informations sont cohérentes et c’est tout. Il n’a par exemple pas conscience que certains clients sont des connecteurs de serveur DNS et d’autre non, et ne modifiera donc pas ses réponse en fonction du client.

D’autre part, afin de simplifier au maximum ce composant, j’ai décidé de ne pas y implémenter d’authentification. Je suis partit du principe que l’authentification pouvait être facilement ajoutée au dessus sous forme de middleware HTTP