Mit einem eigenen Webserver bei DigitalOcean kannst Du Dir Dein eigenes Dynamic DNS (DynDNS) mit PHP erstellen. Wie das geht, erfährst Du in diesem Beitrag.

Zunächst brauchst Du einen Webserver bei Digital Ocean. Mit der Digital Ocean API kannst Du die DNS-Einstellungen Deiner Subdomain entsprechend ändern. Als Grundlage diente mir dieses Script von Digital Ocean.

Die Implementierung ist sehr rudimentär, erfüllt jedoch ihren Zweck.

Zunächst brauchst Du eine .htaccess Datei mit folgendem Inhalt.
Diese Datei sorgt dafür, dass sämtliche Anfragen an die Datei index.php weitergeleitet werden.

RewriteEngine on
RewriteCond %{REQUEST_FILENAME} !-f
RewriteCond %{REQUEST_FILENAME} !-d
RewriteRule ^.*$ /index.php [L,QSA]

Hier der Code für die index.php. Bitte ersetze entsprechend die API-Daten.
Am Anfang des Scripts schreibe ich noch Log-Dateien auf meinen Server, das kannst Du gerne löschen.

$file = 'log.txt';
$date = date("Y-m-d H:i:s"). " -- " . $_SERVER['REMOTE_ADDR'] . "\n"; 
$getdata = "GET: " . json_encode($_GET) . "\n";
$postdata = "POST: " . json_encode($_POST) . "\n";

file_put_contents($file, $date, FILE_APPEND );
file_put_contents($file, $_SERVER['REQUEST_URI'] . "\n", FILE_APPEND );
file_put_contents($file, $getdata, FILE_APPEND );
file_put_contents($file, $postdata, FILE_APPEND );

if($_SERVER['REQUEST_METHOD'] == 'PUT') {
    parse_str(file_get_contents("php://input"),$post_vars);
    $putdata = "PUT: " . json_encode($post_vars) . "\n";
	file_put_contents($file, $putdata, FILE_APPEND );
}

function getWebPage($url)
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, CURL_TIMEOUT);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
    $data = curl_exec($ch);
    curl_close($ch);
    return $data;
}

function getRecord($page = null)
{
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, API_URL . 'domains/' . DOMAIN . '/records' . ($page != null ? '?page=' . $page : ''));
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, CURL_TIMEOUT);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array('Authorization: Bearer ' . ACCESS_TOKEN));

    $data = curl_exec($ch);
    $info = curl_getinfo($ch);

    $responseCode = $info['http_code'];
    curl_close($ch);

    if ($data === false || $responseCode !== 200) {
        return false;
    }

    $dataJson = json_decode($data, true);

    foreach ($dataJson['domain_records'] as $record) {
        if ($record['name'] === RECORD && $record['type'] === RTYPE) {
            return $record;
        }
    }

    if (isset($dataJson['links']['pages']['next']) && $dataJson['links']['pages']['next'] != '') {
        preg_match('/page=(?\d+)/i', $dataJson['links']['pages']['next'], $match);
        if (isset($match['page_number']) && $match['page_number'] != '') {
            return getRecord($match['page_number']);
        }
    }

    return false;
}

function setRecordIP($record, $ipAddress)
{
    $data = json_encode(array(
        'data' => $ipAddress
    ));

    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, API_URL . 'domains/' . DOMAIN . '/records/' . $record['id']);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "PUT");
    curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
    curl_setopt($ch, CURLOPT_CONNECTTIMEOUT, CURL_TIMEOUT);
    curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
    curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 2);
    curl_setopt($ch, CURLOPT_HTTPHEADER, array(
        'Authorization: Bearer ' . ACCESS_TOKEN,
        'Content-Type: application/json',
        'Content-Length: ' . strlen($data)
    ));

    $data = curl_exec($ch);
    curl_close($ch);
    return ($data !== false);
}

function updateDynDNS($hostname, $ip) {

	DEFINE('DOMAIN', $hostname[1] . '.' . $hostname[2]);
	DEFINE('RECORD', $hostname[0]);

	$record = getRecord();	

	if ($record['data'] != $ip) {
	
	    setRecordIP($record, $ip);
	    echo 'good ' . $ip;

	} else {

		echo 'nochg ' . $ip;		
		
	}
	
}
/*****************************************************/

DEFINE('ACCESS_TOKEN', 'GEHIMERAPITOKEN');
DEFINE('RTYPE', 'A');
DEFINE('CURL_TIMEOUT', 15);
DEFINE('IPV4_REGEX', '/(\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3})/');
DEFINE('API_URL', "https://api.digitalocean.com/v2/");

/*****************************************************/


if ( !isset($_SERVER['PHP_AUTH_USER']) ) {
    header('WWW-Authenticate: Basic realm="Login"');
    header('HTTP/1.0 401 Unauthorized');
    echo 'badauth';
    exit;
} 

$username = $_SERVER['PHP_AUTH_USER'];
$password = $_SERVER['PHP_AUTH_PW'];

if ( !isset($_GET['hostname']) && !isset($_GET['myip']) ) {
	die('911');
	exit;
}

$hostname = explode('.',  $_GET['hostname']);
if ( !count($hostname) == 3 ) {
	die('notfqdn');
	exit;
}

$myip = $_GET['myip'];
if ( !filter_var($myip, FILTER_VALIDATE_IP) ) {
	die('911');
	exit;
}

if ($username == "USERNAME" && $password == 'GEHEIM') {
	updateDynDNS($hostname, $myip);
}

In Deinem Router oder Security Gateway kannst Du dann einfach die URL Deines eigenen DynDNS Services eingeben:

Viel Spaß mit Deinem eigenen DynDNS Service.