J’ai dernièrement changé d’opérateur internet pour passer chez Sosh. « Et vous, quand est-ce que vous passez chez … », euh NON ! Je connais pas Sosh, ni Orange en tant qu’opérateur internet pour particulier et je me disais « bah une box, c’est une box, du moment que ca me donne internet… » béh en fait non.
J’ai déjà galéré avec IPv6 et leur DHCP6 et annonce RA qui écrase mon pihole. Et maintenant que ma box vient de rebooter, je vois que plus aucune de mes machines n’est accessible de l’extérieu. J’ai vite compris que mon IP avait changé. Après un moment de recherche, il n’est pas possible de fixer l’IP de sa connexion internet chez Sosh/Orange.
Nous allons donc vois comment contourner ce problème en utilisant une entrée DNS dynamique.
C’est quoi un DNS dynamique
Un DNS dynamique est un service qui permet de mettre à jour automatiquement une entrée DNS afin d’accéder à des machines dont l’IP peut changer spontanément. On pourra donc accéder à son serveur en tapant un nom de machine comme « serveur1.mondomaine.fr » qui lui sera fixe.
Pourquoi DuckDNS ?
Il existe plusieurs « société » qui propose ce service, dont le plus connu DynDNS. Mais je ne voulais pas de payant (entre 33€ et 48€/an). Alors j’ai cherché dans les API de mon registrar DNS, mais le miens ne fait pas ce service. Il y a bien OVH qui propose se service, mais il faut que son domaine soit enregistré chez eux et je voulais pas migrer mon domaine. En cherchant un peu, je suis tombé sur DuckDNS qui à l’air pas mal utilisé dans le monde de la domotique avec des intégrations dans Home Assistant.
Je vais donc utiliser DuckDNS car il permet de mettre à jour une entrée DNS avec un simple requête HTTPS. Je vais donc avoir ma propre intégration, indépendante de la box qui est utilisée, sous NodeRED sur lequel j’ai mes automatisations.
Configuration DuckDNS
Nous allons commencer par s’enregistrer sur le site duckdns.org et récupérer un token. Pour s’enregistrer, il faut lier DuckDNS à une des plateformes suivantes : Personna, Twitter, Github, Google. Une fois connecté à votre compte saisir le sous-domaine que vous voulez puis cliquer sur le bouton vert « add domain ». Noter dans un coin le nom de domain ainsi que votre token.
Configuration NodeRED
Pour cette automatisation, j’ai décidé de faire un contrôle avant afin de ne pas surcharger les serveurs DuckDNS (déjà que c’est gratuit, on va pas consommer des ressources inutilement. Ca leur coute de l’argent à eux). Je regarde donc si l’IP à changée et je fait un requête vers DuckDNS uniquement si elle a changé.
L’automatisation se déroule comme ceci :
- Je fait donc un contrôle toutes les 15 minutes et uniquement en journée. J’estime pouvoir attendre 15 minutes après un reboot ; et la nuit je dors.
- En parallèle, je fais une résolution DNS de mon nom de domaine via la commande nslookup ;
- Et je récupère mon IP internet. Pour ce faire, je fais une requête vers mon serveur Web sur lequel j’ai déposé une page PHP qui me retourne mon IP. Cette page contient le code suivant :
<?php echo $_SERVER['REMOTE_ADDR']; ?>
Vous pouvez des sites existants sur internet mais il faudra parser/formater la réponse. - Losque j’ai les deux résultats, je les compare et transmet le message uniquement s’ils sont différents
- Puis je génère la requête vers DuckDNS en utilisant l’URL suivante :
https://www.duckdns.org/update?domains={votredomaine}&token={votretoken}
Remplacer {votredomain} par le domaine enregistré au début, de même pour {votretoken}
C’est tout !!
Tests et conclusion
Pour tester, on va ouvrir une invite de commande : WIN + R ; taper cmd ; ENTER ; taper nslookup mondomaine.duckdns.org ; ENTER
Avant la mise à jour :
>nslookup mondomaine.duckdns.org
Serveur : livebox.home
Address: 2a01::0
Réponse ne faisant pas autorité :
Nom : mondomaine.duckdns.org
Address: 182.X.X.1
Après la mise à jour :
>nslookup mondomaine.duckdns.org
Serveur : livebox.home
Address: 2a01::0
Réponse ne faisant pas autorité :
Nom : mondomaine.duckdns.org
Address: 212.X.X.193
Voila, vous pouvez maintenant vous connecter chez vous lorsque vous n’y êtes pas à l’aide d’une URL alors que vous avez une IP dynamique. Ca peut être votre NAS avec vos photos et musiques ; votre domotique ; ou bien d’autres choses. Bien sur, en fonction de ce que voudrez accéder, il faudra faire le nécessaires pour autoriser les connexions venant d’internet car sinon la box bloquera la connexion.
Bonus
Si vous avez votre propre domaine vous pouvez faire un alias DNS qui pointera vers l’entrée de DuckDNS :mondomaine.cisko.fr. CNAME mondomaine.duckdns.org
>nslookup mondomaine.cisko.fr
Serveur : livebox.home
Address: 2a01::0
Réponse ne faisant pas autorité :
Nom : mondomaine.duckdns.org
Address: 212.X.X.193
Aliases: mondomaine.cisko.fr
Bonus 2
Voici le flow NodeRED, vous n’avez qu’a l’importer et changer votre domaine et votre token.
[{"id":"aecd3f77f31fd53e","type":"comment","z":"30e591de3ccfa354","name":"Update Duck DNS dynamique","info":"\n","x":160,"y":1160,"wires":[]},{"id":"fa0a5f107e626467","type":"exec","z":"30e591de3ccfa354","command":"nslookup","addpay":"payload","append":"","useSpawn":"false","timer":"","winHide":false,"oldrc":false,"name":"","x":340,"y":1200,"wires":[["217d92a56fd27ccd"],[],[]]},{"id":"daa2b7ee5f14b611","type":"inject","z":"30e591de3ccfa354","name":"Start","props":[{"p":"payload"},{"p":"topic","vt":"str"}],"repeat":"","crontab":"*/15 6-23 * * *","once":false,"onceDelay":0.1,"topic":"","payload":"mondomaine.cisko.fr","payloadType":"str","x":110,"y":1200,"wires":[["fa0a5f107e626467","41a417cd136aac8e"]]},{"id":"217d92a56fd27ccd","type":"function","z":"30e591de3ccfa354","name":"formatage","func":"var filter = /mondomaine\\.duckdns\\.org[\\n\\r].* (((25[0-5]|(2[0-4]|1\\d|[1-9]|)\\d)\\.?\\b){4})/\n\nmsg.topic = \"dnsIP\"\nmsg.payload = msg.payload.match(filter)[1]\n\n\nreturn msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":530,"y":1200,"wires":[["6241773d392ed895"]]},{"id":"41a417cd136aac8e","type":"http request","z":"30e591de3ccfa354","name":"get(monIP)","method":"GET","ret":"txt","paytoqs":"ignore","url":"https://cisko.fr/get_WAN_IP.php","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"credentials":{"user":"","password":""},"x":350,"y":1260,"wires":[["26685b4e1b8075e3"]]},{"id":"6241773d392ed895","type":"join","z":"30e591de3ccfa354","name":"","mode":"custom","build":"object","property":"payload","propertyType":"msg","key":"topic","joiner":"\\n","joinerType":"str","accumulate":false,"timeout":"","count":"2","reduceRight":false,"reduceExp":"","reduceInit":"","reduceInitType":"","reduceFixup":"","x":730,"y":1260,"wires":[["dd8e53ff5fb631a7","f9983582c902bf89"]]},{"id":"26685b4e1b8075e3","type":"change","z":"30e591de3ccfa354","name":"","rules":[{"t":"set","p":"topic","pt":"msg","to":"wanIP","tot":"str"}],"action":"","property":"","from":"","to":"","reg":false,"x":540,"y":1260,"wires":[["6241773d392ed895"]]},{"id":"dd8e53ff5fb631a7","type":"function","z":"30e591de3ccfa354","name":"if(different)","func":"\nif(msg.payload.dnsIP != msg.payload.wanIP)\n return msg;","outputs":1,"noerr":0,"initialize":"","finalize":"","libs":[],"x":890,"y":1260,"wires":[["db2a20b375a69689"]]},{"id":"db2a20b375a69689","type":"http request","z":"30e591de3ccfa354","name":"update DuckDNS","method":"GET","ret":"txt","paytoqs":"ignore","url":"https://www.duckdns.org/update?domains=mondomaine&token=montoken","tls":"","persist":false,"proxy":"","insecureHTTPParser":false,"authType":"","senderr":false,"headers":[],"credentials":{"user":"","password":""},"x":1070,"y":1260,"wires":[["2d25d30218102c41"]]},{"id":"2d25d30218102c41","type":"debug","z":"30e591de3ccfa354","name":"debug 13","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"payload","targetType":"msg","statusVal":"","statusType":"auto","x":1240,"y":1260,"wires":[]},{"id":"f9983582c902bf89","type":"debug","z":"30e591de3ccfa354","name":"debug 14","active":true,"tosidebar":true,"console":false,"tostatus":false,"complete":"true","targetType":"full","statusVal":"","statusType":"auto","x":880,"y":1220,"wires":[]}]