Ce NAS de marque Synology est mien depuis bientôt un an. Utilisé tout d'abord exclusivement en local, je l'ai progressivement ouvert sur l'extérieur afin de mettre à disposition des contenus (accès ssh et sftp distants, sites Internet).

Cette ouverture sur l'Internet m'a rapidement obligé à m’intéresser aux moyens mis à ma disposition pour pouvoir retrouver mon NAS malgré les changements d'IP de mon cablo opérateur du moment.

À ce stade là, il est important de préciser que Synology, au travers de son logiciel DSM (Disk Station Manager, qui est l'interface de gestion du NAS), supporte nativement le DDNS (Dynamic DNS). Cette fonction est supportée pour un large panel de services et permet même de s'inscrire à l'un d'entre eux. Une image valant mieux qu'un long discours :

DDNS Services proposés

Cette solution pourra sans aucun doute satisfaire un grand nombre d'usagers.

Mon cas reste cependant marginal pour deux raisons :

  • Je souhaite disposer d'un Nom De Domaine personnel que j'ai déjà enregistré
  • Je veux éviter de passer par des organismes externes parce que je suis de nature méfiant, et que j'estime qu'on apprend en mettant les mains dans le cambouis !

C'est précisément là que ça se complique un peu. Mon nom de domaine est enregistré chez OVH : service proposant les DNS dynamiques au travers d'une solution nommée "DynHost", mais qui n'est pas supportée nativement par les NAS Synology.

La documentation OVH, bien qu'existante, est relativement pauvre et nous remet donc sur le droit chemin : celui de la recherche et de l'expérimentation.

C'est ainsi que je suis tombé sur plusieurs très bons articles traitant respectivement de l'utilisation de l'utilitaire updatedd dans sa version 2.6. Cet utilitaire est d'ailleurs suggéré par OVH mais les liens pour se le procurer sont morts ...

Modifications récentes : suite à une excellente remarques postée en commentaire par Ancalagon79, je vais vous proposer deux solutions.

  • La première solution est celle originellement décrite par cet article et est la plus complexe à mettre en oeuvre; elle est cependant totalement personnalisable et permet de gérer plusieurs domaines.
  • La seconde solution exploite le mécanisme existant de base sur les NAS Synology : elle ajoute un service "OVH" dans la liste des DDNS de DSM. Cette solution est bien plus rapide à mettre en place et n'a qu'un seul inconvénient : elle ne notifie pas par mail lors d'un changement d'adresse IP.

Vous l'aurez compris, je conseil la seconde solution à tout ceux qui n'ont qu'un besoin fonctionnel. La première aura l'avantage de vous faire bricoler et comprendre quelques mécanismes de votre NAS.

Trêve de bavardages, c'est parti !

Prérequis généraux

Pour pouvoir mettre en oeuvre ce qui suit, vous devez disposer des éléments suivants :

  • Un nom de domaine hébergé chez OVH
  • Un Dynhost chez OVH pointant sur un domaine ou sous-domaine de votre choix

Première solution : Updatedd

Installation des logiciels nécessaires

Avant toute chose, il faut disposer de ipkg (un gestionnaire de paquets) sur son NAS Synology. L'installation est expliquée sur le wiki Synology.

Pour pouvoir compiler, vous aurez besoin de GCC sur votre NAS. Pour l'insaller, lancez la commande suivante en tant qu'administrateur :

ipkg install gcc

De plus, il vous faudra Bash afin d'avoir accès à des fonctions dont les NAS Synology ne disposent pas de base (utilisent "ash") :

ipkg install bash

Enfin, dernier pré-requis pour le script, l'installation de updatedd 2.6 à partir des sources logicielles. Un très bon tutorial est disponible sur le blog de Romain THERRAT.

Ce blog propose d'ailleurs un script dont l'objectif est le même que le mien, et qui m'a servi de base. Merci à lui !!

Fonctionnalités apportées

Le script proposé par Romain THERRAT fait l'essentiel : la mise à jour de l'adresse IP ainsi que le log des informations essentielles. J'ai cependant amélioré quelques points :

  • changement de la méthode d'obtention de l'IP pour favoriser les fonctions de base ;
  • vérification de la validité de l'IP (peut-être nulle ou un retour HTML pour signaler une erreur) ;
  • envoie de mails en cas de changement de l'IP ou d'erreur

Ce dernier point doit retenir notre attention car utilise "Synomail" : un service inclue sur les Synology.

Présentation et fonctionnement de Synomail

L'envoi des mails passe donc par l'utilitaire inclue dans Synology : synomail. Ce service permet d'envoyer un courriel tout en mettant une notification dans le DSM, le site de gestion des NAS Synology. À chaque mise à jour de DSM, le fichier contenant les templates de mails est réinitialisé. Aussi, mon script contourne cette limitation en modifiant à la volée le fichier de templates pour qu'il contienne nos courriels que pendant le temps d’exécution du script. L'autre intérêt de synomail est qu'il est présent de base; attention toutefois à bien configurer les paramètres d’envoi de mail via le DSM.

Son utilisation se fait par l'intermédiaire de l'appel au binaire selon la forme :

/usr/syno/bin/synomail LABEL_MAIL

"LABEL_MAIL" correspond à un identifiant de template qui doit apparaître dans le fichier "/usr/syno/synoman/webman/texts/fre/mails". Ce fichier contenant l'ensemble des mails que peut vous envoyer votre NAS Synology.

Vous pouvez ajouter des templates à la fin de ce fichier en vous basant sur l'exemple suivant (template portant le label "AutoBlockAdd") :

[AutoBlockAdd]
Subject: L'adresse IP [%CLIENT_IP%] a été bloquée

Cher utilisateur, chère utilisatrice,

L'adresse IP [%CLIENT_IP%] a eu %AUTOBLOCK_ATTEMPTS% échecs de tentatives $

Cordialement,
%COMPANY_NAME%


Vous noterez qu'il est possible d'utiliser des variables Synology ("%COMPANY_NAME%" par exemple). L'utilisation de paramètres n'est pas prise en compte mais peut se contourner en renseignant le fichier "mails" à la volée comme dans le script que j'ai fait.

Le script en lui-même

Ci-dessous, le script en lui-même avec commentaires. À noter qu'il faut remplacer certaines variables par vos identifiants DynHost de chez OVH (user, password, domain). Vous pouvez le télécharger ici.

#!/opt/bin/bash
 
## CONFIGURATION POUR DYNHOST OVH ##
 
# Connection vers le DynHost OVH
username=XXXXX				# Identifiant du compte DynHost
password=*****				# Mot de passe du compte DynHost
host=XXX.XX					# Le domaine sur lequel est notre DynHost
 
# Variables pour les fichiers de log
# 1 = true, 0 = false
log_change=1
log_no_change=0
log_file=/var/log/dynhost.log
log_cron_file=/var/log/dynhost_cron.log
 
# Variables pour l'envoi de courriel
# 1 = true, 0 = false
mail_change=1
 
# Fichier temporaire utilisé
tmp_file=/tmp/ovh_update.tmp
 
# Fichier contenant l'ancienne IP publique connue
old_ip_file=/var/cache/ip_old
 
# Pour éviter l'erreur "file not found"
touch ${old_ip_file}
touch ${log_file}
 
 
# Récupère l'IP publique de la machine
ip=""
ip_good=0
it_number=0
while [ $ip_good = 0 -a ${it_number} -lt 10 ]
do
ip=`curl ifconfig.me`
it_number=$((${it_number}+1))
# Vérifie la structure de l'IP
if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]
then
ip_good=1
else
ip_good=0
fi
# Si l'IP est mauvaise, on attend 1 minute avant de boucler
if [ $ip_good = 0 -a ${it_number} -lt 10 ]
then
sleep 60
fi
done
# Une IP valide a été trouvée
if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]
then
# Récupère l'ancienne IP publique
ip_old=`cat ${old_ip_file}`
 
