Cloudflare Toplu Ip Güncelleme ve Cloudflare API Kullanımı

Merhaba yine yaşamış olduğum bir olay üstüne Cloudflare hesabımda bulunan sitelerde topluca ip adresi değiştirme ihtiyacım doğdu ve bu ihtiyacım birden fazla kez olunca bunu en kolay nasıl yaparım dedim ve araştırmaya koyuldum Cloudflare API’leri ile bunu kolayca yapabileceğimi buldum ve bu kodu yazdım.

Cloudflare Nedir ve Neden Kullanmalıyız?

Cloudflare, internet siteleri için hız, güvenlik ve performans sağlayan bir içerik dağıtım ağı (CDN) ve DDoS koruma hizmetidir. Web sitelerinin yüklenme sürelerini hızlandırır, güvenlik tehditlerine karşı koruma sağlar ve sunucu yükünü azaltır. Cloudflare, küresel bir sunucu ağı üzerinden gelen istekleri optimize ederek web sitelerinin performansını artırır ve kullanıcı deneyimini geliştirir.

Cloudflare’ın sunduğu bazı önemli özellikler şunlardır:

  • Güvenlik: DDoS saldırılarına karşı koruma sağlar ve zararlı trafik engellenir.
  • Performans: İçerik dağıtım ağı sayesinde web siteleri daha hızlı yüklenir.
  • Güvenli DNS: DNS sunucularını güvence altına alır ve DNS yönlendirme işlemlerini hızlandırır.
  • SSL/TLS Şifreleme: HTTPS trafiği için ücretsiz SSL sertifikası sunar.

Her sitemde mutlaka Cloudflare kullanıyorum bunuda belirtmiş olayım.

Cloudflare API Kullanımı

Öncelikle dökümantasyonun linkini bu yazının en altında bulabilirsiniz.

Benim işim tamamen ip değiştirmek üzerine olacağı için DNS kayıtlarını değiştirmek üzerine olacağı için apinin bu kısmı ile ilgileneceğim.

Cloudflare API Token Alma

Api tokeni almak için : https://dash.cloudflare.com/profile/api-tokens

Veya yukarıdaki resimde belirtildiği gibi aynı yere gidebilirsiniz.

Daha sonrasında “API Tokens” sekmesine gelerek

Create Token diyebilirsiniz.

Burada hazır şablonlar bulunmak biz “Edit zone DNS” olanı kullanacağız.

Burada ayarlarımız hazır geldi dilerseniz ekstra ayar yapabilirsiniz. Örnek veriyorum “Zone Resources” kısmında istediğinize göre şekillendirebilirsiniz.

Örnek olmasın için şunu yaptım. “Include” ile tüm domainleri dahil ettim yani benim hesabıma bağlı tüm hesapları dahil ettim buna bağlı müşteri hesapları veya başka hesaplar varsa onlarda dahil oluyor ve daha sonra “Exclude” ile spesifik olarak seçmiş olduğum domaini çıkardım “baristeksin.com.tr” adresini yani artık bu şekilde bu api baristeksin.com.tr adresine erişim sağlayamayacak ama onun dışında görebildiği tüm domainlerin DNS kayıtlarına erişim sağlayabilecek.

“Create Token” diyerek tokenimi oluşturdum.

Buradan tokeni kopyalayıp not edin.

Kodlama Kısmı (PHP)

<?php

$secret_key = 'Baris';
$api_auth = 'Bearer Token_Gelecek';

# get old and new ip with url get parameter
$old_ip = $_GET['old_ip'];
$new_ip = $_GET['new_ip'];
$get_secret_key = $_GET['secret_key'];

if ($get_secret_key != $secret_key) {
    die('Invalid secret key');
}

function curlfn($url, $method, $headers, $data) {
    $curl = curl_init();
    curl_setopt_array($curl, array(
        CURLOPT_URL => $url,
        CURLOPT_RETURNTRANSFER => true,
        CURLOPT_ENCODING => '',
        CURLOPT_MAXREDIRS => 10,
        CURLOPT_TIMEOUT => 0,
        CURLOPT_FOLLOWLOCATION => true,
        CURLOPT_CUSTOMREQUEST => $method,
        CURLOPT_HTTPHEADER => $headers,
        CURLOPT_POSTFIELDS => $data,
    ));
    $response = curl_exec($curl);
    curl_close($curl);
    return $response;
}


