Bisher habe ich in meiner FRITZ!Box als DynDNS Provider immer dyndns.org verwendet und hatte dort einen kostenlosen Hostnamen. Schon länger aber spielte ich mit dem Gedanken hierfür nicht dyndns.org zu verwenden, sondern eine eigene Sumdomain unter thomas-klumpp.de hierzu zu verwenden.
Meine Domain habe ich bei inwx.de registriert und da ich keine eigenen Nameserver betreibe nutze ich die Nameserver von INWX. INWX bietet eine XML-RPC Schnittstelle an um Änderungen an der Konfiguration, in meinem Fall am Nameserver, vorzunehmen. Am einfachsten erschien mir hier die Verwendung von PHP als Programmiersprache.
Glücklicherweise bietet meine FRITZ!Box neben den gängigen DynDNS Providern auch eine “Benutzerdefiniert” Option, bei der man seine eigene Ziel-URL eintragen kann.
In der FRITZ!Box-Hilfe sind die Platzhalter definiert die in der URL durch die Parameter ersetzt werden.
Hier mal ein Beispiel:
https://www.mein-webspace.de/unterordner/update-inwx.php?domain=&user= &password= &ip4addr=
Es empfielt sich an dieser Stelle https zu verwenden um die Transportsicherheit des Passwortes in der URL zu garantieren.
Auf dem Server das zugehörige PHP-Script sieht die folgt aus:
< ?php
/*
* update-inwx.php - Update INWX Nameserver-Record
*
* Mit diesem Script kann man einen Nameserver-Record beim Provider inwx.de updaten.
*
* by Thomas klumpp
*/
header('Content-type: text/plain; charset=utf-8');
error_reporting(E_ALL);
require "domrobot.class.php";
define("APIURL", "https://api.domrobot.com/xmlrpc/");
//GET variablen aus url holen
$usr = $_GET['user'];
$pwd = $_GET['password'];
$domain = $_GET['domain'];
$ip4addr = $_GET['ip4addr'];
//main
try {
$recordId = requestRecordId($domain);
updateRecord($recordId, $ip4addr);
} catch (Exception $e) {
print $e->getMessage();
}
/**
* Fragt die eindeutige Nameserver-Record ID ab
*
* @param String $domain enthält den abzufragenden Domainnamen
* @return int ID liefert die unique ID des Nameserver-Records
*/
function requestRecordId($domain) {
//globale variablen abrufen
global $usr;
global $pwd;
//domrobot object instanziieren und einloggen
$domrobot = new domrobot(APIURL);
$domrobot->setDebug(false);
$domrobot->setLanguage('de');
$res = $domrobot->login($usr,$pwd);
//domain zerlegen
$domain_exploded = explode(".", $domain);
$domain_exploded_length = count($domain_exploded);
$domain = $domain_exploded[$domain_exploded_length - 2] . "." . $domain_exploded[$domain_exploded_length - 1];
unset($domain_exploded[$domain_exploded_length - 1]);
unset($domain_exploded[$domain_exploded_length - 2]);
$name= implode(".", $domain_exploded);
//do request
if ($res['code']==1000) {
$obj = "nameserver";
$meth = "info";
$params = array();
$params['domain'] = $domain;
$params['name'] = $name;
$res = $domrobot->call($obj,$meth,$params);
$recordId = $res['resData']['record'][0]['id'];
if ($recordId != "")
return $recordId;
else
throw new Exception('domain or name not found');
} else {
throw new Exception('connection error occured');
}
$res = $domrobot->logout();
}
/**
* Setzt die IP-Adresse in den entsprechenen Nameserver-Record
*
* @param int $recordId enthält die unique ID des Nameserver-Records
* @param String $ip4addr enthält die zu setzende IP-Adresse
*/
function updateRecord($recordId, $ip4addr) {
//globale variablen abrufen
global $usr;
global $pwd;
//domrobot object instanziieren und einloggen
$domrobot = new domrobot(APIURL);
$domrobot->setDebug(false);
$domrobot->setLanguage('de');
$res = $domrobot->login($usr,$pwd);
//do update
if ($res['code']==1000) {
$obj = "nameserver";
$meth = "updateRecord";
$params = array();
$params['id'] = $recordId;
$params['content'] = $ip4addr;
$res = $domrobot->call($obj,$meth,$params);
} else {
throw new Exception('connection error occured');
}
$res = $domrobot->logout();
}
?>
Der gewünschte Hostname muss vorher über die Konfigurationsoberfläche von inwx.de angelegt werden!
Den kompletten Code gibt es hier als Download:
DynDNS-INWX.zip



