- پیشنیازها
- روشهای گرفتن IP از AWS
- طراحی ربات: معماری پیشنهاد شده
- پیادهسازی سریع با Bash + curl (مثال عملی)
- پیادهسازی قابلاطمینان با Python (مثال عملی)
- استقرار و مدیریت (systemd، cron، Lambda)
- امنیت، ذخیره کلید و کمترین دسترسی
- نکات عملی: TTL، Proxy، IPv6، خطاگیری و مانیتورینگ
- مقایسه و توصیههای عملی برای ترید، گیم و وب
- جمعبندی
- تمایل به دریافت کمک فنی
- سؤالات متداول
پیشنیازها
پیش از شروع لازم است موارد زیر را آماده کنید تا ربات بهدرستی کار کند.
- حساب 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
boto3import 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 نیاز دارید، میتوانید با تیم فنی تماس بگیرید تا راهکار سفارشی و پشتیبانی کامل برای شما فراهم شود.









