Mise a jour des DNS de Gandi.net et utilisation d'un Proxy inversé avec un NAS Synology

Vous trouverez dans cet article, l’ensemble des éléments permettant de mettre à jour les DNS Gandi.net à partir d’un NAS Synology ainsi que de mettre en place un proxy inversé pour vos différents services sur votre réseau local.

Objectif

Contexte

Nous souhaitons utiliser un nom de domaine personnel de Gandi.net nommé testing.com pour pouvoir accéder aux différents services existant derrière un accès (Routeur Livebox) internet personnel en fonction des sous-domaines définis.

Nous avons un réseau local contenant les équipements suivants :

  • Routeur Livebox avec l’adresse local 192.10.10.1 (Adresse publique : 90.125.62.14)
  • NAS Synology avec l’adresse local 192.10.10.2
  • Serveur local n°1 pour héberger le service VPN avec l’adresse local 192.10.10.10
  • Serveur local n°2 pour héberger le service GAME avec l’adresse local 192.10.10.20
  • Serveur local n°3 pour héberger le service TODO avec l’adresse local 192.10.10.30

Nous avons un nom de domaine testing.com actif chez Gandi.net.

Obj - Step n°0

Schéma :

Obj - Step n°1

Contrainte

Le routeur Livebox ne permet de gérer que l’IPv4, l’adresse IP publique n’est pas fixe et on ne sait pas quand elle change, il faut donc pouvoir vérifier régulièrement notre adresse IP publique pour mettre à jour le DNS de Gandi.net lorsque cela est nécessaire.

Usage

  • Lorsqu’un utilisateur souhaite accéder à l’url https://vpn.testing.com alors il doit être redirigé automatiquement vers le serveur local n°1.
  • Lorsqu’un utilisateur souhaite accéder à l’url http://game.testing.com alors il doit être redirigé automatiquement vers le serveur local n°2.
  • Lorsqu’un utilisateur souhaite accéder à l’url http://todo.testing.com alors il doit être redirigé automatiquement vers le serveur local n°3.
  • Lorsqu’un utilisateur souhaite accéder à l’url https://share.testing.com alors il doit être redirigé automatiquement vers le NAS Synology.

Schéma : Obj - Step n°2

Liste des étapes

Pour mettre en place les éléments nécessaires, nous allons réaliser les étapes suivantes :

  1. Création d’un jeton d’accès à l’API de Gandi.net
  2. Configuration du routeur Livebox pour rediriger le traffic internet entrant vers le NAS Synology
  3. Creation et mise à jour des DNS Gandi.net avec l’adresse IP publique associée au routeur Livebox
  4. Mise en place du Proxy inversé sur le NAS Synology pour accéder aux différents serveurs

Création d’un jeton d’accès à l’API de Gandi.net

Le jeton d’accès va nous permettre de nous authentifier pour utiliser l’API fourni par Gandi.net afin de pouvoir automatiser les modifications nécessaires sur les enregistrements DNS lors des changements d’adresse IP publique.

Démarche pour créer le jeton d’accès :

  1. Connexion sur le compte d’administration sur le site Gandi.net
  2. Cliquez sur le menu Organizations

Token - Step n°1

  1. Cliquez sur l’organisation souhaitée
  2. Cliquez sur l’onglet Sharing

Token - Step n°2

  1. Dans la partie Personal Access Token (PAT), cliquez sur le bouton Create a token
  2. Renseigner les différents éléments nécesssaires
    1. Renseigner le nom du jeton (ex : testing_dns_pat)
    2. Sélectionnez la durée de validité du jeton comprise entre 7 jours et 1 an (ex : 7 days)
    3. Cochez la case Restrict to selected products et sélectionnez le domaine souhaité (ex : testing.com)
    4. Cochez la case See and renew domain names
    5. Cochez la case Manage domain technical configurations
    6. Cliquez sur le bouton Create

Token - Step n°3

  1. Copier le Jeton d’accès créé dans un endroit sécurisé car il ne sera plus accessible

Token - Step n°4

Configuration du routeur

Nous allons mettre en place une redirection du traffic internet entrant vers le NAS Synology par défaut pour que le NAS Synology puisse servir de reverse proxy pour rediriger les utilisateurs vers le serveur local défini en fonction de l’adresse entrante utilisée.

Démarche pour configurer la box internet :

  1. Se connecter sur le compte d’administration de la livebox
  2. Allez dans le menu Advanced Parameters
  3. Cliquez sur l’option Network