# Compare l'ancienne IP et la nouvelle
if [ "${ip}" = "${ip_old}" ]
then
# Les IP sont les mêmes : aucun changement
if [ "${log_no_change}" = "1" ]
then
echo `date`: No IP change was found >> ${log_file}
fi 
else
# L'IP a changé
# On écrit la nouvelle IP dans le fichier contenant l'IP
echo ${ip} > ${old_ip_file}
 
# Si on a demandé à recevoir un mail lors du changement d'IP
if [ "${mail_change}" = "1" ]
then
# Sauvegarde du fichier mails
cp /usr/syno/synoman/webman/texts/fre/mails /volume1/@script/mails.bck
 
# On créé notre mail
echo "
[PublicIPChange]
Subject: L'adresse IP publique sur %HOSTNAME% a changé
 
Cher utilisateur, chère utilisatrice,
 
L'adresse IP publique sur %HOSTNAME% a changé : veuillez prendre les mesures appropriées.
 
Ancienne adresse IP publique : ${ip_old}
Nouvelle adresse IP publique : ${ip}
 
Cordialement,
%COMPANY_NAME%" >> /usr/syno/synoman/webman/texts/fre/mails
 
# On envoi le mail
/usr/syno/bin/synomail PublicIPChange
fi
 
# On log le changement si demandé et on contact OVH pour communiquer l'IP
# On redirige la sortie d'erreur vers un fichier temporaire
if [ "${log_change}" = "1" ]
then
echo "`date`:IP has change. (Old : ${ip_old}, New : ${ip})" >> ${log_file}
fi
 
updatedd ovh -- --ipv4 ${ip} ${username}:${password} ${host} > ${tmp_file} 2>&1
 
 
# On récupère le contenu du fichier temporaire
updatedd_error=`cat ${tmp_file}`
if [ "${updatedd_error}" != "" ]
then
# On a une erreur signalée par ovh, on envoie un mail la signalant
# On crée notre mail
echo "
[UpdateddError]
Subject: Erreur de Updatedd sur %HOSTNAME%
 
