Auto-hébergement et synchronisation : Problème d’URL

I. Présentation

L'auto-hébergement, notamment pour les solutions de stockage de fichiers de type "Cloud" est aujourd'hui assez répandue. Nous sommes nombreux à mettre en place, sur des Raspeberry Pi ou des NAS des solutions telles qu'Owncloud, CozyCloud ou Pydio pour se passer des services de géants tels que Microsoft ou Google, trop regardant sur nos données personnelles.

Si c'est votre cas et que votre solution est hébergée chez vous, vous avez sûrement rencontré le même problème que moi :

Lorsque vous êtes à l’extérieur de votre LAN, vous ciblez avec votre client de synchronisation une IP publique fixe, ou un système DynDNS, ou encore des systèmes DNS fournis par les constructeurs de NAS de type MyQNAPCloud.com ou Synology.me. Ceux-ci permettent, via la création d'un compte, d'avoir un système proche de celui du DynDNS afin de joindre son NAS a travers une IP publique dynamique

Cependant lorsque vous rentrez chez vous, vous souhaitez alors joindre votre NAS/ RaspberryPi avec son IP interne et non plus le système DynDNS ou le système DNS de votre NAS, c'est là qu'un problème se pose car il est difficile de changer dynamiquement la configuration du client de synchronisation à chaque fois

Nous allons donc voir ici ensemble une solution de contournement à ce problème basée sur un petit (vraiment petit) script.

Ce tutoriel a été réalisé avec l'environnement suivant :

  • un PC portable qui est parfois dans le LAN, parfois non
  • un NAS QNAP utilisant le système DNS 123123123.myqnapcloud.fr
  • Un service Owncloud présent sur ce NAS avec un client de synchronisation sur le PC portable

Le but est alors le suivant :

  • Lorsque je suis à l'extérieur, j'utilise de façon standard le système DNS fournis par MyQNAPCloud qui permet de joindre mon NAS, plus précisément l'Owncloud qui s'y situe avec mon client de synchronisation qui pointe vers 123123123.myqnapcloud.com
  • Lorsque je suis dans mon LAN, je sais le détecter et je change ma configuration DNS automatiquement afin de bypasser (passer outre) le système de résolution de QNAP qui indiquerait à mon client de synchronisation mon IP publique (alors que mon NAS est en local).

Pour plaire à tout le monde, je vais bien entendu vous proposer le même système à la fois sous Linux et sous Windows. Il est à noter que selon votre contexte, il sera à adapter. Si vous utilisez le système Synology plutôt que QNAP par exemple.

Il faut savoir que pour savoir si je suis dans mon LAN ou non, je me base sur la présence d'une page web, celle-ci doit donc être unique à votre LAN. Ce n'est en soit pas très difficile à faire. Positionnez par exemple une page http://IPserveur/32542354254287425772.html sur votre serveur afin d'être certains que vous ne la trouverez dans aucun autre environnement. Pour ma part, je vise simplement la page d'accueil de mon NAS QNAP (son IP est 192.168.1.2 en local). Voici le déroulement du script :

auto-hebergement-probleme-url-01
Ce script sera donc exécuté à chaque démarrage, par exemple 2 minutes après le boot pour nous laisser le temps de trouver une IP et un accès au réseau. Ainsi, on pourra dynamiquement changer l'enregistrement DNS pour que notre client de synchronisation, utilisant toujours le même nom DNS, arrive sur l'IP privée ou publique de notre NAS ou autre solution d'hébergement.

II. Script Sous Windows : Powershell

Voici le script en question en Powershell :

$web = [net.webRequest]::Create("http://192.168.1.2:8080/cgi-bin")
$web.GetResponse()

if ( $? -eq "True")
    {Add-Content C:\Windows\System32\drivers\etc\hosts "192.168.1.2 123123123.myqnapcloud.com"}
else
    {(Get-Content C:\Windows\System32\drivers\etc\hosts) -notmatch "123123123" | Out-File C:\Windows\System32\drivers\etc\hosts}

