Mise à jour de votre DNS chez OVH avec DynHost

Merci d’aller voir l’article sur mon nouvel hébergement, l’article et le script y sont plus à jour : http://zwindler.fr/wordpress/2014/09/22/mise-a-jour-de-votre-dns-chez-ovh-avec-dynhost/



[Edit] Mis à jour le 06/10 suite à des petits soucis avec le fichier oldip [/Edit] Pour ceux qui n’ont pas la chance d’avoir une IP fixe pour leur besoins d’auto-hébergement et qui disposent d’un domaine chez OVH, vous avez plusieurs solutions pour continuer à héberger vos sites et vos services chez vous (comme l’indispensable serveur minecraft de vos collègues ou le serveur web des dernières photos récupérées sur iCloud). La plus simple est d’utiliser le client DynDNS ou No-IP de votre routeur ou de votre totobox. Dans mon cas (Orange), les Livebox proposent effectivement ce genre de clients, mais on les retrouve aussi sur des routeurs Linksys ou autre. Malheureusement pour nous pauvres autohébergeurs, les solutions anciennement gratuites DynDNS et No-IP se sont considérablement réduites, et il faut souvent payer à partir d’un certain nombre de sous-domaines. Pour éviter de devoir payer (c’est une idée fixe un peu chez moi), une solution alternative consiste lorsqu’on a beaucoup de sous domaines à créer des CNAME qui pointent tous vers le même nom de domaine DynDNS du type :

  • sousdomaine1.mondomaine.com IN CNAME mondomaine.dyndns.org
  • sousdomaine2.mondomaine.com IN CNAME mondomaine.dyndns.org

Dans le principe c’est parfait. Dans la pratique, j’ai rencontré quelques difficultés dans la mise à jour de l’IP et les caches DNS de mes clients. J’ai donc profité du fait que j’étais en train de bidouiller sur le sujet pour tester les solutions offertes par OVH (DynHost). Car oui, OVH vous propose de faire ça « vous même » : http://guide.ovh.com/DynDns ! L’idée ici est de créer depuis le manager un champ de type DynHost ainsi qu’un compte sur le service en ligne éponyme, puis d’installer un petit soft sur un serveur ou une VM dans votre LAN. Ce client va régulièrement vérifier que vous n’avez pas changé d’IP et mettre à jour le cas échéant le DNS chez OVH via le compte DynHost. La boucle est bouclée et sur le papier c’est parfait. D’autant plus qu’OVH liste un client Linux Ipcheck.py et vous guide pas à pas avec un tutoriel. C’est bien les exemples, ça m’évite de devoir lire le MAN (fainéant!). Pour pousser le vice à l’extrême, tout ce qu’il vous faut est même prépackagé dans l’archive DynHost.tgz gracieusement mise à disposition par OVH (ou plutôt bozorokus.net ? J’espère qu’il est au courant 😉 ). Il ne vous reste plus qu’à lancer le script dynhost périodiquement dans la crontab. Génial ! Génial ? A y regarder de plus près, on se rend vite compte qu’il manque un bout… La première chose que j’ai faite, c’est récupérer cette fameuse archive sans rien lire, la décompresser dans /usr/local, puis regarder comment il fallait modifier dans les variables du script pour le faire marcher dans mon contexte (login, mdp, …) :

  • IFACE : l’interface réseau sur laquelle est activée votre connexion Internet
  • HOST : le champ DynHOST que vous avez créé depuis votre manager pour votre nom de domaine
  • LOGIN : Votre identifiant DynHOST
  • PASSWORD : le mot de passe associé à l’Identifiant

HOST, LOGIN, PASSWORD, pas de soucis. Par contre, IFACE? l’interface réseau sur laquelle est activée votre connexion Internet? ppp0? Oula oula… ya erreur sur la marchandise ! L’adresse IP de mon serveur, c’est une adresse dans mon LAN perso (192.168.X.X/24), ce n’est pas du tout l’adresse WAN ! Et c’est pourtant bien celle là qui m’intéresse. Visiblement, ce script est utile à ceux qui n’utilisent pas leur box comme routeur, mais comme un bon vieux modem pour un unique PC. Heureusement pour moi, le script dyndns est assez simple et facile à modifier pour l’adapter au contexte d’un réseau local domestique.Voici la ligne de code de la discorde :