Cher utilisateur, chère utilisatrice,
 
Erreur de mise à jour dynamique du DNS sur %HOSTNAME% : veuillez prendre les mesures appropriées.
 
Message d'erreur : '${updatedd_error}'
 
Cordialement,
%COMPANY_NAME%" >> /usr/syno/synoman/webman/texts/fre/mails
 
# On envoi le mail
/usr/syno/bin/synomail UpdateddError
fi
fi
else
# Erreur : IP publique non récupérée
echo "`date` : impossible de récupérer l'IP publique" >> ${log_file}
# Envoi d'un mail
echo "
[GetPublicIPError]
Subject: Erreur de récupération de l'IP publique sur %HOSTNAME%
 
Cher utilisateur, chère utilisatrice,
 
Erreur lors de la récupération de l'IP publique sur %HOSTNAME% : veuillez prendre les mesures appropriées.
 
Cordialement,
%COMPANY_NAME%" >> /usr/syno/synoman/webman/texts/fre/mails
 
# On envoi le mail
/usr/syno/bin/synomail GetPublicIPError
fi
if [ "${mail_change}" = "1" ]
then
# On restaure le fichier mails initial
cp /volume1/@script/mails.bck /usr/syno/synoman/webman/texts/fre/mails
fi
# On logue l'execution du cron
echo "`date`" >> ${log_cron_file}

Configuration d'une tâche cron

Tout l'intérêt de ce script passe par son exécution régulière sur le NAS. Ceci afin de pouvoir détecter un changement d'adresse IP qui peut intervenir n'importe quand.

Pour se faire, il faut placer le script dans un répertoire connu (par exemple "/usr/local/bin" comme le suggère Romain THERRAT) puis configurer le cron.

Cette configuration se fait au travers du fichier "/etc/crontab". L'édition se fait via le logiciel "vi" ou "nano" selon vos goûts. Il suffit alors d'ajouter une ligne sous la forme :

0       *       *       *       *       root    /usr/local/bin/ovh_update >> /var/log/dynhost_cron.log

Concrétement cette ligne permet d’exécuter le script "ovh_update" en tant que root toutes les heures et de rediriger la sortie standard vers le fichier "dynhost_cron.log".

Après avoir ajouté cette ligne, relancez le processus cron en tant qu'administrateur :

/usr/syno/etc.defaults/rc.d/S04crond.sh stop
/usr/syno/etc.defaults/rc.d/S04crond.sh start

Merci à Stef pour son article sur ces tâches Cron sur les NAS Synology.

Conclusion de la première solution

Voilà, votre NAS devrait maintenant être à même de mettre à jour l'IP pointée par votre domaine.

Lors d'une mise à jour de l'IP, un mail vous sera envoyé et une notification apparaîtra dans DSM !

Synomail

Seconde solution : DDNS du DSM

Modifications des fichiers système

Cette solution consiste à modifier deux fichiers systèmes. Pour se faire, connecter vous en SSH à votre NAS en utilisant un compte administrateur (root ou un sudo user, à votre guise).

Il s'agit tout simplement d'éditer les deux fichiers suivant pour y ajouter un fournisseur de service : (édition via "vi" par exemple) :

  • /etc/ddns_provider.conf
  • /etc.defaults/ddns_provider.conf

Éditez alors chacun de ces deux fichiers en suivant les instructions suivantes :

vi [chemin_fichier]

Placez-vous en fin de fichier puis pressez la touche "i" pour entrer en mode d'insertion. Saisissez (ou coller) les lignes suivantes :

[Ovh]
       modulepath=DynDNS
       queryurl=www.ovh.com/nic/update?system=dyndns&username=__USERNAME__&password=__PASSWORD__&hostname=__HOSTNAME__&myip=__MYIP__

Vous remarquez que comme lors de la précédente solution, nous nous basons sur le module DynDNS qui semble être le modèle utilisé par OVH pour ses DynHost. Sauvegardez la modification en saisissant "Échap" puis ":" et enfin "wq" puis la touche "Entrée" pour valider.

Saisie des identifiants DDNS

Désormais, un nouveau DDNS est disponible depuis votre DSM :

DDNS avec OVH

Il ne vous reste plus qu'à indiquer vos identifiants DynHost pour en profiter.

Conclusion de la seconde partie

Ayant désormais une adresse IP fixe, je n'ai pas eu l'occasion de tester en profondeur le comportement de cette solution. Cependant, elle rempli à merveille son rôle en mettant à jour l'IP pointé par la zone DynHost de OVH et c'est bien l'essentiel.

Mise à jour: cette seconde solution est écrasée lors des mises à jour du DSM; pour résoudre ce problème, vous pouvez suivre cet autre article.

Merci de votre lecture

Cet article n'est pas exhaustif; il n'aborde pas la configuration d'une DynHost dans votre espace client OVH par exemple. Ce sera peut-être l'objet d'un futur article.

En cas de problème, ou tout simplement pour me faire part de vos remarques et impressions, n'hésitez pas à poster un commentaire.