IP dynamique et DNS

J’ai depuis quelques temps maintenant un Raspberry pi, qui se trouve chez moi, et sur lequel je souhaite installer un logiciel de backup et d’autres trucs (je ferai sûrement un article dessus à ce moment là). Il faut donc que mon Raspberry soit accessible depuis internet. Le souci est que je suis chez Orange et j’ai donc une IP dynamique (merci Orange…).

Il existe des sites comme DynDNS ou No-IP qui propose de lier l’IP de votre box à un sous-domaine chez eux afin de connaitre facilement votre IP. Mais je préfère utiliser un système que j’héberge moi-même plutôt que d’utiliser un service tiers.
Pour ce faire, je vais créer un sous-domaine, monip.memodugeek.info par exemple, et faire en sorte que mon Raspberry vienne mettre à jour ce nom de domaine pour le faire pointer vers l’IP publique de ma box Orange.
Il faut quand même quelques pré-requis pour cette méthode :

  • Un serveur DNS Bind configuré, relié à internet, et étant maître de la zone qui sera modifiée (memodugeek.info dans mon cas). Je vais utiliser mon serveur OVH (sur lequel est hébergé ce site) dans mon cas.
  • Un serveur Linux situé derrière la box, qui va récupérer l’IP publique et la transmettre au serveur DNS. Dans mon cas c’est mon Raspberry qui va se charger de ça.
  • Avoir un sous-domaine.

Dans la suite de l’article, je parlerai, pour désigner les machines, de serveur DNS (mon serveur OVH dans mon cas) et de Raspberry (serveur situé derrière ma box Orange).

1) Configuration du Raspberry

Commençons par la configuration du Raspberry. Installez les paquets bind9utils et dnsutils à l’aide la commande
sudo aptitude install bind9utils dnsutils

Comme le Raspberry va devoir communiquer avec le serveur DNS pour mettre à jour le nom de domaine, on va sécuriser cet échange. Pour ce faire, on va utiliser une clé TSIG qui nous servira à générer un HMAC, qui couple une fonction de hachage et une clé secrète afin de vérifier l’intégrité et l’authenticité du message. Pour l’algorithme de hachage, on va utiliser SHA2. On peut utiliser d’autres algorithmes également.

L’utilitaire dnssec-keygen, fournit par Bind, va nous permettre de créer cette clé. Entrez la commande suivante :
dnssec-keygen -a HMAC-SHA512 -b 512 -n HOST iprasp
-a HMAC-SHA512 : indique l’algorithme utilisé pour le hachage, SHA-512 qui fait parti de la famille SHA2
-b 512 : indique le nombre de bit de la clé, 512 ici.
-n HOST : j’ai pas vraiment compris la différence entre tous les choix possible de -n (USER, ZONE, ENTITY, etc) mais dans notre cas il faut choisir HOST.
A la fin de la commande, on indique le nom de clé.

Cette commande va générer deux clés : Kiprasp.+165+07175.key et Kiprasp.+165+07175.private. Celle qui va surtout nous intéresser est la clé privée. Voici le contenu de la clé :

[pastacode lang=”bash” manual=”cat%20Kiprasp.%2B165%2B07175.private%0APrivate-key-format%3A%20v1.3%0AAlgorithm%3A%20165%20(HMAC_SHA512)%0AKey%3A%20qIBPc05SV9C6dphFKYWRYop%2BwRPaA%2FJ1b5Te%2FIs0HDxYhBpS7qVmDFsDN2W%2FDeGmCxKnq%2BnXo%2BwOoaqJjeywkw%3D%3D%0ABits%3A%20AAA%3D%0ACreated%3A%2020180523133201%0APublish%3A%2020180523133201%0AActivate%3A%2020180523133201″ message=”” highlight=”” provider=”manual”/]

C’est bien évidemment une clé que j’ai créée uniquement pour les besoins de l’article, il ne faut jamais partager une clé comme je le fais là.
Ce qui va nous intéresser est la ligne “Key:”. Copiez la clé dans le presse papier (qIBPc05SV9C6dphFKYWRYop+wRPaA/J1b5Te/Is0HDxYhBpS7qVmDFsDN2W/DeGmCxKnq+nXo+wOoaqJjeywkw== dans notre exemple).

