Amazonサーバーから受信したIPに基づいてCloudflare上のIPを変更および更新するロボットを構築する
AWS を使用して Cloudflare 上の動的 IP を更新するボットを構築する手順を説明したチュートリアルです。.

Amazonサーバーから受信したIPに基づいてCloudflare上のIPを変更および更新するロボットを構築する

0 株式
0
0
0
0

前提条件

始める前に、ロボットが正しく動作するために以下のものを準備する必要があります。.

  • Cloudflareアカウント ドメイン DNS を管理するためのアクセス権。.
  • 創造 APIトークン Cloudflareのアクセスレベル ゾーン:DNS:編集 希望のゾーン用。.
  • アクセス ゾーンID ドメインとレコード名 (例: vpn.example.com).
  • アクセス可能なパブリック IP アドレスを持つ AWS (EC2) 内のサーバーまたはサービス、またはクエリ用の AWS API アクセス。.
  • 基本的なツール: カールjq、Python3以上 リクエスト.
  • セキュリティに関する提案: トークンを保管してください AWS シークレットマネージャー または保護された環境変数。.

AWSからIPを取得する方法

Amazon サーバーからパブリック IP アドレスを取得する一般的な方法はいくつかありますが、選択する方法は実装シナリオによって異なります。.

1. EC2内部(メタデータ)

スクリプトが同じ EC2 インスタンス上で実行されている場合、最も簡単な方法はメタデータ サービスを使用することです。

curl -s http://169.254.169.254/latest/meta-data/public-ipv4

IPv6の場合:

curl -s http://169.254.169.254/latest/meta-data/ipv6

2. AWS CLI/SDK を使用

使用 インスタンスの記述 タグまたはインスタンスIDでフィルタリングしてIPを取得できます。IAMロールを使用すると、アクセスキーが不要になります。.

aws ec2 describe-instances --instance-ids i-0123456789abcdef --query "Reservations[].Instances[].PublicIpAddress" --output text

3. エラスティックIPと複雑なネットワーク

Elastic IPまたは複雑なネットワーク構成の場合は、 アドレスの説明 方法は適切です。.

ロボット設計:提案されたアーキテクチャ

ニーズと規模に応じて、適切なアーキテクチャ パターンがいくつかあります。

  • シンプルなオプション: スクリプトは同じ EC2 上で実行され、n 分ごとに IP をチェックします。IP が変更された場合は、Cloudflare API で更新されます。.
  • スケーラブルなオプション: 異なるリージョンにある複数の EC2 → 中央の Lambda/Serverless が IP の収集と複数のレコードの更新を担当します。.
  • 保存ステータス: 不要な更新を避けるために、最後に登録された IP を保存するローカル ファイルまたは S3/DB。.
  • エラー処理と再試行: バックオフとログ記録 (CloudWatch) を使用します。.

Bash + curl による簡単な実装(実例)

この例では、スクリプトが同じEC2インスタンス上で実行され、Aレコードを更新することを前提としています。まず、ゾーンIDとレコードIDを一度取得します。

curl -s -X GET "https://api.cloudflare.com/client/v4/zones?name=example.com" -H "Authorization: Bearer $CF_API_TOKEN" -H "Content-Type: application/json" | jq -r '.result[0].id'

curl -s -X GET "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records?name=vpn.example.com" -H "Authorization: Bearer $CF_API_TOKEN" -H "Content-Type: application/json" | jq -r '.result[0].id'

サンプルスクリプト アップデートip.sh:

#!/usr/bin/env bash
set -e
CF_TOKEN="---FROM SECRETS MANAGER OR ENV---"
ZONE_ID="your_zone_id"
RECORD_NAME="vpn.example.com"
RECORD_ID="your_record_id"
PROXY=false
TTL=120

get_ip() {
  curl -s http://169.254.169.254/latest/meta-data/public-ipv4
}

current_ip=$(get_ip)
old_ip_file="/var/run/current_ip_${RECORD_NAME}"

if [ -f "$old_ip_file" ]; then
  old_ip=$(cat "$old_ip_file")