Box - Step n°1

  1. Cliquez sur l’onglet NAT / PAT
  2. Ajoutez une règle pour rediriger le traffic HTTP entrant vers le NAS Synology et cliquez sur Create
    1. Application/Service : Reverse Proxy HTTP
    2. Internal Port : 80
    3. External Port : 80
    4. Protocol : TCP
    5. Equipment : 192.10.10.2
    6. External IP : All
  3. Ajoutez une règle pour rediriger le traffic HTTPS entrant vers le NAS Synology et cliquez sur Create
    1. Application/Service : Reverse Proxy HTTPS
    2. Internal Port : 443
    3. External Port : 443
    4. Protocol : TCP
    5. Equipment : 192.10.10.2
    6. External IP : All

Box - Step n°2

Creation et mise à jour des DNS Gandi.net

Attention : la prise en compte d’un changement de DNS peut mettre plusieurs heures en fonction de sa configuration.

Pour créer et mettre à jour les informations sur le DNS de Gandi.net, nous allons utiliser l’API publique de Gandi.net et créer un script qui sera exécuté directement sur le NAS Synology.

Création d’un répertoire sur le NAS pour stocker le script à exécuter

  1. Allez dans l’application File Station
  2. Naviguez jusqu’au répertoire Share
  3. Créer un sous-répertoire Script

Note : L’adresse complète du répertoire sera volume1/Share/Script

Création d’un script nommé Gandi_Update_DNS.sh

Le script Gandi_Update_DNS.sh doit être créé dans le répertoire volume1/Share/Script du NAS Synology.

Nous définissons les paramètres important du script au début :

  • Le jeton d’accès à l’API Gandi sera dans la variable : TOKEN_GANDI
  • Le nom du domaine sera dans la variable : DOMAIN_GANDI
  • La liste des sous domaines à mettre à jour seront dans la variable : RECORDS_GANDI

A partir de ces informations, nous allons pouvoir mettre en place le script suivant :

 1#!/bin/sh
 2
 3# Configure data
 4TOKEN_GANDI="<testing_dns_pat>"
 5DOMAIN_GANDI="testing.com"
 6RECORDS_GANDI="share vpn game todo" #subdomain listing
 7RECORD_TYPE_GANDI="A"
 8RECORD_TTL_GANDI="1200"
 9
10RECORD_GANDI=$(echo $RECORDS_GANDI | cut -d" " -f1)
11
12# 1. Get Public IP
13CURRENTIP_GANDI=$(curl -s -4 ifconfig.co/ip)
14IPLENGTH_GANDI=$(echo -n ${CURRENTIP_GANDI} | wc -m)
15
16# Check that ifconfig.io give me an IP
17if [ -z "${CURRENTIP_GANDI}" ]
18then
19  echo "\n$(date +"%Y-%m-%d %H:%M:%S") - Error - CURRENTIP_GANDI is empty"
20  exit 1
21fi
22
23if [ ${IPLENGTH_GANDI} -gt 16 ] || [ ${IPLENGTH_GANDI} -lt 7 ]
24then
25  echo "\n$(date +"%Y-%m-%d %H:%M:%S") - Error - CURRENTIP_GANDI issue : [${CURRENTIP_GANDI}]"
26  exit 1
27fi
28
29
30# 2. Get gandi's NS for my domain
31NS_GANDI=$(curl -X GET "https://api.gandi.net/v5/livedns/domains/${DOMAIN_GANDI}/nameservers" -H "authorization: Bearer ${TOKEN_GANDI}" | jq '.[0]' | sed 's/"//g')
32
33# 3. Get the last IP recorded
34LASTREGISTEREDIP_GANDI=$(/var/packages/DNSServer/target/bin/dig +short ${RECORD_GANDI}.${DOMAIN_GANDI} @${NS_GANDI})
35LASTREGISTEREDIPLENGTH_GANDI=$(echo -n ${LASTREGISTEREDIP_GANDI} | wc -m)
36
37if [ -z "${LASTREGISTEREDIP_GANDI}" ]
38then
39  echo "\n$(date +"%Y-%m-%d %H:%M:%S") - Error - LASTREGISTEREDIP_GANDI is empty"
40  exit 1
41fi
42
43if [ ${LASTREGISTEREDIPLENGTH_GANDI} -gt 16 ] || [ ${LASTREGISTEREDIPLENGTH_GANDI} -lt 7 ]
44then
45  echo "\n$(date +"%Y-%m-%d %H:%M:%S") - Error - LASTREGISTEREDIP_GANDI issue : [${LASTREGISTEREDIP_GANDI}]"
46  exit 1
47fi
48
49
50# 4. Update if needed
51if [ "${CURRENTIP_GANDI}" != "${LASTREGISTEREDIP_GANDI}" ]
52then
53    for SUB_GANDI in $RECORDS_GANDI; do # Loop on all domaine to use the same IP Address
54      echo "\n$(date +"%Y-%m-%d %H:%M:%S") - Info - DNS Record for [$SUB_GANDI] sent"
55      curl -X PUT https://api.gandi.net/v5/livedns/domains/${DOMAIN_GANDI}/records/${SUB_GANDI}/${RECORD_TYPE_GANDI} \
56              -H "authorization: Bearer ${TOKEN_GANDI}" \
57              -H "Content-Type: application/json" \
58              -d "{\"rrset_values\": [\"${CURRENTIP_GANDI}\"], \"rrset_ttl\": "${RECORD_TTL_GANDI}"}"
59    done
60    echo "\n$(date +"%Y-%m-%d %H:%M:%S") - Info - DNS Record has changed !!!!"
61    exit 2
62fi
63
64exit 0