La configuration du Raspberry étant terminée, on va passer à la configuration du serveur DNS.

2) Configuration du serveur DNS

Créez le fichier /etc/bind/named.conf.keys et ajoutez les lignes suivantes :

[pastacode lang=”bash” manual=”key%20iprasp%20%7B%0A%20%20%20%20%20%20%20%20algorithm%20HMAC-SHA512%3B%0A%20%20%20%20%20%20%20%20secret%20%22qIBPc05SV9C6dphFKYWRYop%2BwRPaA%2FJ1b5Te%2FIs0HDxYhBpS7qVmDFsDN2W%2FDeGmCxKnq%2BnXo%2BwOoaqJjeywkw%3D%3D%22%3B%0A%7D%3B” message=”” highlight=”” provider=”manual”/]

Ces lignes servent à indiquer à Bind, le serveur DNS, la clé à utiliser pour sécuriser les échanges. Après “key” il faut bien évidemment indiquer le nom que vous avez utiliser lors de la génération de la clé TSIG.
De même, si vous avez utiliser un autre algorithme que HMAC-SHA512, pensez à le modifier.

Ouvrez le fichier /etc/bind/named.conf.local et ajoutez les lignes suivantes dans la zone souhaitée (memodugeek.info dans notre exemple) :

[pastacode lang=”bash” manual=”update-policy%20%7B%0A%20%20%20%20%20%20%20%20grant%20%22iprasp%22%20subdomain%20monip.memodugeek.info%20A%3B%0A%20%20%20%20%7D%3B” message=”” highlight=”” provider=”manual”/]

On indique à Bind, grâce à cette ligne, que toute demande de mise à jour DNS utilisant la clé “iprasp” est autorisée pour le sous-domaine “monip.memodugeek.info” et uniquement ce sous-domaine.
Sans la clé TSIG, impossible de mettre à jour ce sous-domaine ou un autre et la clé ne permet de mettre à jour que ce sous-domaine.

Votre zone devrait donc ressembler à ça :

[pastacode lang=”bash” manual=”zone%20%22memodugeek.info%22%20%7B%0A%20%20%20%20%20%20%20%20type%20master%3B%0A%20%20%20%20%20%20%20%20allow-transfer%20%7B213.186.33.199%3B%7D%3B%0A%20%20%20%20%20%20%20%20file%20%22%2Fetc%2Fbind%2Fpri.memodugeek.info%22%3B%0A%20%20%20%20%20%20%20%20update-policy%20%7B%0A%20%20%20%20%20%20%20%20grant%20%22iprasp%22%20subdomain%20monip.memodugeek.info%20A%3B%0A%20%20%20%20%7D%3B%0A%7D%3B” message=”” highlight=”” provider=”manual”/]

La ligne “allow-transfer” sert au DNS secondaire et n’a rien à voir avec ce qu’on fait.

Si vous utilisez ISPConfig, la moindre modification de la zone DNS va écraser ce fichier. Malheureusement, ISPConfig ne gère pas “update-policy” mais gère “allow-update” qui permet moins de finesse. Contrairement à “update-policy”, “allow-update” autorise toutes les mise à jour authentifiées avec la clé. Mais au moins vous n’aurez pas besoin de modifier le fichier à chaque changement dans ISPConfig.
Pour configurer ISPConfig, allez dans la zone DNS de votre domaine, et dans le champ “mettre à jour l’ACL” mettre key "nom de la clé".

Après avoir cliqué sur Enregistrer et attendu qu’ISPConfig mette à jour les fichiers, si vous ouvrez le fichier /etc/bind/named.conf.local, vous devriez avoir ceci :

