ساخت ربات تغییر و بروزرسانی آیپی روی کلودفلر بر اساس ایپی های دریافتی از سرور آمازون
آموزش گام‌به‌گام ساخت رباتی برای بروزرسانی دینامیک IP روی Cloudflare با استفاده از AWS.

ساخت ربات تغییر و بروزرسانی آیپی روی کلودفلر بر اساس ایپی های دریافتی از سرور آمازون

0 اشتراک گذاری
0
0
0
0

پیش‌نیازها

پیش از شروع لازم است موارد زیر را آماده کنید تا ربات به‌درستی کار کند.

  • حساب Cloudflare و دسترسی برای مدیریت DNS دامنه.
  • ایجاد API Token در Cloudflare با سطح دسترسی Zone:DNS:Edit برای زون مورد نظر.
  • دسترسی به Zone ID دامنه و نام رکورد (مثلاً vpn.example.com).
  • سرور یا سرویس در AWS (EC2) که آی‌پی عمومی آن قابل دسترس باشد، یا دسترسی AWS API برای پرس‌وجو.
  • ابزارهای پایه: curl، jq، Python3 + requests.
  • پیشنهاد امنیتی: نگهداری توکن در AWS Secrets Manager یا متغیرهای محیطی محافظت شده.

روش‌های گرفتن IP از AWS

چند روش معمول برای به‌دست آوردن آدرس IP عمومی از سرورهای آمازون وجود دارد؛ انتخاب روش بستگی به سناریوی اجرا دارد.

۱. درون EC2 (metadata)

اگر اسکریپت روی همان EC2 اجرا می‌شود ساده‌ترین راه استفاده از سرویس metadata است:

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

برای IPv6:

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

۲. با AWS CLI / SDK

با استفاده از describe-instances و فیلتر بر اساس tag یا Instance ID می‌توانید IP را دریافت کنید. با IAM Role می‌توان نیاز به کلیدهای دسترسی را حذف کرد.

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

۳. Elastic IP و شبکه‌های پیچیده

برای Elastic IP یا تنظیمات شبکه پیچیده، بررسی association ها با describe-addresses روش مناسب است.

طراحی ربات: معماری پیشنهاد شده

با توجه به نیاز و مقیاس، چند الگوی معماری مناسب وجود دارد:

  • گزینه ساده: اسکریپت روی همان EC2 اجرا شود و هر n دقیقه IP را چک کند؛ در صورت تغییر با Cloudflare API آپدیت شود.
  • گزینه مقیاس‌پذیر: چند EC2 در مناطق مختلف → یک Lambda/Serverless مرکزی وظیفه جمع‌آوری IPها و به‌روزرسانی رکوردهای متعدد را بر عهده دارد.
  • ذخیره وضعیت: فایل محلی یا S3/DB برای نگهداری آخرین IP ثبت شده تا از آپدیت‌های غیرضروری جلوگیری شود.
  • مدیریت خطا و retry: استفاده از backoff و logging (CloudWatch).

پیاده‌سازی سریع با Bash + curl (مثال عملی)

این مثال فرض می‌کند اسکریپت روی همان EC2 اجرا می‌شود و یک رکورد A را به‌روزرسانی می‌کند. ابتدا یک‌بار Zone ID و Record 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'

اسکریپت نمونه update-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 (مثال عملی)

نمونه‌ای از اسکریپت Python که می‌تواند به‌عنوان Lambda یا روی سرور اجرا شود و چند رکورد را مدیریت کند.

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)

چند روش مرسوم برای اجرا و مدیریت ربات:

  • systemd: ایجاد unit که اسکریپت را هر ۵ دقیقه اجرا کند یا سرویس daemon که تغییرات را مانیتور کند.
  • cron: اجرای دوره‌ای (هر n دقیقه) با حافظه وضعیت محلی برای جلوگیری از آپدیت‌های اضافی.
  • AWS Lambda + EventBridge: اجرای دوره‌ای بدون نگهداری سرور، با IAM role و Secrets Manager.
  • لاگ‌ها: ارسال لاگ‌ها به CloudWatch و تعریف آلارم برای خطاهای پی‌درپی.

