Cloudflare DNS => (Kostenloses Dynamisches DNS*)

Mit Hilfe dieses Scripts lässt sich ein DNS-Eintrag in Cloudflare ( https://www.cloudflare.com ) updaten. Dadurch hat man die Möglichkeit sich sein eigenes Dynamisches DNS aufzubauen.
Sofern man bereits Inhaber einer Domain ist, ist der DNS-Service bei Cloudflare kostenlos (*).

Den API-Key gibt es bei Cloudflare übrigens unter: My Settings ==> Account ==> API Key ==> Global API Key

Der Proxyservice sorgt hierbei auch noch für ein gültiges SSL-Zertifikat :slight_smile:

Die Eigene IP liese ja glaube ich jeder von uns eh schon aus seinem Router oder von wieistmeineip aus :wink:

Wenn das Update nicht erfolgreich war wird der Fehler mit echo ausgegeben und das Script abgebrochen.

<?
// Cloudflare DNS Update vis API V4
$apiKey = "6c0cbf5029aed0af395ac4b864c6b0956c0cb";     	// API Key
$email = "mail@domain.de";								// E-Mail-Adresse

$zone = "domain.de"; 									// Domain
$dnsRecord = "subdomain.domain.de"; 					// DNS-Record der geändert werden soll 

$ip = GetValue(1234 /*[IP-Adresse]*/);  				// IP-Adresse
														   

$enableProxy = "false";		// Aktiviert den Proxy-Service von Cloudflare für diesen DNS-Eintrag  
$ttl = 120;                 // TTl des Eintrags in Sekunden (mindestens 120)
$type = "A";   			// Record-Typ IPV4 => "A" IPv6 => "AAAA"

// Ab hier braucht nichts mehr geändert zu werden
$zoneId ="";
$recordId= "";

// get Zone ID
{
$curl = curl_init();
																		a
curl_setopt_array($curl, array(
  CURLOPT_URL => "https://api.cloudflare.com/client/v4/zones",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "GET",
  CURLOPT_HTTPHEADER => array(
    "cache-control: no-cache",
    "x-auth-email: ".$email,
    "x-auth-key: ".$apiKey
  ),
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  $obj = json_decode($response,true);
  if( $obj["success"]!=1)
  {
  echo "GetZoneId Failed";
  die;
  }
  $zones =($obj['result']);

 foreach($zones as $zoneResult) {
    if($zoneResult['name']==$zone)
		$zoneId = $zoneResult['id'];
}
  if ($zoneId =="")
  {
  	echo "Zone not found. Zones: </br> "   ;
			 foreach($zones as $zoneResult) {
 		echo $zoneResult['name'] ." </br>" ;        }
  	die;
  }
}
}

{
$curl = curl_init();

curl_setopt_array($curl, array(
  CURLOPT_URL => "https://api.cloudflare.com/client/v4/zones/".$zoneId."/dns_records",
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "GET",
  CURLOPT_HTTPHEADER => array(
    "cache-control: no-cache",
    "x-auth-email: ".$email,
    "x-auth-key: ".$apiKey
  ),
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {

$obj = json_decode($response,true);
  if( $obj["success"]!=1)
  {
  echo "GetRecordID Failed";
  die;
  }
  $zones =($obj['result']);

 foreach($zones as $zoneResult) {
    if($zoneResult['name'] == $dnsRecord)
		$recordId = $zoneResult['id'];
}
  if ($recordId =="")    {
  	echo "Record not found. Records: </br>"   ;
			 foreach($zones as $zoneResult) {
    echo $zoneResult['name']. " </br>"      ;}
  	die;
}             }
}

{
	$curl = curl_init();
curl_setopt_array($curl, array(
  CURLOPT_URL => "https://api.cloudflare.com/client/v4/zones/".$zoneId."/dns_records/".$recordId ,
  CURLOPT_RETURNTRANSFER => true,
  CURLOPT_ENCODING => "",
  CURLOPT_MAXREDIRS => 10,
  CURLOPT_TIMEOUT => 30,
  CURLOPT_HTTP_VERSION => CURL_HTTP_VERSION_1_1,
  CURLOPT_CUSTOMREQUEST => "PUT",
  CURLOPT_POSTFIELDS => "{
\"id\":\"".$recordId."\",
\"type\":\"".$type."\",
\"name\":\"".$dnsRecord."\",
\"content\":\"".$ip."\",
\"proxiable\":true,
\"proxied\":".$enableProxy.",
\"ttl\":".$ttl.",
\"locked\":false,
\"zone_id\":\"".$zoneId."\",
\"zone_name\":\"".$zone."\"
}",

  CURLOPT_HTTPHEADER => array(
    "cache-control: no-cache",
    "content-type: application/json",
    "x-auth-email:".$email,
    "x-auth-key: ".$apiKey
  ),
));

$response = curl_exec($curl);
$err = curl_error($curl);

curl_close($curl);

if ($err) {
  echo "cURL Error #:" . $err;
} else {
  $obj = json_decode($response);
  if( $obj->{'success'}==1)
  echo "Update von ".$dnsRecord." auf ".$ip. " erfolgreich";
}
}