else
  old_ip=""
fi

if [ "$current_ip" = "" ]; then
  echo "No public IP found" >&2
  exit 1
fi

if [ "$current_ip" != "$old_ip" ]; then
  echo "Updating Cloudflare DNS from $old_ip to $current_ip"
  payload=$(jq -n --arg type "A" --arg name "$RECORD_NAME" --arg content "$current_ip" --argjson proxied $PROXY --argjson ttl $TTL '{type:$type, name:$name, content:$content, proxied:$proxied, ttl:$ttl}')
  resp=$(curl -s -X PUT "https://api.cloudflare.com/client/v4/zones/$ZONE_ID/dns_records/$RECORD_ID" -H "Authorization: Bearer $CF_TOKEN" -H "Content-Type: application/json" --data "$payload")
  success=$(echo "$resp" | jq -r '.success')
  if [ "$success" = "true" ]; then
    echo "$current_ip" > "$old_ip_file"
    echo "Update successful"
  else
    echo "Update failed: $resp" >&2
    exit 2
  fi
else
  echo "IP unchanged ($current_ip)"
fi

ヒント: から jq JSONを構築するために使用されます。IPを次の場所に保存します。 /var/run これは不要な更新を防ぐためです。トークンはスクリプトではなく、環境変数またはSecrets Managerに保存してください。.

Pythonによる信頼性の高い実装(実例)

Lambda として、またはサーバー上で実行でき、複数のレコードを管理できる Python スクリプトの例。.

requests
boto3
import os, requests, json
CF_TOKEN = os.environ['CF_TOKEN']
ZONE_ID = os.environ['ZONE_ID']
RECORDS = json.loads(os.environ.get('RECORDS_JSON', '[]'))

HEADERS = {
    "Authorization": f"Bearer {CF_TOKEN}",
    "Content-Type": "application/json"
}

def get_ec2_public_ip():
    try:
        r = requests.get("http://169.254.169.254/latest/meta-data/public-ipv4", timeout=2)
        if r.ok:
            return r.text.strip()
    except:
        pass
    return None

def find_record_id(name, type="A"):
    url = f"https://api.cloudflare.com/client/v4/zones/{ZONE_ID}/dns_records?name={name}&type={type}"
    r = requests.get(url, headers=HEADERS)
    data = r.json()
    if data.get("success") and data["result"]:
        return data["result"][0]["id"]
    return None

def update_record(record_id, name, ip, type="A", ttl=120, proxied=False):
    url = f"https://api.cloudflare.com/client/v4/zones/{ZONE_ID}/dns_records/{record_id}"
    payload = {"type": type, "name": name, "content": ip, "ttl": ttl, "proxied": proxied}
    r = requests.put(url, headers=HEADERS, json=payload)
    return r.json()

def lambda_handler(event, context=None):
    ip = get_ec2_public_ip()
    if not ip:
        print("No public IP found")
        return
    for rec in RECORDS:
        name = rec["name"]
        typ = rec.get("type","A")
        rec_id = find_record_id(name, typ)
        if not rec_id:
            print(f"No record id for {name}")
            continue
        resp = update_record(rec_id, name, ip, typ, rec.get("ttl",120), rec.get("proxied",False))
        print(resp)

if __name__ == "__main__":
    lambda_handler(None)

デプロイメントと管理(systemd、cron、Lambda)

ロボットを実行および管理するための一般的な方法:

  • システムド: 5 分ごとにスクリプトを実行するユニット、または変更を監視するデーモン サービスを作成します。.
  • クローン: 冗長な更新を避けるために、ローカル状態メモリを使用して定期的に実行します (n 分ごと)。.
  • AWS Lambda + イベントブリッジ: IAM ロールと Secrets Manager を使用して、サーバーメンテナンスなしで定期的に実行します。.
  • ログ: ログを CloudWatch に送信し、永続的なエラーのアラームを定義します。.

セキュリティ、鍵の保管、最小限のアクセス