امنیت، ذخیره کلید و کمترین دسترسی

الزامات امنیتی برای کاهش ریسک و رعایت اصل کمترین دسترسی:

  • API Token محدود: در Cloudflare از API Token به جای Global API Key استفاده کنید و scope را محدود به Zone:DNS:Edit فقط برای زون مورد نظر.
  • IAM Role: در AWS از IAM Role برای EC2/Lambda استفاده کنید و از AWS Secrets Manager یا SSM Parameter Store برای نگهداری CF_TOKEN استفاده کنید.
  • حذف توکن از لاگ‌ها: لاگ‌ها را از ذخیره توکن‌ها پاک کنید و از TLS استفاده کنید.
  • محدود کردن آپدیت‌ها: اگر IP تغییر نکرده باشد هیچ آپدیتی ارسال نکنید تا از Rate Limit جلوگیری شود.

نکات عملی: TTL، Proxy، IPv6، خطاگیری و مانیتورینگ

  • TTL: TTL پایین (مثلاً 120s) برای تغییرات سریع مناسب است اما باعث افزایش کوئری‌ها می‌شود.
  • Proxy (Cloudflare orange cloud): اگر می‌خواهید ترافیک از Cloudflare عبور کند (CDN, WAF, DDoS protection)، proxied=true. اما برای allowlist IP مانند صرافی‌ها باید proxied=false تا IP واقعی حفظ شود.
  • IPv6: در صورت وجود آدرس IPv6، آپدیت AAAA رکورد نیز ضروری است.
  • Retries: در مواجهه با خطای شبکه از backoff نمایی استفاده کنید و خطاها را لاگ کنید.
  • Monitoring: متریک‌های آپدیت موفق/ناموفق، زمان پاسخ API و تغییرات IP را در داشبورد نگه دارید و برای خطاهای مکرر اطلاع‌رسانی تنظیم کنید.

مقایسه و توصیه‌های عملی برای ترید، گیم و وب

ترید: پینگ و ثبات اهمیت زیادی دارد. پیشنهاد می‌شود از VPS مخصوص ترید با لوکیشن نزدیک به صرافی و Anti-DDoS استفاده کنید. برای IP ثابت از Elastic IP یا ربات آپدیت استفاده کنید. برای برخی APIهای صرافی proxied=false لازم است.

گیم: تاخیر پایین و پایداری مهم است. از لوکیشن نزدیک گیمرها استفاده کنید. بسته به بازی، استفاده از Cloudflare Spectrum یا عدم پروکسی تصمیم‌گیرنده است.

وب و API: استفاده از Cloudflare با proxied=true برای بهره‌مندی از CDN، WAF و DDoS توصیه می‌شود. در این حالت تغییر IP کمتر بحرانی است اما origin باید مدیریت شود.

جمع‌بندی

با استفاده از روش‌های مطرح‌شده می‌توانید به‌صورت خودکار و امن رکوردهای DNS روی Cloudflare را بر اساس IPهای دریافتی از EC2 به‌روزرسانی کنید.

  • از API Token محدود Cloudflare استفاده کنید.
  • از IAM Role و Secrets Manager در AWS بهره ببرید.
  • لاگ، مانیتورینگ و retry مناسب را پیاده‌سازی کنید تا فرآیند مقاوم شود.
  • برای نیازهای خاص (ترید، گیم، AI/rendering) از سرورهای تخصصی، Anti-DDoS و لوکیشن‌های بهینه استفاده کنید تا تاخیر کاهش یابد و پایداری افزایش یابد.

تمایل به دریافت کمک فنی

اگر به پشتیبانی در پیاده‌سازی حرفه‌ای، انتخاب لوکیشن مناسب یا استقرار امن در AWS و Cloudflare نیاز دارید، می‌توانید با تیم فنی تماس بگیرید تا راهکار سفارشی و پشتیبانی کامل برای شما فراهم شود.

سؤالات متداول

شاید دوست داشته باشید