[pastacode lang=”bash” manual=”zone%20%22memodugeek.info%22%20%7B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%E2%94%82%0A%20%20%20%20%20%20%20%20type%20master%3B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%E2%94%82%0A%20%20%20%20%20%20%20%20allow-transfer%20%7B213.186.33.199%3B%7D%3B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%E2%94%82%0A%20%20%20%20%20%20%20%20allow-update%20%7Bkey%20%22iprasp%22%3B%7D%3B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%E2%94%82%0A%20%20%20%20%20%20%20%20file%20%22%2Fetc%2Fbind%2Fpri.memodugeek.info%22%3B%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%E2%94%82%0A%7D%3B%20%20″ message=”” highlight=”” provider=”manual”/]

Il ne nous reste plus qu’à redémarrer Bind avec la commande sudo systemctl restart bind9.service

On n’a plus qu’à tester pour vérifier que ça fonctionne.

3) Test de mise à jour du DNS

Pour mettre à jour le DNS, on va utiliser l’utilitaire nsupdate.
Sur le Raspberry, tapez la commande nsupdate -k cléprivée en indiquant votre clé privé à la place de “cléprivée”. La clé publique (le fichier en .key) doit être situé dans le même dossier.
Ensuite tapez “zone memodugeek.info” puis appuyez sur Entrée.
Puis tapez “update add monip.memodugeek.info. 30 A 0.0.0.0” puis appyez sur Entrée.
La première ligne sert à indiquer quelle zone DNS on va modifier et la seconde indique qu’on va modifier le sous-domaine monip.memodugeek.info afin de le faire pointer vers l’adresse 0.0.0.0. Evidemment ces lignes sont à modifier en fonction de votre nom de domaine.

Maintenant tapez “show” puis Entrée. Vous devriez avoir quelque chose de ce type :

[pastacode lang=”bash” manual=”%3E%20zone%20memodugeek.info%0A%3E%20update%20add%20monip.memodugeek.info.%2030%20A%200.0.0.0%0A%3E%20show%0AOutgoing%20update%20query%3A%0A%3B%3B%20-%3E%3EHEADER%3C%3C-%20opcode%3A%20UPDATE%2C%20status%3A%20NOERROR%2C%20id%3A%20%20%20%20%20%200%0A%3B%3B%20flags%3A%3B%20ZONE%3A%200%2C%20PREREQ%3A%200%2C%20UPDATE%3A%200%2C%20ADDITIONAL%3A%200%0A%3B%3B%20ZONE%20SECTION%3A%0A%3Bmemodugeek.info.%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20IN%20%20%20%20%20%20SOA%0A%0A%3B%3B%20UPDATE%20SECTION%3A%0Amonip.memodugeek.info.%20%2030%20%20%20%20%20%20IN%20%20%20%20%20%20A%20%20%20%20%20%20%200.0.0.0″ message=”” highlight=”” provider=”manual”/]

Tapez ensuite “send” puis Entrée pour mettre à jour le DNS. Si nsupdate vous affiche un message d’erreur, il vous faudra aller éplucher les logs de Bind sur le serveur DNS pour voir où se situe le problème.

Si tout a fonctionné, vous devriez voir ceci dans les logs de Bind sur le serveur DNS:

[pastacode lang=”bash” manual=”May%2023%2016%3A23%3A41%20ns397819%20named%5B31585%5D%3A%20client%2092.167.57.120%2358242%2Fkey%20iprasp%3A%20updating%20zone%20’memodugeek.info%2FIN’%3A%20adding%20an%20RR%20at%20’monip.memodugeek.info’%20A%200.0.0.0%0AMay%2023%2016%3A23%3A41%20ns397819%20named%5B31585%5D%3A%20zone%20memodugeek.info%2FIN%3A%20sending%20notifies%20(serial%202018052208)” message=”” highlight=”” provider=”manual”/]

Et, toujours sur le serveur DNS, si vous lancez la commande dig +nocmd monip.memodugeek.info +noall +answer vous devriez avoir ceci :
rasp.memodugeek.info. 30 IN A 0.0.0.0

Il ne nous reste plus qu’à automatiser tout ça avec un petit script.

4) Automatisation de la mise à jour

Créez le script suivant sur le Raspberry :