$header_array = array(
    'Authorization: ' . $api_auth,
    'Content-Type: application/json',
);


$response = curlfn('https://api.cloudflare.com/client/v4/zones?page=1', 'GET', $header_array, '');
$response_data = json_decode($response);

$total_count = $response_data->result_info->total_count; // Toplam kayıt sayısı
$per_page = $response_data->result_info->per_page; // Sayfa başına kayıt sayısı
$total_pages = ceil($total_count / $per_page); // Toplam sayfa sayısını hesapla

echo "Toplam sayfa sayısı:".$total_pages."<br>------------------<br>";

for ($page = 1; $page <= $total_pages; $page++) {
    // Her sayfa için istekte bulunuyoruz
    $paged_response = curlfn("https://api.cloudflare.com/client/v4/zones?page=$page", 'GET', $header_array, '');
    $paged_data = json_decode($paged_response);
    echo "Sayfa numarası: ".$page."<br>";
    
    foreach ($paged_data->result as $zone) {
        $zone_id = $zone->id;
        $zone_name = $zone->name;
        $req_url = 'https://api.cloudflare.com/client/v4/zones/' . $zone_id . '/dns_records';
        $response = curlfn($req_url, 'GET', $header_array, '');
        $dns_records = json_decode($response)->result;
        foreach ($dns_records as $dns_record) {
            $dns_record_id = $dns_record->id;
            $dns_record_name = $dns_record->name;
            $dns_record_content = $dns_record->content;
            $dns_record_proxied = $dns_record->proxied;
            $req_url = 'https://api.cloudflare.com/client/v4/zones/' . $zone_id . '/dns_records/' . $dns_record_id;
            if ($dns_record->type == 'A') {
                if ($dns_record_content == $old_ip) {
                    $data = array(
                        'type' => 'A',
                        'name' => $dns_record_name,
                        'content' => $new_ip,
                        'proxied' => $dns_record_proxied
                    );
                    $response = curlfn($req_url, 'PUT', $header_array, json_encode($data));
                    echo $zone_name . ' A record updated' . '<br>';
                }
            }else if ($dns_record->type == 'TXT'){
                # if old ip is in the txt record
                if (strpos($dns_record_content, $old_ip) !== false) {
                    $data = array(
                        'type' => 'TXT',
                        'name' => $dns_record_name,
                        'content' => str_replace($old_ip, $new_ip, $dns_record_content),
                        'proxied' => $dns_record_proxied
                    );
                    $response = curlfn($req_url, 'PUT', $header_array, json_encode($data));
                    echo $zone_name . ' TXT record updated' . '<br>';
                }
            }
        }
    }

}
?>

Kodun tamamı bu şekilde

$secret_key = 'Baris';
$api_auth = 'Bearer Token_Gelecek';

Kendiniz için bir Secret Key belirleyin ve yukarıdaki ile değiştirin daha sonrasında dışarıdan yetkisiz erişimi engellemek için bunu kullanacaksınız.

api_auth kısmında ise “Bearer ” alanını silmeyin!

Kodun Testi ve Çalıştırılması

Kodumuzu baristeksin.com.tr sitemize yüklediğimizi varsayıyoruz.

Site: baristeksin.com.tr

Secret Key: Baris

Eski Ip: 192.168.1.1

Yeni Ip: 192.168.1.2

Dosya Adı: cloudflare.php

cloudflare.php?secret_key=Baris&old_ip=192.168.1.1&new_ip=192.168.1.2

Bu formatta linke erişim sağlarsanız otomatik olarak DNS kayıtlarınızda bulunan “A” ve “Txt” kayıtlarınızın içindeki ip adresleriniz toplu olarak yeni ip adresine güncellenir.

Örnek url:

https://www.baristeksin.com.tr/cloudflare.php?secret_key=Baris&old_ip=192.168.1.1&new_ip=192.168.1.2

Cloudflare API Dökümantasyonu : https://developers.cloudflare.com/api/

“Cloudflare Toplu Ip Güncelleme ve Cloudflare API Kullanımı” üzerine bir yorum

Yorum yapın