Lorsqu'on se lance dans l'aventure du home server, on se retrouve bien vite confronté au problème de l'IP changeant régulièrement. Le première réponse à ça fut bien vite le service Dyndns.
Avec l'arrivée d'un nom de domaine, je voulais quelque chose de plus "propre", me voila donc parti pour le service DynHost de chez OVH.
La documentation concernant DynHost sur le site OVH est assez incomplète, mais on y trouve tout de même un script intéressant, la partie concernant Ipcheck.py.
Dans cette version du script, fourni par OVH, la ligne Updatehost à déjà été modifiée.
Mais le problème se situe dans le script sh dynhost. En effet, il va chercher l'adresse locale de la machine et non l'adresse publique.
IP=`/sbin/ifconfig $IFACE | fgrep "inet ad" | cut -f2 -d":" | cut -f1 -d" "`
En ce qui me concerne, je me trouve derrière une neufbox, la solution la plus répandue est d'interroger un site du style checkip.dyndns.org pour en extraire l'adresse IP publique.
Afin de ne pas faire appel inutilement à un serveur distant pour une info que j'ai déjà chez moi, j'ai choisi d'interroger directement la neufbox à ce sujet.
IP=`wget http://192.168.1.1/0_0 && cat 0_0 | grep ".[0-9]{1,3}" | cut -d '<' -f 2 | cut -d ' ' -f 2 && rm -f 0_0`
Pour expliquer un peu cette commande, on télécharge la page d'accueil de la neufbox, qui affiche notre adresse IP publique.
wget http://192.168.1.1/0_0
On recherche la ligne concernant l'affichage de l'IP.
grep ".[0-9]{1,3}"
On utilise ensuite la commande cut pour couper la chaine de caractère et garder uniquement l'adresse IP.
cut -d '<' -f 2 | cut -d ' ' -f 2
Cette méthode devrait pouvoir être appliquée à toutes les box du marché.
Le script ainsi modifié va cherché l'adresse IP publique et met à jour votre champ dynhost avec cette adresse, seulement si elle a changé.
Le second problème que m'a posé ce script est qu'il utilise, par défaut, des chemins relatifs. Après avoir placé le script dans un dossier, histoire de faire les choses proprement, le script n'exécutait plus ipcheck.py, car il ne le trouvait tout simplement pas.
Il est donc plus prudent d'indiquer les chemins absolus dans le script.
Le script complet, modifié par mes soins:
#! /bin/sh # OVH - DynHost # # Permet de mettre à jour le champ DYNHOST # pour votre nom de domaine. # La mise à jour ne se fait que si l adresse IP # a effectivement changé. # Fichier de log: dynhost.log # Mod par Maniack Crudelis HOST='nom_domaine' LOGIN='login' PASSWORD='password' OPTIONS="-l -v" #-l = log; -v = verbose LOCALPATH=.../DynHost # Obtention de l adresse IP actuelle et celle enregistrée lors du dernier changement IP=`wget http://192.168.1.1/0_0 && cat 0_0 | grep ".[0-9]{1,3}" | cut -d ' $LOCALPATH/last_dynhost.log echo `date` >> $LOCALPATH/last_dynhost.log echo Démarrage de DynHost >> $LOCALPATH/last_dynhost.log echo -n "Ancienne IP: " >> $LOCALPATH/last_dynhost.log echo $OLDIP >> $LOCALPATH/last_dynhost.log echo -n "Nouvelle IP: " >> $LOCALPATH/last_dynhost.log echo $IP >> $LOCALPATH/last_dynhost.log echo "Mise à jour!" >> $LOCALPATH/last_dynhost.log echo "Lancement de ipcheck.py" >> $LOCALPATH/last_dynhost.log cd $LOCALPATH && python ipcheck.py $OPTIONS -a $IP $LOGIN $PASSWORD $HOST >> $LOCALPATH/last_dynhost.log cat $LOCALPATH/last_dynhost.log >> $LOCALPATH/dynhost.log else echo IP Identique! #Pour ne pas surcharger le log, si l ip ne change pas, log de la dernière execution seulement echo `date` > $LOCALPATH/last_dynhost.log echo Démarrage de DynHost >> ~$LOCALPATH/last_dynhost.log echo IP identique, pas de changement. Pas d appel à ipcheck. >> $LOCALPATH/last_dynhost.log fi else echo ---------------------------------- > $LOCALPATH/last_dynhost.log echo `date` >> $LOCALPATH/last_dynhost.log echo Démarrage de DynHost >> $LOCALPATH/last_dynhost.log echo Panique à bord: Aucune IP Disponible!! >> $LOCALPATHt/last_dynhost.log cat $LOCALPATH/last_dynhost.log >> $LOCALPATH/dynhost.log fi
Le script doit maintenant être exécuté régulièrement, pour cela on ajoute une tâche au crontab.
crontab -e */5 * * * * 'chemin de dynhost'/DynHost/dynhost > /dev/null
Le script sera ainsi exécuté toutes les 5 minutes, en cas de changement de l'adresse publique du serveur, le champ dns sera immédiatement mis à jour.
Comments
Leave a Reply
Maniack Crudelis on 02.26.2011
Arg désolé pour le commentaire qui avait été posté! Des soucis avec le wordpress du site qui m'ont obligé à jongler avec les bases de données, et une fausse manip plus tard, un commentaire est passé à la trappe.
Je vais quand même y répondre, la question était de savoir si Dynhost renseignait un champ A ou un CNAME. D'après OVH, le champ DynHOST est un champ A avec une IP dynamique.
Dans la pratique, c'est un champ A pour lequel on donne une IP, mais nécessitant un couple login/mdp pour être mis à jour depuis un client distant.
Ensuite c'est surtout ipcheck qui fais le travail, je sais notamment qu'il peut renseigner un champ MX, il faut fouiller l'aide du script et le code pour en savoir plus.
Etienne on 02.27.2011
Super,
merci pour la réponse !
Oui y'avait eu un petit souci quand j'ai poste le commentaire, et quand j'ai voulu le reposter WP me disait que j'avais déjà poste ce même commentaire...
Enfin bref, merci, je peux donc transférer mon domaine chez Gandi.
Je modifierais ton script pour y ajouter l'envoi d'un mail au moment de la mise a jour, et je te le reposterais.
Yann on 05.25.2011
Bonjour!
Je me heurte actuellement à des problèmes de DynHost avec OVH et j'essaie justement d'utiliser ce script.
Voici l'erreur retournée par le script dans dyndns.log:
ipcheck.py: opt_address set to xx.xx.xx.xx
ipcheck.py: opt_username = ruincorp.com-rsi
ipcheck.py: opt_password = *******
ipcheck.py: opt_hostnames = rsi.ruincorp.com
ipcheck.py: manually setting localip
ipcheck.py: Good, no ipcheck.err file.
ipcheck.py: Good, no ipcheck.wait file.
ipcheck.py: Checking hosts in file vs command
line.
ipcheck.py: rsi.ruincorp.com needs updating
ipcheck.py: Prefix = /nic/update?system=dyndns&hostname=
ipcheck.py: Hosts = rsi.ruincorp.com
ipcheck.py: Suffix = &myip=xx.xx.xx.xx&wildcard=OFF&backmx=NO
ipcheck.py: http code = 500
ipcheck.py: http msg = Internal Server Error
ipcheck.py: ipcheck.html file created
ipcheck.py: Dyndns 999 result. Dyndns emergency shutdown.
ipcheck.py: ipcheck.err file created.
Savez-vous d'où ça peut venir??
Merci d'avance 🙂
Yann
Maniack Crudelis on 05.26.2011
L'erreur 500 provient en principe du serveur OVH, non du script.
A la ligne 43 du script ipcheck.py, vérifie le nom du serveur, chez moi ça donne ça:
Dyndnshost = "www.ovh.com"
Pour forcer une mise à jour par le script, modifie le fichier ipcheck.dat et change l'IP, cela le forcera à mettre à jour sur le serveur OVH.
Pour ma part, après un essai, le
serveur OVH répond correctement.
A suivre...
yann on 04.22.2012
Merci pour l'info ! Ca marche pour moi également 😉
camel on 06.03.2012
Ca n'a pas marché correctement chez moi :-(. J'ai du modifier la regexp pour recuperer l'ip.
": [[:digit:]]{1,3}.[[:digit:]]{1,3}.[[:digit:]]{1,3}"
Aussi, j'utilise la commande egrep.
IP=`wget http://192.168.1.1/0_0 && cat 0_0 | egrep ": [[:digit:]]{1,3}.[[:digit:]]{1,3}.[[:digit:]]{1,3}" | cut -d '<' -f 2 | cut -d ' ' -f 2 && rm -f 0_0`
Faizan on 01.08.2013
solo> Pour ce qui est de la gestion de plusieurs nom de domaines sur un seul hébergement, en effet seuls les hébergements "évolués" d'OVH le permettent mais il en est de même chez Celeonet. Quant aux sous-domaines, j'ai eu besoin d'en créer récemment. Cela se fait en quelques clics et ils sont disponibles sous quelques minutes. A vrai dire j'ai été surpris de la facilité avec laquelle je les ai mis en place. Il faut préciser qu'il s'agissait de sous-domaines pointant vers des virtuals hosts distant et non
vers des répertoires de l'hébergements. Cela doit contribuer à simplifier la chose.