[pastacode lang=”bash” manual=”%23!%2Fbin%2Fbash%0A%23%20Teste%20si%20l’ip%20publique%20a%20%C3%A9t%C3%A9%20modifi%C3%A9e%20et%20met%20%C3%A0%20jour%20l’enregistrement%20DNS%0A%23%20Utilise%20la%20cl%C3%A9%20TSIG%0A%23%20Fran%C3%A7ois%20Grange%202012%0A%23%20Modifi%C3%A9%20par%20fate%202018%0A%23%20Inits%0AADMIN%3D%22admin%40memodugeek.info%22%0AZONE%3D%22memodugeek.info%22%0ARR%3D%22rasp.%24ZONE.%22%0ATTL%3D30%0ALAST_IP%3D%220.0.0.0%22%0ALAST_IP_FILE%3D%22%2Fhome%2Fpi%2Fupdate_ip%2Flastip%22%0AERR_FILE%3D%22%2Fhome%2Fpi%2Fupdate_ip%2Fdyndns.err%22%0AKEY_FILE%3D%22%2Fhome%2Fpi%2Fupdate_ip%2FKiprasp.%2B165%2B07175.private%22%0ATMP_FILE%3D%22%2Fhome%2Fpi%2Fupdate_ip%2Fdyndns.tmp%22%0ACUR_IP%3D%60wget%20-q%20-O%20-%20memodugeek.info%2Fmonip.php%60%0A%0A%23%20Fonction%20de%20gestion%20des%20message%20d’erreur%20ou%20de%20changement%20d’IP%0Asortie()%20%7B%0A%20%20%20%20%20%20%20%20%23%20Si%20erreur%20de%20mise%20%C3%A0%20jour%2C%20on%20envoi%20un%20mail%20indiquant%20qu’il%20y%20a%20eu%20une%20erreur%20avec%20le%20fichier%20d’erreur%20en%20pi%C3%A8ce-jointe.%0A%20%20%20%20%20%20%20%20if%20%5B%20%241%20-eq%201%20%5D%3B%20then%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20echo%20%22Une%20erreur%20est%20survenue%20lors%20de%20la%20mise%20%C3%A0%20jour%20du%20DNS.%20Le%20message%20d’erreur%20se%20trouve%20en%20pi%C3%A8ce-jointe.%22%20%7C%20mail%20-s%20%22Erreur%20de%20mise%20%C3%A0%20jour%20de%20%24RR%22%20-A%20%24ERR_FILE%20%24ADMIN%0A%20%20%20%20%20%20%20%20%23%20Si%20changement%20d’IP%2C%20on%20envoi%20un%20mail%20avec%20la%20nouvelle%20IP%0A%20%20%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20cat%20%24TMP_FILE%20%7C%20mail%20-s%20%22Changement%20d’IP%20pour%20%24RR%20La%20nouvelle%20IP%20est%20%24CUR_IP.%22%20%24ADMIN%0A%20%20%20%20%20%20%20%20fi%0A%20%20%20%20%20%20%20%20exit%0A%7D%0A%0A%23%20On%20supprime%20l’ancien%20fichier%20d’erreur%20s’il%20existe%0Aif%20%5B%20-f%20%24ERR_FILE%20%5D%3B%20then%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20rm%20-f%20%24ERR_FILE%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20fi%0A%23%20Si%20on%20n’arrive%20pas%20%C3%A0%20r%C3%A9cup%C3%A9rer%20l’adresse%20IP%20publique%2C%20on%20sort%20en%20envoyant%20un%20mail%20d’erreur%20via%20sortie()%0Aif%20%5B%20%22%24CUR_IP%22%20%3D%20%22%22%20%5D%20%7C%7C%20%5B%20%22%24CUR_IP%22%20%3D%20%22unknown%22%20%5D%3B%20then%0A%20%20%20%20%20%20%20%20echo%20%22Impossible%20de%20r%C3%A9cup%C3%A9rer%20l’IP%20actuelle%20-%20Abandon%22%20%3E%20%24ERR_FILE%0A%20%20%20%20%20%20%20%20sortie%201%0Afi%0A%0A%23%20On%20r%C3%A9cup%C3%A8re%20la%20derni%C3%A8re%20IP%20connue%0Aif%20%5B%20-f%20%24LAST_IP_FILE%20%5D%3B%20then%0A%20%20%20%20%20%20%20%20LAST_IP%3D%60cat%20%24LAST_IP_FILE%60%0Afi%0A%0A%23%20Si%20l’adresse%20a%20chang%C3%A9%2C%20on%20lance%20nsupdate%20en%20mettant%20la%20sortie%20debug%20dans%20le%20fichier%20d’erreur.%0Aif%20%5B%20!%20%22%24LAST_IP%22%20%3D%20%22%24CUR_IP%22%20%5D%3B%20then%0A%20%20%20%20%20%20%20%20echo%20%22IP%20actuelle%20%3A%20%24CUR_IP%22%20%3E%20%24TMP_FILE%0A%20%20%20%20%20%20%20%20echo%20%22IP%20pr%C3%A9c%C3%A9dente%20%3A%20%24LAST_IP%22%20%3E%3E%20%24TMP_FILE%0A%20%20%20%20%20%20%20%20(%0A%20%20%20%20%20%20%20%20echo%20%22zone%20%24ZONE%22%0A%20%20%20%20%20%20%20%20echo%20%22update%20delete%20%24RR%20A%22%0A%20%20%20%20%20%20%20%20echo%20%22update%20add%20%24RR%20%24TTL%20A%20%24CUR_IP%22%0A%20%20%20%20%20%20%20%20echo%20%22send%22%0A%20%20%20%20%20%20%20%20)%20%7C%20nsupdate%20-k%20%24KEY_FILE%20-v%20-d%20%20%3E%2Fdev%2Fnull%202%3E%20%24ERR_FILE%0A%20%20%20%20%20%20%20%20if%20%5B%20%24%3F%20-ne%200%20%5D%3B%20then%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20sortie%201%0A%20%20%20%20%20%20%20%20else%0A%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20%20echo%20%24CUR_IP%20%3E%20%24LAST_IP_FILE%0Afi%0A%20%20%20%20%20%20%20%20sortie%200%0Afi” message=”” highlight=”” provider=”manual”/]

