ウェブサイト検索

CloudflareとBashスクリプトを使用して、ドメインの動的IP更新を自動化する


静的IPアドレスがしばしば追加費用となる世界では、動的IPアドレスがドメイン管理の課題となることがあります。ISPが動的IPアドレスを割り当てる場合、ドメインを更新し続けるのは面倒です。このチュートリアルでは、IPが変更されるたびにドメインのDNSレコードを更新するためにCloudflareのAPIを使用するシンプルで効果的なBashスクリプトの作成方法を説明します。このスクリプトを使用することで、静的IPがなくても、ドメインが常に現在の動的IPアドレスを指すことを保証できます。

このチュートリアルでは、次のことを学びます:

  • DNSを管理するためのCloudflare APIトークンの取得方法
  • ゾーンIDとDNSレコードIDを見つける方法
  • 動的IPでDNSレコードを更新するためのBashスクリプトの作成方法
  • IPアドレスが変更されたときのみスクリプトを更新する方法

動的IPにドメインをマッピングするためのステップバイステップガイド

以下の手順に従って、IPアドレスが変更されるたびにCloudflareのDNSレコードを自動的に更新するBashスクリプトを作成します。このスクリプトは、ホームサーバー、リモートデスクトップ、または動的IPアドレスがDNSに一貫して反映される必要がある状況に最適です。

  1. Cloudflare APIトークンを取得する</strong> : CloudflareのAPIと対話するには、DNSレコードを編集する権限を持つAPIトークンが必要です。

    1. Cloudflareにログイン: Cloudflareダッシュボードにアクセスし、アカウントの認証情報でログインします。
    2. APIトークンに移動: マイプロフィールに行き、APIトークンを選択します。
    3. 新しいトークンを作成する: トークンを作成<&47;em>をクリックし、ゾーンDNSを編集<&47;em>テンプレートを選択します。
    4. トークンをカスタマイズする: トークンが管理するドメインを指定し、トークンを作成<&47;em>をクリックします。
    5. トークンをコピー: スクリプトで使用するために生成されたAPIトークンをコピーしてください。

    生成されたトークンをコピーしてください。これは、Cloudflareと認証するためにスクリプトで使用されます。

    ゾーンIDとDNSレコードIDを見つける: 次に、ドメインのゾーンIDと更新したいDNSレコードのIDが必要です。

    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"
    

    このコマンドは、example.comのゾーンIDを返します。example.comを実際のドメイン名に置き換えてください。あなたのゾーンIDであるidフィールドに注意してください。

    DNS_RECORD_IDを取得するには、次のようにします:

    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"
    

    希望するDNSレコードの下にあるidフィールドを探してください。これがあなたのDNS_RECORD_IDです。

  2. DNSレコードを更新する基本的なBashスクリプトを作成する</strong>: 必要なIDとトークンを使用して、現在のIPでDNSレコードを更新するシンプルなBashスクリプトを作成できます。

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

    このスクリプトは、現在のパブリックIPでDNSレコードを更新します。プレースホルダーを実際の値に置き換えてください。

  3. 必要な場合のみスクリプトを更新するように強化する</strong>: 不要な更新を避けるために、更新する前にIPアドレスが変更されたかどうかを確認するようにスクリプトを強化してください。また、スクリプト内のコマンドのフルパスを更新して、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

    このスクリプトのバージョンは、現在のIPがDNSレコードのIPと異なるかどうかを確認します。IPが変更された場合のみ、DNSレコードを更新します。

  4. cronを使用してスクリプトをスケジュールする: DNSレコードを自動的に最新の状態に保つために、cronを使用して定期的にスクリプトを実行するようにスケジュールします。

    crontab -e
    Add the following line to run the script every 5 minutes:
    */5 * * * * /path/to/update_dns.sh
    
  5. これにより、スクリプトが5分ごとに実行され、動的IPの変更がDNSレコードに迅速に反映されることが保証されます。

結論

これらの手順に従うことで、動的IPアドレスにドメインを指し続けるための信頼できるソリューションを作成しました。このスクリプトはプロセスを自動化し、IPが変更されるたびに手動で更新する必要を排除します。CloudflareのAPIと少しのBashスクリプトを使用することで、IPがどれだけ頻繁に変わってもドメインが常に到達可能であることを保証できます。この設定は、ホームサーバー、自己ホスト型サービス、または動的IPが問題を引き起こす可能性のあるシナリオに最適です。

関連記事: