Recherche de site Web

Automatisez les mises à jour dynamiques de l’adresse IP de votre domaine avec Cloudflare et Bash Script


Dans un monde où les adresses IP statiques représentent souvent une dépense supplémentaire, les adresses IP dynamiques peuvent rendre la gestion des domaines difficile. Si votre FAI vous attribue une adresse IP dynamique, il peut être fastidieux de garder votre domaine à jour. Ce tutoriel vous guidera dans la création d’un script Bash simple mais efficace qui utilise l’API de Cloudflare pour mettre à jour l’enregistrement DNS de votre domaine chaque fois que votre adresse IP change. Avec ce script, vous pouvez vous assurer que votre domaine pointe toujours vers votre adresse IP dynamique actuelle, même sans IP statique.

Dans ce tutoriel, vous allez apprendre :

  • Comment obtenir un jeton API Cloudflare pour la gestion du DNS
  • Comment trouver votre ID de zone et votre ID d’enregistrement DNS
  • Comment créer un script Bash pour mettre à jour un enregistrement DNS avec votre IP dynamique
  • Comment améliorer le script pour qu’il ne soit mis à jour que lorsque l’adresse IP change

Guide étape par étape pour mapper votre domaine à une adresse IP dynamique

Suivez les étapes ci-dessous pour créer un script Bash qui met automatiquement à jour votre enregistrement DNS Cloudflare chaque fois que votre adresse IP change. Ce script est idéal pour les serveurs domestiques, les postes de travail à distance ou toute situation où une adresse IP dynamique doit être reflétée de manière cohérente dans le DNS.

  1. Obtenir votre jeton d’API Cloudflare : pour interagir avec l’API de Cloudflare, vous avez besoin d’un jeton d’API avec des autorisations pour modifier les enregistrements DNS.

    1. Connectez-vous à Cloudflare : Rendez-vous sur le tableau de bord Cloudflare et connectez-vous avec les informations d’identification de votre compte.
    2. Accédez à Jetons d’API : accédez à Mon profil et sélectionnez Jetons d’API.
    3. Créer un nouveau jeton : Cliquez sur Créer un jeton et choisissez le modèle DNS Modifier la zone.
    4. Personnaliser le jeton : spécifiez le domaine dans lequel vous souhaitez que le jeton soit géré, puis cliquez sur Créer un jeton.
    5. Copier le jeton : copiez le jeton d’API généré pour l’utiliser dans votre script.

    Copiez le jeton généré. Celui-ci sera utilisé dans votre script pour vous authentifier auprès de Cloudflare.

    Trouvez votre ID de zone et votre ID d’enregistrement DNS : Ensuite, vous avez besoin de l’ID de zone de votre domaine et de l’ID de l’enregistrement DNS que vous souhaitez mettre à jour.

    $ curl -X GET "https://api.cloudflare.com/client/v4/zones?name=example.com" \
         -H "Authorization: Bearer YOUR_CLOUDFLARE_API_TOKEN" \
         -H "Content-Type: application/json"
    

    Cette commande renverra l’ID de zone pour example.com. Remplacez example.com par votre nom de domaine actuel. Notez le champ id, qui est votre ID de zone.

    Pour obtenir le DNS_RECORD_ID, utilisez :

    $ curl -X GET "https://api.cloudflare.com/client/v4/zones/YOUR_ZONE_ID/dns_records?name=example.com" \
         -H "Authorization: Bearer YOUR_CLOUDFLARE_API_TOKEN" \
         -H "Content-Type: application/json"
    

    Recherchez le champ id sous l’enregistrement DNS souhaité. C’est votre DNS_RECORD_ID.

  2. Créez un script Bash de base pour mettre à jour l’enregistrement DNS : Avec les ID et le jeton nécessaires, vous pouvez créer un script Bash simple pour mettre à jour l’enregistrement DNS avec votre adresse IP actuelle.

    #!/bin/bash
    
    CLOUDFLARE_API_TOKEN="your_api_token_here"
    ZONE_ID="your_zone_id_here"
    DNS_RECORD_ID="your_record_id_here"
    DNS_RECORD_NAME="example.com"
    DNS_RECORD_TYPE="A"
    
    IP=$(curl -s http://ipv4.icanhazip.com)
    
    curl -X PUT "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records/$DNS_RECORD_ID" \
         -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
         -H "Content-Type: application/json" \
         --data '{
           "type": "'"$DNS_RECORD_TYPE"'",
           "name": "'"$DNS_RECORD_NAME"'",
           "content": "'"$IP"'",
           "ttl": 120,
           "proxied": false
         }'

    Ce script met à jour l’enregistrement DNS avec votre adresse IP publique actuelle. Remplacez les espaces réservés par vos valeurs réelles.

  3. Bash script pour mettre à jour l’enregistrement DNS

  4. Améliorez le script pour qu’il ne soit mis à jour que lorsque cela est nécessaire : pour éviter les mises à jour inutiles, améliorez le script pour vérifier si l’adresse IP a changé avant la mise à jour. Mettez également à jour les chemins d’accès complets à n’importe quelle commande du script afin qu’il puisse s’exécuter avec cron.

    #!/bin/bash
    
    CLOUDFLARE_API_TOKEN="your_api_token_here"
    ZONE_ID="your_zone_id_here"
    DNS_RECORD_ID="your_record_id_here"
    DNS_RECORD_NAME="example.com"
    DNS_RECORD_TYPE="A"
    Define the full paths to commands to be able run this script with cron
    CURL="/usr/bin/curl"
    JQ="/usr/bin/jq"
    Get the current public IP address
    IP=$($CURL -s http://ipv4.icanhazip.com)
    Cloudflare API endpoint to get the current DNS record
    GET_API_ENDPOINT="https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records/$DNS_RECORD_ID"
    Get the current DNS record's IP address from Cloudflare
    current_ip=$($CURL -s -X GET "$GET_API_ENDPOINT" \
         -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
         -H "Content-Type: application/json" | $JQ -r '.result.content')
    Check if the IP addresses are different
    if [[ "$IP" == "$current_ip" ]]; then
      echo "No update needed. IP address has not changed: $IP"
    else
      echo "IP address has changed from $current_ip to $IP. Updating record..."
    
      # Cloudflare API endpoint to update the DNS record
      UPDATE_API_ENDPOINT="https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records/$DNS_RECORD_ID"
    
      # Update the DNS record
      response=$($CURL -s -X PUT "$UPDATE_API_ENDPOINT" \
           -H "Authorization: Bearer $CLOUDFLARE_API_TOKEN" \
           -H "Content-Type: application/json" \
           --data '{
             "type": "'"$DNS_RECORD_TYPE"'",
             "name": "'"$DNS_RECORD_NAME"'",
             "content": "'"$IP"'",
             "ttl": 120,
             "proxied": false
           }')
    
      # Check if the update was successful
      if [[ $response == *"\"success\":true"* ]]; then
        echo "DNS record updated successfully to IP: $IP"
      else
        echo "Failed to update DNS record. Response: $response"
      fi
    fi

    Cette version du script vérifie si l’adresse IP actuelle est différente de l’adresse IP de l’enregistrement DNS. Il ne met à jour l’enregistrement DNS que si l’adresse IP a changé.

  5. Script amélioré pour mettre à jour l’enregistrement DNS uniquement lorsque nécessaire

  6. Planifier le script à l’aide de cron : pour maintenir votre enregistrement DNS à jour automatiquement, planifiez l’exécution du script à intervalles réguliers à l’aide de cron.

    $ crontab -eAdd the following line to run the script every 5 minutes:
    */5 * * * * /path/to/update_dns.sh
    
  7. Cela exécutera le script toutes les 5 minutes, garantissant que tout changement dans votre adresse IP dynamique est rapidement reflété dans vos enregistrements DNS.

Conclusion

En suivant ces étapes, vous avez créé une solution fiable pour que votre domaine pointe vers votre adresse IP dynamique. Ce script automatise le processus, éliminant ainsi le besoin de mises à jour manuelles chaque fois que votre adresse IP change. Grâce à l’API de Cloudflare et à un peu de script Bash, vous pouvez vous assurer que votre domaine est toujours joignable, quelle que soit la fréquence à laquelle votre adresse IP change. Cette configuration est parfaite pour les serveurs domestiques, les services auto-hébergés ou tout scénario où une adresse IP dynamique causerait autrement des maux de tête.