Configurer un DNS Failover pour Cloudflare avec monit

11 février 2016 Serveur 0 Commentaire

Aujourd’hui je me suis amusé à regarder si il était possible de configurer un DNS failover pour Cloudflare (je sais j’ai des passe-temps peu courant) hé bien oui c’est possible !

Rapidement pour ceux qui se demandent ce qu’est un DNS Failover c’est assez simple : lorsque votre serveur est en carafe, le DNS est modifié automatiquement afin d’associer votre domaine avec une seconde IP et quand le premier revient en ligne le DNS est modifié une seconde fois.

Donc je reprends, pendant mes recherches je suis tombé sur un post de blog détaillant la configuration d’un DNS failover pour cloudflare avec l’aide de monit et d’un script que l’auteur proposait : petit soucis ce script datait de 2002 et depuis l’api de Cloudflare a évoluée. J’ai donc parcouru la documentation de l’API afin de modifier le script en conséquence.

 

Configuration d’un DNS Failover pour cloudflare

Récupération des variables du script DNS Failover pour Cloudflare

Commencez par installer jq qui va nous permettre de rendre les réponses de l’API beaucoup plus lisible

apt-get install jq

 

Avant de pouvoir commencer à utiliser l’API vous allez devoir récupérer une clé. Rendez-vous sur cette page et cliquez sur  » View API Key », cette clé doit restée secrète !

Partons du principe que :

  • example.com est le domaine pour lequel vous souhaitez configurer un failover
  • user@example.com est l’email de votre compte Cloudflare
  • c2547eb745079dac9320b638f5e225cf483cc5cfdda41 est votre clé API

Maintenant ouvrez un terminal et lancez les commandes suivantes en prenant bien soin de modifier : le domaine concerné dans l’adresse de l’API, l’email et la clé API

curl -X GET "https://api.cloudflare.com/client/v4/zones?name=example.com&status=active&page=1&per_page=20&order=status&direction=desc&match=all" \
-H "X-Auth-Email: user@example.com" \
-H "X-Auth-Key: c2547eb745079dac9320b638f5e225cf483cc5cfdda41" \
-H "Content-Type: application/json" | jq.

 

Si vous ne vous êtes pas trompés vous allez recevoir de l’API une énorme réponse JSON, dans celle-ci intéressez vous au bloc commençant par « id » et dont la seconde ligne correspond à votre domaine. Cette id, 023e105f4ecef8ad9ca31a8372d0c353 dans notre cas, nous l’appellerons zone_identifier.

