Bonjour/bonsoir à tous,

Alors voilà, il y a peu, j'ai décidé de résilier le VPS que j'avais chez OVH.
Ce dernier me servait notamment à héberger le blog que vous lisez actuellement.

Le trafic du site n'étant pas énorme et n'ayant plus l'utilité d'avoir un VPS maintenant que j'ai un bon serveur chez moi, la question de l'hébergement à la maison ne se posait plus. Restait plus qu'à sauter le pas.

C'est pratique, ça coûte moins cher, mais ça apporte aussi son lot de spécificités dont je dois m'occuper. Comme une IP dynamique par exemple 🙃.

La zone DNS du domaine holory.fr est déléguée à Cloudflare et pointe sur mon IP personnelle. Avec une IP dynamique, il faudrait que je change l'IP sur laquelle point ce domaine à chaque redémarrage de ma box.

C'est maintenant que rentre en jeu GoDNS, qui va périodiquement mettre à jour le champs "A" de mon domaine et mes sous-domaines sur Cloudflare.

Brève présentation de GoDNS

GoDNS est un client DNS dynamique (DDNS) écrit en Go (comme son nom l'indique). Il a la particularité d'être déployable très facilement, via docker et est facile à paramétrer. Tout se passe dans un fichier config.json

Voici une liste des fournisseurs actuellement supportés par GoDNS :

ProviderIPv4 supportIPv6 supportRoot DomainSubdomains
Cloudflare
Google Domains
DNSPod
Dynv6
HE.net (Hurricane Electric)
AliDNS
DuckDNS
Dreamhost
No-IP
Scaleway

Comme vous pouvez le voir sur le tableau ci-dessus, tous les providers ne sont pas encore compatibles avec la mise à jour du domaine root. Vérifiez donc bien vos besoins avant de vouloir utiliser GoDNS.

Un autre truc qui m'a bien plu avec ce outil, c'est la possibilité de recevoir une notification, genre via Telegram ou par email, dès que l'IP est mise à jour. On peut penser que ça fait gadget, mais c'est quand même pratique pour vérifier que ses services sont toujours accessibles suite à un changement d'IP.

On verra ça en bonus, à la fin de l'article.

Déployer et configurer GoDNS avec Docker

L'image Docker de GoDNS est disponible à cette adresse.

On commence par créer le fichier config.json qui servira, un peu plus tard, à paramétrer GoDNS.

touch config.json

Reste ensuite à lancer le conteneur via la commande :

docker run \
-d --name godns --restart=always \
-v /path/to/config.json:/config.json \
timothyye/godns:latest
Pensez bien à changer le /path/toconfig.json en ./config.json par exemple

Configuration du fichier config.json

Dans mon cas, j'ai simplement besoin de mettre à jour périodiquement mon domaine root. Disons toutes les 5 minutes.

Je vais donc le faire via l'API Cloudflare que vous pouvez générer ici.

{
  "provider": "Cloudflare",
  "login_token": "votre_cle_api_ici",
  "domains": [{
      "domain_name": "holory.fr",
      "sub_domains": ["@"]
    }
  ],
  "resolver": "8.8.8.8",
  "ip_url": "https://api.ip.sb/ip",
  "ip_type": "IPv4",
  "interval": 300,
  "socks5_proxy": ""
}
Exemple de configuration d'un fichier config.json

Le "@" dans la partie "sub_domains" permet de spécifier que l'on veut mettre à jour le domaine root. Si l'on voulait mettre à jour le domaine root + un sous-domaine, la configuration ressemblerait à ça :

{
   "provider": "Cloudflare",
   "login_token": "votre_cle_api_ici",
   "domains": [{
         "domain_name": "holory.fr",
         "sub_domains": ["@"]
      },
      {
         "domain_name": "holory.fr",
         "sub_domains": ["www","test"]
      }
   ],
   "resolver":"8.8.8.8",
   "ip_url":"https://api.ip.sb/ip",
   "ip_type":"IPv4",
   "interval":300,
   "socks5_proxy":"",
}

Et maintenant en vérifiant les logs du conteneur GoDNS :

time="2022-02-15T16:24:45Z" level=info msg="Querying records with type:A"
time="2022-02-15T16:24:45Z" level=info msg="Querying records with type:A"
time="2022-02-15T16:24:46Z" level=info msg="Record OK: holory.fr
time="2022-02-15T16:24:46Z" level=info msg="Record OK: test.holory.fr

Les domaines sont vérifiés toutes les 5 minutes par  défaut comme spécifié par "interval" dans le fichier config.json. Le temps est donné en secondes.

Pour une vérification toutes les minutes, changez "interval:300" par "interval:60".

Envoyer des notifications

Chose promise, choses due, voyons ensemble comment GoDNS peut envoyer des notifications, via Telegram dans cet exemple, lors d'un changement d'adresse IP.

Encore une fois, tout va se passer dans le fichier config.json.
A l'heure où j'écris ce billet, il est possible d'envoyer des notifications via :

  • Telegram
  • Slack
  • Discord
  • Email
  • Pushover

Pour l'envoi de notifications via Telegram, la configuration se présente comme ceci :

  "notify": {
    "telegram": {
      "enabled": true,
      "bot_api_key": "11111:aaaa-bbbb",
      "chat_id": "-123456",
      "message_template": "*{{ .Domain }}* updated to {{ .CurrentIP }}",
      "use_proxy": false
    },
  }

Vous pouvez récupérer votre clé API Telegram en créant un bot via le BotFather :

BotFather
BotFather is the one bot to rule them all. Use it to create new bot accounts and manage your existing bots.

Une fois le bot créé, vous devrez créer un groupe telegram et y ajouter le bot qui enverra les messages de changements d'adresse IP.

Vous pouvez ensuite récupérer l'ID du chat en envoyant un premier message dedans et en faisant une requête sur l'API Telegram : https://api.telegram.org/botXXX:YYYY/getUpdates

Remplacez XXX:YYYY par le token de votre bot.
Vous devriez avoir une réponse en json avec l'ID du groupe.

Résultat final :

{
  "provider": "Cloudflare",
  "login_token": "xxxx",
  "domains": [
    {
      "domain_name": "holory.fr",
      "sub_domains": ["@"]
    },
    {
      "domain_name": "holory.fr",
      "sub_domains": ["www","test"]
    }
  ],
  "resolver": "8.8.8.8",
  "ip_url": "https://api.ip.sb/ip",
  "ip_type": "IPv4",
  "interval": 300,
  "socks5_proxy": "",
  "notify": {
    "telegram": {
      "enabled": true,
      "bot_api_key": "xxxx:yyyy",
      "chat_id": "-0000000000",
      "message_template": "*{{ .Domain }}* updated to {{ .CurrentIP }}",
      "use_proxy": false
    }
  }
}
Exemple de configuration finale permettant de mettre à jour un domaine root, un sous-domaine et envoyer une notification via Telegram lors d'un changement d'adresse IP
Message automatique du bot Telegram lors d'un changement d'adresse IP

Conclusion

GoDNS s'est avéré très simple à utiliser, déployer et est fonctionnel en quelques minutes. J'avais déjà effectué des premiers tests avec ddclient, sans succès. Sûrement parce que je m'y prenais mal.

La configuration de GoDNS a le mérite d'être accessible, même aux néophytes et est compatible avec plusieurs services de messagerie pour recevoir des notifications. On parle pas non plus de l'outil révolutionnaire de l'année, mais ça fait ce qu'on lui demande, et ça le fait bien.  

N'hésitez pas à partager votre expérience sur le sujet, l'outil que vous utilisez et si vous aviez déjà entendu parlé de GoDNS : Via l'espace de commentaires juste en dessous.