- Ön koşullar
- AWS'den IP adresi alma yöntemleri
- Robot Tasarımı: Önerilen Mimari
- Bash + curl ile hızlı uygulama (pratik örnek)
- Python ile güvenilir uygulama (pratik örnek)
- Dağıtım ve yönetim (systemd, cron, Lambda)
- Güvenlik, anahtar depolama ve minimum erişim
- Pratik ipuçları: TTL, Proxy, IPv6, Sorun giderme ve izleme
- Alım satım, oyun ve internet için karşılaştırma ve pratik öneriler
- Çözüm
- Teknik yardım almaya istekli olmak
- Sıkça Sorulan Sorular
Ön koşullar
Başlamadan önce, robotun düzgün çalışması için aşağıdaki malzemeleri hazırlamanız gerekmektedir.
- Cloudflare hesabı ve alan adı DNS'ini yönetme erişimi.
- Yaratılış API Token Cloudflare'da erişim seviyesiyle Bölge:DNS:Düzenle İstenilen bölge için.
- Erişim Bölge Kimliği Alan adı ve kayıt adı (örneğin,
vp.example.com). - AWS'de (EC2) erişilebilir bir genel IP adresine sahip bir sunucu veya hizmet ya da sorgulama için AWS API erişimi.
- Temel araçlar:
bukle,jqPython3+istekler. - Güvenlik önerisi: Tokeni şurada saklayın: AWS Secrets Manager veya korunan çevre değişkenleri.
AWS'den IP adresi alma yöntemleri
Amazon sunucularından genel bir IP adresi elde etmek için çeşitli yaygın yöntemler vardır; yöntem seçimi uygulama senaryosuna bağlıdır.
1. EC2 İçinde (meta veri)
Eğer komut dosyası aynı EC2 örneğinde çalışıyorsa, en kolay yol meta veri hizmetini kullanmaktır:
curl -s http://169.254.169.254/latest/meta-data/public-ipv4IPv6 için:
curl -s http://169.254.169.254/latest/meta-data/ipv62. AWS CLI/SDK ile
Kullanarak örnekleri tanımla Ayrıca IP adresini almak için etiket veya Örnek Kimliği'ne göre filtreleme yapabilirsiniz. IAM Rolü ile erişim anahtarlarına olan ihtiyacı ortadan kaldırabilirsiniz.
aws ec2 describe-instances --instance-ids i-0123456789abcdef --query "Reservations[].Instances[].PublicIpAddress" --output text3. Esnek IP ve karmaşık ağlar
Elastic IP veya karmaşık ağ yapılandırmaları için, ilişkilendirmeleri kontrol edin. adresleri tanımla Yöntem uygundur.
Robot Tasarımı: Önerilen Mimari
İhtiyaca ve ölçeğe bağlı olarak, çeşitli uygun mimari modeller mevcuttur:
- Basit seçenek: Bu komut dosyası aynı EC2 sunucusunda çalışır ve IP adresini her n dakikada bir kontrol eder; eğer değişirse, Cloudflare API'si kullanılarak güncellenir.
- Ölçeklenebilir seçenek: Farklı bölgelerde birden fazla EC2 sunucusu → Merkezi bir Lambda/Sunucusuz uygulama, IP adreslerini toplamak ve birden fazla kaydı güncellemekten sorumludur.
- Kaydetme durumu: Gereksiz güncellemeleri önlemek için son kaydedilen IP adresini yerel bir dosyaya veya S3/DB'ye kaydedin.
- Hata yönetimi ve yeniden deneme: Geri çekilme ve günlük kaydı özelliklerini kullanın (CloudWatch).
Bash + curl ile hızlı uygulama (pratik örnek)
Bu örnek, betiğin aynı EC2 örneğinde çalıştığını ve bir A kaydını güncellediğini varsaymaktadır. Öncelikle, Bölge Kimliğini ve Kayıt Kimliğini bir kez alın:
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'Örnek betik IP adresini güncelle.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İpuçları: İtibaren jq JSON oluşturmak için kullanılır. IP adresini burada saklar. /var/çalıştır Bu, gereksiz güncellemeleri önlemek içindir. Belirteci bir komut dosyasında değil, ortam değişkeninde veya Gizli Bilgiler Yöneticisi'nde saklayın.
Python ile güvenilir uygulama (pratik örnek)
Lambda fonksiyonu olarak veya sunucuda çalıştırılabilen ve birden fazla kaydı yönetebilen bir Python betiği örneği.
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)Dağıtım ve yönetim (systemd, cron, Lambda)
Robot çalıştırma ve yönetme için bazı yaygın yöntemler:
- sistemd: Komut dosyasını her 5 dakikada bir çalıştıran bir birim veya değişiklikleri izleyen bir arka plan servisi oluşturun.
- cron: Gereksiz güncellemeleri önlemek için yerel durum belleğiyle periyodik yürütme (her n dakikada bir).
- AWS Lambda + EventBridge: Sunucu bakımı yapılmadan periyodik olarak, IAM rolü ve Secrets Manager ile çalıştırma.
- GünlüklerCloudWatch'a günlük kayıtları gönderin ve kalıcı hatalar için alarmlar tanımlayın.
Güvenlik, anahtar depolama ve minimum erişim
Riskleri azaltmak ve en az erişim ilkesine uymak için gereken güvenlik şartları:
- API Token Sınırlı: Cloudflare'da, Genel API Anahtarı yerine API Token'ı kullanın ve kapsamı şu şekilde sınırlandırın: Bölge:DNS:Düzenle Sadece istenilen bölge için.
- IAM Rolü: AWS'de, EC2/Lambda için IAM Rolü kullanın ve CF_TOKEN'ı depolamak için AWS Secrets Manager veya SSM Parameter Store'u kullanın.
- Günlüklerden belirteci sil: Token depolama alanındaki günlükleri temizleyin ve TLS kullanın.
- Güncellemeleri sınırla: IP adresi değişmediyse, hız sınırlamasına takılmamak için herhangi bir güncelleme göndermeyin.
Pratik ipuçları: TTL, Proxy, IPv6, Sorun giderme ve izleme
- TTLDüşük TTL (örneğin 120 saniye) hızlı değişiklikler için iyidir ancak sorgu sayısını artırır.
- Proxy (Cloudflare turuncu bulutu): Eğer trafiğin Cloudflare (CDN, WAF, DDoS koruması) üzerinden geçmesini istiyorsanız,
proxy=true. Ancak, borsalar gibi izin verilen IP adresleri için şunlara ihtiyacınız var:proxy=falseGerçek fikri mülkiyeti korumak için. - IPv6Eğer IPv6 adresi mevcutsa, güncelleyin.
AAAAKayıtlar da çok önemlidir. - Yeniden denemelerAğ hatalarıyla karşılaşıldığında üstel geri çekilme yöntemini kullanın ve hataları kaydedin.
- İzlemeGüncellemelerin başarılı/başarısız olma durumlarını, API yanıt sürelerini ve IP değişikliklerini kontrol panelinde takip edin ve sık karşılaşılan hatalar için bildirimler ayarlayın.
Alım satım, oyun ve internet için karşılaştırma ve pratik öneriler
Ticaret: Ping ve kararlılık çok önemlidir. Borsaya yakın konumda ve DDoS saldırılarına karşı korumalı bir işlem VPS'si kullanılması önerilir. Sabit IP için Elastic IP veya güncelleme robotu kullanılabilir. Bazı borsa API'leri için... proxy=false Gereklidir.
Oyun: Düşük gecikme süresi ve kararlılık önemlidir. Oyunculara yakın bir konum kullanın. Oyuna bağlı olarak, Cloudflare Spectrum kullanmak veya hiç proxy kullanmamak karar verici bir faktördür.
Web ve API: Cloudflare'ı kullanarak proxy=true CDN, WAF ve DDoS koruması için önerilir. Bu durumda IP adresinin değiştirilmesi daha az kritiktir, ancak kaynak yönetilmelidir.
Çözüm
Yukarıda anlatılan yöntemleri kullanarak, EC2'den alınan IP adreslerine göre Cloudflare'deki DNS kayıtlarını otomatik ve güvenli bir şekilde güncelleyebilirsiniz.
- İtibaren API Token Sınırlı Cloudflare kullanın.
- İtibaren IAM Rolü Ve Sırlar Yöneticisi AWS'nin sunduğu avantajlardan yararlanın.
- Süreci sağlamlaştırmak için uygun kayıt tutma, izleme ve yeniden deneme mekanizmalarını uygulayın.
- Belirli ihtiyaçlar (ticaret, oyun, yapay zeka/görüntüleme) için, gecikmeyi azaltmak ve istikrarı artırmak amacıyla özel sunucular, DDoS saldırılarına karşı koruma ve optimize edilmiş konumlar kullanın.
Teknik yardım almaya istekli olmak
Profesyonel uygulama, doğru lokasyon seçimi veya AWS ve Cloudflare üzerinde güvenli dağıtım konusunda desteğe ihtiyacınız varsa, size özel bir çözüm ve tam destek sağlamak için teknik ekiple iletişime geçebilirsiniz.