Ce script provient de François Grange, je l’ai juste modifié un peu à ma sauce et l’ai commenté un peu plus, histoire que les néophyte du bash le comprenne.

Tout ce que vous avez besoin de modifier, ce sont les lignes ADMIN, ZONE, RR, LAST_IP_FILE, ERR_FILE, KEY_FILE, TMP_FILE. Voici à quoi correspondent ces variable :

  • ADMIN : adresse mail de l’administrateur
  • ZONE : nom de domaine principal. Ne pas indiquer le sous-domaine ici.
  • RR : le sous-domaine. On récupère le nom de domaine principal via la variable “$ZONE”, vous n’avez donc besoin de modifier que le début du sous-domaine.
  • LAST_IP_FILE, ERR_FILE, KEY_FILE, TMP_FILE : chemin complet, respectivement, du fichier de la dernière IP envoyée, du fichier d’erreur, de la clé privée et du fichier de log temporaire. J’ai mis tous ces fichiers dans mon home car je souhaite que ce soit mon utilisateur qui exécute ce script mais vous pouvez mettre ces fichiers là où vous le souhaitez (il faut quand même que l’utilisateur qui va exécuter le script y ait accès).
    Ces fichiers seront créés lors de l’exécution du script, pas besoin de les créer vous-même.

Pour résumer, ce script va récupérer l’adresse IP publique, vérifier si elle est différente de la dernière envoyée au serveur DNS et, si c’est le cas, envoyer la nouvelle IP publique au serveur DNS afin qu’il mette à jour le sous-domaine. Une fois la mise à jour faite avec succès, un mail contenant l’ancienne et la nouvelle IP publique sera envoyé à l’admin.
Si la dernière IP envoyée est identique à l’IP publique récupérée, le script se termine sans faire de mise à jour DNS.
Si une erreur est détectée lors de la mise à jour, un mail sera envoyé à l’admin avec le fichier d’erreur en pièce jointe.