Ici, on récupère donc une page qui ne pourra se trouver que sur notre LAN, cela peut être une page créée pour l'occasion. Pour ma part, je vise simplement l'IP de mon NAS. On utilise "Get.Response()" pour effectuer notre requête. Si la commande aboutie, la variable d'environnement "$?" (qui fonctionne de façon similaire sous Windows et sous Linux) retournera "True", sinon cela causera une erreur et la "$?" vaudra "False". On pose donc notre condition en conséquence.

Si je suis dans mon LAN ($? = True), j'ajoute dans le fichier "hosts" l'enregistrement de l'IP locale pour le domaine visé par mon client de synchronisation.

Sinon, je supprime les enregistrement dans mon fichier "hosts" concernant cet enregistrement. On peut naturellement modifier ce script pour switcher entre IP publique fixe et une IP locale par exemple.

Vous pourrez donc stocker ces lignes dans un fichier au format .ps1 puis l'exécuter au besoin. Il est important d'exécuter ce script en tant qu'administrateur car il est le seul habilité à modifier le fichier hosts.

C:\Windows\System32\drivers\etc\hosts

III. Script Sous Linux : Bash et Cron

Pour les personnes comme moi disposant d'un environnement Linux, voici le script que j'utilise :

#!/bin/bash
# Vérifier si l'on se situe dans notre LAN.
# Je récupère le code HTTP d'une page située sur un élément de mon LAN (mon NAS)
command=$(curl -o /dev/null --silent --head --write-out '%{http_code}\n' http://192.168.1.2:8080/cgi-bin/)

# Si l'élément répond, je suis dans mon LAN donc je bypass la résolution DNS par l'IP interne
if [[ $command -eq "200" ]];then
    echo "192.168.1.2 123123123.myqnapcloud.com"  >> /etc/hosts
# Sinon, je laisse le système de résolution de QNAP faire le travail DNS
else
    sed -i '/123123123/d' /etc/hosts
fi

Ici, on utilise la commande "curl'" pour récupérer le code HTTP retourné par la page spécifique à notre LAN. Si le code retourné est "200", cela signifie que l'on est dans le LAN, on peut donc utiliser notre fichier hosts local pour résoudre le domaine de notre NAS ou DynDNS. Sinon, on supprime tout enregistrement concernant ce domaine présent dans notre fichier hosts. Il est important que ce soit "root" qui fasse tourne ce script car il est le seul habilité à modifier le fichier /etc/hosts

Je l'ai stocké dans /root/Documents/scripts/ et l'ai noblement nommé Owncloudconnect.sh. En tant que root, on utilisera ensuite la commande "crontab -l" pour y ajouter la ligne suivante :

@reboot sleep 120 && /root/Documents/scripts/Owncloudcorrect.sh

Celle-ci permettra, 2 minutes après chaque reboot, l'exécution automatique du script. Vous n'aurez alors plus rien à faire ! 🙂

Partagez cet article Partager sur Twitter Partager sur Facebook Partager sur Linkedin Partager sur Google+ Envoyer par mail

Mickael Dorigny

Co-fondateur d'IT-Connect.fr. Auditeur/Pentester chez Orange Cyberdéfense.

Nombre de posts de cet auteur : 527.Voir tous les posts

One thought on “Auto-hébergement et synchronisation : Problème d’URL

  • Bonsoir,

    Pour ma part j’utilise un DNS interne (plus précisément un DNS Proxy sur mon FW) dans le LAN qui résout le domaine en question sur l’adresse IP locale.
    C’est pratique comme système car cela permet de se connecter sur le serveur depuis toute machine sur le LAN y compris téléphone sans pré-configuration.
    A moins que QNAP ou Synology intègre un mini serveur DNS (je ne connais pas bien), il est nécessaire d’ajouter un DNS sur son réseau si on veut utiliser cette technique 🙂

    Répondre

Répondre à Dginio Annuler la réponse

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

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