Les grandes étapes sont les suivantes :

  1. curl -s -4 ifconfig.co/ip (résultat : 90.125.62.14) : Récupération de notre adresse IP publique actuelle
  2. curl -X GET "https://api.gandi.net/v5/livedns/domains/${DOMAIN_GANDI}/nameservers" -H "authorization: Bearer ${TOKEN_GANDI}" | jq '.[0]' | sed 's/"//g' : Récupération du nameserver principal de Gandi.net pour notre domaine testing.com
  3. /var/packages/DNSServer/target/bin/dig +short ${RECORD_GANDI}.${DOMAIN_GANDI} @${NS_GANDI} : Récupération de l’adresse IP publique enregistrée dans le DNS de Gandi.net pour le domaine testing.com
  4. Dans le cas où l’adresse IP publique actuelle est différente de l’adresse IP publique enregistrée dans le DNS de Gandi.net alors on met à jour l’information pour chaque sous domaine renseigné.

Automatisation de l’exécution du script Gandi_Update_DNS.sh

Pour exécuter automatiquement un script sur le NAS Synology, les étapes sont les suivantes :

  1. Cliquez sur le menu Main menu (en haut à gauche sur l’écran principal)
  2. Cliquez sur l’application Control Panel
  3. Cliquez sur le menu Task Scheduler
  4. Cliquez sur le bouton Create et sélectionnez l’option Scheduled Task > User-defined script
    1. Renseignez les informations de l’onglet General et cochez la case Enabled
    2. Renseignez les informations de l’onglet Schedule avec la fréquence et l’horaire d’exécution du script
    3. Renseignez les informations de l’onglet Task Settings
      1. Cochez la case Send run details by email
      2. Cochez la case Send run details only when the scrip terminates abnormally
      3. Renseignez votre mail pour recevoir les informations en cas d’erreur du script
      4. Renseignez la commande a exécuter dans User-defined script. La commande est bash <script path>/Gandi_Update_DNS.sh
    4. Cliquez sur le bouton OK
  5. Vérifiez que la case est bien cochée pour le script ajouté dans l’écran récapitulatif

CRON - Step n°1

Résultat de l’exécution du script Gandi_Update_DNS.sh

Execution - Step n°1

Mise en place du Proxy inversé sur le NAS Synology

Se connecter au NAS Synology et suivre les étapes suivantes :

  1. Cliquez sur le menu Main menu (en haut à gauche sur l’écran principal)
  2. Cliquez sur l’application Control Panel
  3. Cliquez sur le menu Login Portal
  4. Cliquez sur l’onglet Advanced
  5. Cliquez sur le bouton Reverse Proxy

Proxy - Step n°1

  1. Cliquez sur le bouton Create
  2. Renseignez les éléments suivant pour la redirection de l’adresse vpn.testing.com vers le serveur n°1 (192.10.10.10) et cliquez sur le bouton Save
    1. Reverse Proxy Name : VPN (HTTPS)
    2. Source
      1. Protocol : HTTPS
      2. Hostname: vpn.testing.com
      3. Port : 443
    3. Destination :
      1. Protocol : HTTPS
      2. Hostname : 192.10.10.10
      3. Port : 443

Proxy - Step n°2

  1. Recommencez l’opération pour la redirection de l’adresse game.testing.comvers le serveur local n°2 (192.10.10.20)
    1. Reverse Proxy Name : GAME (HTTP)
    2. Source
      1. Protocol : HTTP
      2. Hostname: game.testing.com
      3. Port : 80
    3. Destination :
      1. Protocol : HTTP
      2. Hostname : 192.10.10.20
      3. Port : 80
  2. Recommencez l’opération pour la redirection de l’adresse todo.testing.comvers le serveur local n°3 (192.10.10.30)
    1. Reverse Proxy Name : TODO (HTTP)
    2. Source
      1. Protocol : HTTP
      2. Hostname: todo.testing.com
      3. Port : 80
    3. Destination :
      1. Protocol : HTTP
      2. Hostname : 192.10.10.30
      3. Port : 80

Résultat de la configuration du Proxy inversé :

Proxy - Step n°3