"id": "023e105f4ecef8ad9ca31a8372d0c353",
"name": "example.com",
"development_mode": 7200,
"original_name_servers": [
"ns1.originaldnshost.com",
"ns2.originaldnshost.com"

 

Lancez maintenant une seconde requête . Dans l’url remplacez la zone_identifier par la votre, ainsi que les autres paramètres (NDD, mail et clé API)

curl -X GET "https://api.cloudflare.com/client/v4/zones/023e105f4ecef8ad9ca31a8372d0c353/dns_records?type=A&name=example.com" \
-H "X-Auth-Email: user@example.com" \
-H "X-Auth-Key: c2547eb745079dac9320b638f5e225cf483cc5cfdda41" \
-H "Content-Type: application/json" | .jq

 

Dans la réponse intéressez vous à la première ligne « id » du premier bloc,  372e67954025e0ba6aaa6d586b9e0b59, que nous appellerons record_identifier.

{
"id": "372e67954025e0ba6aaa6d586b9e0b59",
"type": "A",
"name": "example.com",
"content": "1.2.3.4",
}

 

Lancez une troisième et dernière requête, cette fois-ci il faudra remplacer aussi indiquer le record_identifier

curl -X GET "https://api.cloudflare.com/client/v4/zones/023e105f4ecef8ad9ca31a8372d0c353/dns_records/372e67954025e0ba6aaa6d586b9e0b59" \
-H "X-Auth-Email: user@example.com" \
-H "X-Auth-Key: c2547eb745079dac9320b638f5e225cf483cc5cfdda41" \
-H "Content-Type: application/json"

 

Dans la réponse intéressez vous au bloc contenant l’IP de votre serveur principal, notez la valeur de la variable name, ici example.com que nous appellerons record_name

{
  "success": true,
  "errors": [],
  "messages": [],
  "result": {
    "id": "372e67954025e0ba6aaa6d586b9e0b59",
    "type": "A",
    "name": "example.com",
    "content": "1.2.3.4",
    "proxiable": true,
    "proxied": false,
    "ttl": 120,
    "locked": false,
    "zone_id": "023e105f4ecef8ad9ca31a8372d0c353",
    "zone_name": "example.com",
    "created_on": "2014-01-01T05:20:00.12345Z",
    "modified_on": "2014-01-01T05:20:00.12345Z",
    "data": {}
  }
}

 

Récapitulons nous avons donc (notez bien ces données elles seront vitales pour l’exécution des scripts :

  1. notre identifiant Cloudflare : user@example.com
  2. notre clé API : c2547eb745079dac9320b638f5e225cf483cc5cfdda41
  3. notre zone_identifier : 023e105f4ecef8ad9ca31a8372d0c353
  4. notre record_identifier : 372e67954025e0ba6aaa6d586b9e0b59
  5. notre record name : example.com

 

Configuration des scripts DNS Failover pour Cloudflare

Commencez donc par créer un répertoire cloudflare et un sous répertoires logs

mkdir -p /root/cloudflare/logs

 

Maintenant créez le script tobackup, celui qui mettra à jour votre entrée DNS afin de basculer vers le serveur de secours

nano /root/cloudflare/tobackup.sh

 

Collez le texte suivant et modifiez les 6 variables (auth_email, auth_key, zone_identifier, record_identifier, record_identifier et ip)

#!/bin/bash

auth_email=user@example.com 
auth_key=c2547eb745079dac9320b638f5e225cf483cc5cfdda41
zone_identifier=023e105f4ecef8ad9ca31a8372d0c353
record_identifier=372e67954025e0ba6aaa6d586b9e0b59
record_name=example.coom
ip=ip de votre serveur de secours

# Verifions la connexion internet
wget -q --tries=1 --timeout=3 http://www.google.com -O /tmp/index.google >> /dev/null
if [ ! -s /tmp/index.google ];then
       echo `date` No interwebz? Not switching over! >> /root/cloudflare/switch.log
        exit 0
else
# Verifions si nous deja en mode backup
if [ -f /root/cloudflare/backupactive ];
then
    echo "already in backup mode!"
    exit 0

# Sinon passons en mode backup
fi
cd /root/cloudflare
echo "Switching to backup..."

# Creations d'un fichier indiquant que le mode backup est active
touch /root/cloudflare/backupactive

# API cloudflare pour passer sur l'ip de secours 
curl -X PUT "https://api.cloudflare.com/client/v4/zones/$zone_identifier/dns_records/$record_identifier" -H "X-Auth-Email: $auth_email" -H "X-Auth-Key: $auth_key" -H "Content-Type: application/json" --data "{\"type\":\"A\",\"name\":\"$record_name\",\"content\":\"$ip\"}"

# Indiquons dans le log la date et l'heure du passage au mode backup
echo `date` going down! >> /root/cloudflare/logs/switch.log
fi
exit 0

 

Maintenant créez le script qui nous permettra de repasser votre domaine sur votre serveur principal

nano /root/cloudflare/tomain.sh

 

Puis collez le texte suivant, n’oubliez pas de modifier les variables une nouvelle fois

#!/bin/bash

auth_email=user@example.com 
auth_key=c2547eb745079dac9320b638f5e225cf483cc5cfdda41
zone_identifier=023e105f4ecef8ad9ca31a8372d0c353
record_identifier=372e67954025e0ba6aaa6d586b9e0b59
record_name=example.coom
ip=ip de votre serveur principal

# Verifions que nous bien en mode backup, sinon quittons
if [ ! -f /root/cloudflare/backupactive ];
then
	echo "Server is not in backup mode, can't switch back to main" && exit 0

# API cloudflare pour repasser sur IP principale
fi
cd /root/cloudflare
curl -X PUT "https://api.cloudflare.com/client/v4/zones/$zone_identifier/dns_records/$record_identifier" -H "X-Auth-Email: $auth_email" -H "X-Auth-Key: $auth_key" -H "Content-Type: application/json" --data "{\"type\":\"A\",\"name\":\"$record_name\",\"content\":\"$ip\"}"

# Indiquons dans le log que nous sortons du mode backup et passons sur le serveur principal
echo `date` going up! >> /root/cloudflare/logs/switch.log
rm -f /root/cloudflare/backupactive

 

Rendez ces deux scripts exécutables

chmod +x tobackup.sh tomain.sh

 

 

Installation et configuration de monit

Installer monit via le gestionnaire de paquet

apt-get install monit

 

Modifiez la configuration de monit

nano /etc/monit/monitrc

 

Veillez à ce que la configuration soit équivalente à (remplacez test par le mot de passe de votre choix)

set daemon 30
set httpd port 2812 and
allow admin:test

 

Créez un fichier de configuration Cloudflare pour monit

nano /etc/monit/conf.d/cloudflare.conf

 

Collez les lignes de commande suivantes tout en remplaçant example.com et l’adresse IP 111.111.111.111 (correspondant à l’adresse de votre serveur principal)

check host example.com with address 111.111.111.111
# alert votre.email
if failed icmp type echo count 3 with timeout 1 seconds for 4 cycles then exec "/bin/bash -c /root/$
else if succeeded for 20 cycles then exec "/bin/bash -c /root/cloudflare/tomain.sh"
if failed url http://example.com with timeout 2 seconds and retry 3 for 15 cycles then exec "/bin/$
else if succeeded for 20 cycles then exec "/bin/bash -c /root/cloudflare/tomain.sh"

 

Redémarrez monit

service monit restart

 

 

Personnalisation

Vous pouvez modifier les paramètres de configuration de monit et du script Cloudflare.conf :

  • daemon 30 : durée d’un cycle monit, intervalle (en secondes) entre deux vérfiications
  • httpd 2812 : port pour se connecter à l’interface web de monit
  • admin:test : login et mdp pour se connecter à l’interface
  • dans le script cloudflare.conf dé-commentez la seconde ligne et modifiez votre.email par votre adresse email afin de recevoir un mail si votre serveur principal n’est plus joignable

 

Source

Slayerduck, booru.org, DNS Failover for cloudflare with monit