リスクを軽減し、最小アクセスの原則を遵守するためのセキュリティ要件:

  • APIトークン限定: Cloudflareでは、グローバルAPIキーの代わりにAPIトークンを使用し、スコープを制限します。 ゾーン:DNS:編集 希望のゾーンのみ。.
  • IAM ロール: AWS では、EC2/Lambda の IAM ロールを使用し、AWS Secrets Manager または SSM パラメータストアを使用して CF_TOKEN を保存します。.
  • ログからトークンを削除します: トークン ストレージからログをクリアし、TLS を使用します。.
  • 更新を制限する: IP が変更されていない場合は、レート制限を回避するために更新を送信しないでください。.

実用的なヒント: TTL、プロキシ、IPv6、トラブルシューティングと監視

  • TTL: TTL を低くすると (例: 120 秒)、変更が高速になりますが、クエリが増加します。.
  • プロキシ(Cloudflare オレンジクラウド): トラフィックをCloudflare(CDN、WAF、DDoS保護)経由で送信したい場合は、 プロキシ=true. しかし、取引所のような許可リストIPの場合は、 プロキシ=偽 実際の IP を保存するため。.
  • IPv6: IPv6アドレスが存在する場合は更新 AAAAA 記録も重要です。.
  • 再試行: ネットワーク エラーが発生した場合は、指数バックオフを使用してエラーをログに記録します。.
  • 監視: ダッシュボードで更新の成功/失敗、API 応答時間、IP 変更に関するメトリックを維持し、頻繁に発生するエラーに関する通知を設定します。.

取引、ゲーム、ウェブに関する比較と実践的な推奨事項

貿易: pingと安定性は非常に重要です。取引所に近いロケーションで、DDoS対策機能を備えたVPSの利用をお勧めします。固定IPアドレスの場合は、Elastic IPまたはアップデートロボットをご利用ください。一部の取引所APIについては、 プロキシ=偽 これは必要である。.

ゲーム: 低レイテンシーと安定性が重要です。ゲーマーに近い場所を使用してください。ゲームによっては、Cloudflare Spectrumを使用するか、プロキシを使用しないかが決定的な判断基準となります。.

Web と API: Cloudflareの使用 プロキシ=true CDN、WAF、DDoS対策に推奨されます。この場合、IPアドレスの変更はそれほど重要ではありませんが、オリジンの管理は必須です。.

結論

上記の方法を使用すると、EC2 から受信した IP に基づいて、Cloudflare 上の DNS レコードを自動的かつ安全に更新できます。.

  • から APIトークンリミテッド Cloudflare を使用してください。.
  • から IAM ロール そして シークレットマネージャー AWS を活用しましょう。.
  • プロセスを堅牢にするために、適切なログ記録、監視、再試行を実装します。.
  • 特定のニーズ(取引、ゲーム、AI / レンダリング)については、専用のサーバー、Anti-DDoS、最適化された場所を使用して、遅延を減らし、安定性を高めます。.

技術支援を受ける意欲

専門的な実装、適切な場所の選択、AWS および Cloudflare での安全な展開に関するサポートが必要な場合は、テクニカル チームに連絡してカスタマイズされたソリューションと完全なサポートを受けることができます。.

よくある質問

あなたも気に入るかもしれない
LinuxでOpenVPNをクライアントとして設定する方法

LinuxでOpenVPNをクライアントとして設定する方法

この体系的かつ技術的な記事では、LinuxクライアントとしてOpenVPNを設定する方法を説明します。ステップバイステップの説明とルート管理により、トラフィックフローをより適切に制御できます。この記事には、OpenVPNを最適に使用するためのセキュリティのヒントとトラブルシューティングも含まれています。.
AWS Systems Manager を使用して EC2 インスタンスでコマンドをリモートで実行する

AWS Systems Manager を使用して EC2 インスタンスでコマンドをリモートで実行する

この記事では、SSHポートを開かずにAWS Systems Managerを使用してEC2インスタンスで安全にコマンドを実行する方法を説明します。前提条件、ベストプラクティス、IAM設定を確認することで、サーバー上でコマンドを簡単に管理および実行できるようになります。.