Ricerca nel sito web

Automatizza gli aggiornamenti IP dinamici per il tuo dominio con Cloudflare e Bash Script


In un mondo in cui gli indirizzi IP statici rappresentano spesso una spesa aggiuntiva, gli indirizzi IP dinamici possono rendere la gestione dei domini una sfida. Se il tuo ISP ti assegna un indirizzo IP dinamico, mantenere aggiornato il tuo dominio può essere una seccatura. Questo tutorial ti guiderà attraverso la creazione di uno script Bash semplice ma efficace che utilizza l'API di Cloudflare per aggiornare il record DNS del tuo dominio ogni volta che il tuo IP cambia. Con questo script puoi assicurarti che il tuo dominio punti sempre al tuo attuale indirizzo IP dinamico, anche senza un IP statico.

In questo tutorial imparerai:

  • Come ottenere un token API Cloudflare per la gestione dei DNS
  • Come trovare l'ID della zona e l'ID del record DNS
  • Come creare uno script Bash per aggiornare un record DNS con il tuo IP dinamico
  • Come migliorare lo script per aggiornare solo quando cambia l'indirizzo IP

Guida passo passo per mappare il tuo dominio su un IP dinamico

Segui i passaggi seguenti per creare uno script Bash che aggiorni automaticamente il tuo record DNS Cloudflare ogni volta che il tuo IP cambia. Questo script è ideale per server domestici, desktop remoti o qualsiasi situazione in cui un indirizzo IP dinamico deve riflettersi in modo coerente nel DNS.

  1. Ottieni il token API di Cloudflare: per interagire con l'API di Cloudflare, hai bisogno di un token API con le autorizzazioni per modificare i record DNS.

    1. Accedi a Cloudflare: visita la dashboard di Cloudflare e accedi con le credenziali del tuo account.
    2. Vai a Token API: vai a Il mio profilo e seleziona Token API.
    3. Crea un nuovo token: fai clic su Crea token e scegli il modello Modifica DNS zona.
    4. Personalizza il token: specifica il dominio che desideri che il token gestisca e fai clic su Crea token.
    5. Copia il token: copia il token API generato da utilizzare nel tuo script.

    Copia il token generato. Questo verrà utilizzato nel tuo script per autenticarti con Cloudflare.

    Trova l'ID di zona e l'ID del record DNS: successivamente, avrai bisogno dell'ID di zona del tuo dominio e dell'ID del record DNS che desideri aggiornare.

    $ 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"
    

    Questo comando restituirà l'ID zona per example.com. Sostituisci example.com con il tuo nome di dominio effettivo. Nota il campo id, che è il tuo ID zona.

    Per ottenere il DNS_RECORD_ID, utilizza:

    $ 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"
    

    Cerca il campo id sotto il record DNS desiderato. Questo è il tuo DNS_RECORD_ID.

  2. Crea uno script Bash di base per aggiornare il record DNS: con gli ID e il token necessari, puoi creare un semplice script Bash per aggiornare il record DNS con il tuo IP corrente.

    #!/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
         }'

    Questo script aggiorna il record DNS con il tuo IP pubblico corrente. Sostituisci i segnaposto con i tuoi valori effettivi.

  3. Script Bash per aggiornare il record DNS

  4. Migliora lo script per aggiornarlo solo quando necessario: per evitare aggiornamenti non necessari, migliora lo script per verificare se l'indirizzo IP è cambiato prima dell'aggiornamento. Aggiorna anche i percorsi completi di qualsiasi comando all'interno dello script in modo che possa essere eseguito con 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

    Questa versione dello script controlla se l'IP corrente è diverso dall'IP nel record DNS. Aggiorna il record DNS solo se l'IP è cambiato.

  5. Script migliorato per aggiornare il record DNS solo quando necessario

  6. Pianifica lo script utilizzando Cron: per mantenere aggiornato automaticamente il record DNS, pianifica l'esecuzione dello script a intervalli regolari utilizzando cron.

    $ crontab -eAdd the following line to run the script every 5 minutes:
    */5 * * * * /path/to/update_dns.sh
    
  7. Questo eseguirà lo script ogni 5 minuti, assicurando che qualsiasi modifica nel tuo IP dinamico si rifletta tempestivamente nei tuoi record DNS.

Conclusione

Seguendo questi passaggi, hai creato una soluzione affidabile per mantenere il tuo dominio puntato al tuo indirizzo IP dinamico. Questo script automatizza il processo, eliminando la necessità di aggiornamenti manuali ogni volta che il tuo IP cambia. Con l'API di Cloudflare e un po' di scripting Bash, puoi assicurarti che il tuo dominio sia sempre raggiungibile, indipendentemente dalla frequenza con cui cambia il tuo IP. Questa configurazione è perfetta per server domestici, servizi self-hosted o qualsiasi scenario in cui un IP dinamico causerebbe altrimenti grattacapi.