Pour récupérer l’adresse IP, je passe par un service maison. Je la récupère grâce à une page php que j’ai uploadée sur le site et qui contient le code suivant :
<?php print $_SERVER['REMOTE_ADDR'] ?>
Cette page renvoie l’adresse IP publique du PC qui l’affiche. C’est comme ça que je renseigne la variable CUR_IP dans le script avec la commande `wget -q -O - memodugeek.info/monip.php`. Vous pouvez soit utiliser la page hébergée sur mon serveur, soit en créer une et l’héberger sur votre serveur.

On va passer par cron pour lancer automatiquement ce script. Editez cron avec la commande crontab -e et ajoutez la ligne suivante :
*/10 * * * * /home/pi/update_ip/update_ip.sh. Sauvegardez puis quitter.
Le script va s’exécuter toutes les 10 minutes. Il faut bien entendu modifier le chemin du script.

Comme je le disais plus tôt, ce script envoi des mails, il faut donc que votre Raspberry puisse envoyer des mails. Si ce n’est pas le cas, je vous conseille ssmtp qui permet d’envoyer des mails en passant par le serveur smtp de votre choix (le votre ou celui de votre FAI par exemple).

Pour l’installer, lancez la commande sudo aptitude install ssmtp mailutils mpack . Une fois installé, vous pouvez le configurer en éditant le fichier /etc/ssmtp/ssmtp.conf. Voici à quoi ressemble le mien qui utilise le serveur SMTP installé sur mon serveur OVH :

[pastacode lang=”bash” manual=”%23%0A%23%20Config%20file%20for%20sSMTP%20sendmail%0A%23%0A%23%20The%20person%20who%20gets%20all%20mail%20for%20userids%20%3C%201000%0A%23%20Make%20this%20empty%20to%20disable%20rewriting.%0Aroot%3Dadmin%40memodugeek.info%0A%0A%23%20Nom%20d’utilisateur%20du%20compte%20email%20avec%20lequel%20vous%20envoyez%20les%20courriels%0AAuthUser%3Didentifiantducomptemail%0A%0A%23%20Mot%20de%20passe%20de%20ce%20m%C3%AAme%20compte%0AAuthPass%3Dmotdepasseducomptemail%0A%0A%23%20The%20place%20where%20the%20mail%20goes.%20The%20actual%20machine%20name%20is%20required%20no%0A%23%20MX%20records%20are%20consulted.%20Commonly%20mailhosts%20are%20named%20mail.domain.com%0Amailhub%3Dadresseduserveurmail%3Aportutilis%C3%A9%0A%0A%23%20Where%20will%20the%20mail%20seem%20to%20come%20from%3F%0ArewriteDomain%3Dmemodugeek.info%0A%0A%23%20The%20full%20hostname%0Ahostname%3Draspberrypi%0A%0A%23%20Are%20users%20allowed%20to%20set%20their%20own%20From%3A%20address%3F%0A%23%20YES%20-%20Allow%20the%20user%20to%20specify%20their%20own%20From%3A%20address%0A%23%20NO%20-%20Use%20the%20system%20generated%20From%3A%20address%0AFromLineOverride%3DYES%0A%0A%23%20Utilisation%20d’une%20connexion%20s%C3%A9curis%C3%A9e%20SSL%2FTLS%20(d%C3%A9commenter%20pour%20activer)%0AUseSTARTTLS%3DYES%0A” message=”” highlight=”” provider=”manual”/]

J’ai retiré les informations sensibles, mais ça vous permettra de comprendre comment le configurer.

Désormais, votre sous-domaine va pointer vers l’IP publique de votre Raspberry sans que vous ne soyez dépendant d’un service tiers comme no-IP ou dyndns 😉

 

Sources :

http://tavie.onsenfout.com/2012/04/04/dns-dynamique-securise-avec-nsupdate-et-bind9/
https://jpmens.net/2010/09/28/performing-dynamic-dns-updates-on-your-dns/
https://doc.ubuntu-fr.org/ssmtp

2 réponses pour “IP dynamique et DNS”

  1. Ping : Certificats SSL wildcard avec Let's Encrypt

  2. Ping : Sauvegardes à distance avec BackupPC - Memo du Geek

Laisser un commentaire

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.