IP=`/sbin/ifconfig $IFACE | fgrep "inet ad" | cut -f2 -d":" | cut -f1 -d" "

Ici, on récupère sans vergogne l’adresse IP de l’interface réseau concernée et on l’envoie sur Internet dans le champs DynHost renseigné dans votre DNS OVH. Et ça marche plutôt bien puisque j’ai retrouvé mon 192.168.X.X dans mon DNS OVH… même si ce n’est pas tout à fait ça que j’attendais ! Sans avoir besoin de réinventer la roue, un court passage sur StackOverflow m’a permis de remplacer la ligne précédente par une version plus adaptée à l’aide de curl

IP=`curl ifconfig.me`

C’est si simple que ça ? Et ben oui visiblement. Curl, c’est magique… Il va falloir que je passe du temps sur Curl ! Mais ce n’est pas tout ce qu’on peut améliorer. Pour éviter de mettre à jour trop souvent le DNS lorque ce n’est pas nécessaire, le script commence par vérifier si l’IP a changée en gardant en mémoire l’ancienne IP dans un fichier texte et en réalisant une simple comparaison. Cette méthode simple a pourtant ses limites. Si pour une raison ou pour une autre, la mise à jour du DNS se passe mal, le fichier est mis à jour avec la nouvelle IP, et les appels futurs de la commande de mise à jour de l’IP n’iront plus mettre à jour le DNS, que l’on croit faussement à jour. Là encore, il ne manque pas grand chose, car plutôt que de comparer l’IP qu’on a « mise en cache local » dans le fichier old.ip, il suffit de réaliser une simple requête DNS sur votre dynhost. Ainsi, si votre IP publique correspond au dynhost, on ne touche à rien, par contre, dans le cas contraire, on met à jour. Tadam!

OLDIP=`dig +short $HOST`

Et la version complète

#! /bin/sh
# Mainly inspired by DynHost script given by OVH
#
# Initial version was doing  nasty grep/cut on local ppp0 interface
#
# This coulnd't work in a NATed environnement like on ISP boxes
# on private networks.
#
# This script uses curl to get the public IP, and then uses ipcheck
# to update DynHost entry in OVH DNS
#
# Logfile: dynhost.log

HOST=dynhost.votredomaine.com
LOGIN=VOTREDOMAINOVH-LOGIN
PASSWORD=VOTREMDP
OPTIONS=""
SCRIPT_PATH="/usr/local/DynHost"

getip() {
                IP=`curl ifconfig.me`
                OLDIP=`dig +short $HOST`
        }

######Main#####
        echo ---------------------------------- >> $SCRIPT_PATH/dynhost.log
        echo `date` >> $SCRIPT_PATH/dynhost.log
        echo "DynHost" >> $SCRIPT_PATH/dynhost.log
        getip

        if [ "$IP" ]; then
                if [ "$OLDIP" != "$IP" ]; then
                        echo -n "Old IP: " >> $SCRIPT_PATH/dynhost.log
                        echo $OLDIP >> $SCRIPT_PATH/dynhost.log
                        echo -n "New IP: " >> $SCRIPT_PATH/dynhost.log
                        echo $IP >> $SCRIPT_PATH/dynhost.log
                        echo "Update!" >> $SCRIPT_PATH/dynhost.log
                        if [ "$OPTIONS" = "" ]; then
                                OPTIONS="-a $IP"
                                echo "No option given, using '-a $IP'" >> $SCRIPT_PATH/dynhost.log
                        else
                                echo "option given : '$OPTIONS'" >> $SCRIPT_PATH/dynhost.log
                        fi

                        python $SCRIPT_PATH/ipcheck.py $OPTIONS $LOGIN $PASSWORD $HOST >> $SCRIPT_PATH/dynhost.log
                        echo -n "$IP" > $SCRIPT_PATH/old.ip
                else
                        echo "IP $HOST $OLDIP is identical to WAN $IP! No update required." >> $SCRIPT_PATH/dynhost.log
                fi
         else
                echo "WAN IP not found. Exiting!" >> $SCRIPT_PATH/dynhost.log
         fi

Un petit passage en crontab, et hop, mon dynhost.mondomaine.com se met à jour toutes les heures !

crontab -e
00 * * * * /usr/local/DynHost/dynhost
Publicités
Mise à jour de votre DNS chez OVH avec DynHost

Laisser un commentaire

Entrez vos coordonnées ci-dessous ou cliquez sur une icône pour vous connecter:

Logo WordPress.com

Vous commentez à l'aide de votre compte WordPress.com. Déconnexion / Changer )

Image Twitter

Vous commentez à l'aide de votre compte Twitter. Déconnexion / Changer )

Photo Facebook

Vous commentez à l'aide de votre compte Facebook. Déconnexion / Changer )

Photo Google+

Vous commentez à l'aide de votre compte Google+. Déconnexion / Changer )

Connexion à %s