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 :
- notre identifiant Cloudflare : user@example.com
- notre clé API : c2547eb745079dac9320b638f5e225cf483cc5cfdda41
- notre zone_identifier : 023e105f4ecef8ad9ca31a8372d0c353
- notre record_identifier : 372e67954025e0ba6aaa6d586b9e0b59
- 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