Hi, wollte mal das allseits beliebte Thema nochmal aufgreifen, nachdem es ziemlich still geworden ist dazu. In einem korrekt aufgesetzten Demo-Setup habe ich versucht, die Infos der anderen, teils schon recht alten Threads, zusammenzuführen. Kurz zum Setup: Es besteht aus einer VM mit ISPConfig unter Debian 10. Die angelegten Domains sind über Internet erreichbar inkl. Let's Encrypt Wildcard-Zertifikat (über eine zweite VM mit nignx Reverse Proxy inkl. korrekter IP-Adressübergabe der aufrufenden Clients).
Was geht: Ich kann per URL auf einem LAN- oder WAN-Client einen bestehenden DNS Record updaten.
Was nicht geht: Ich kann über diesen Client keinen neuen Record erstellen lassen. Why?
Das Script habe ich komplett neu geschrieben, angeleitet von den zwei github-Versionen, die aber schon eine gewisse Zeit auf dem Buckel haben. (Bitte habt Nachsehen, bin absoluter PHP-Neuling.)
https://github.com/superlinuxero/ddns-update-for-ispconfig
https://github.com/DIXINFOR/ddns-update-for-ispconfig (aus dem Google Cache)
Was geht: Ich kann per URL auf einem LAN- oder WAN-Client einen bestehenden DNS Record updaten.
Was nicht geht: Ich kann über diesen Client keinen neuen Record erstellen lassen. Why?
Das Script habe ich komplett neu geschrieben, angeleitet von den zwei github-Versionen, die aber schon eine gewisse Zeit auf dem Buckel haben. (Bitte habt Nachsehen, bin absoluter PHP-Neuling.)
https://github.com/superlinuxero/ddns-update-for-ispconfig
https://github.com/DIXINFOR/ddns-update-for-ispconfig (aus dem Google Cache)
PHP:
<?php
require_once('log.inc.php');
// ISPConfig URL for REMOTE API
$soap_location = 'https://localhost:8080/remote/index.php';
$soap_uri = 'https://localhost:8080/remote/';
$zone = "meinedomain.tld."; // Punkt am Ende!!!
$log = new log("dyndns");
$log->debug("Session started by ".$_SERVER["REMOTE_ADDR"]);
if(isset($_GET["user"]) && !empty($_GET["user"])){
$user=$_GET["user"];
} else {
$log->debug("Kein USERNAME!");
echo "badagent";
exit;
}
if(isset($_GET["pwd"]) && !empty($_GET["pwd"])){
$pwd=$_GET["pwd"];
} else {
$log->debug("Kein PASSWORD!");
echo "badagent";
exit;
}
if(isset($_GET["ddomain"]) && !empty($_GET["ddomain"])){
$ddomain=$_GET["ddomain"];
} else {
$log->debug("Keine DDOMAIN!");
echo "dnserr";
exit;
}
// TODO: Auf verbotene Sub-Domains prüfen! (ns1, ns2, www etc.) -> echo "abuse";
if(isset($_GET["ip"]) && !empty($_GET["ip"])){
$ip=$_GET["ip"];
} else {
$ip=$_SERVER["HTTP_X_FORWARDED_FOR"];
}
if(!filter_var($ip, FILTER_VALIDATE_IP, FILTER_FLAG_IPV4)) {
$log->debug("Keine valide IPv4-Adresse!");
echo "dnserr";
exit;
}
$log->debug("USER = ".$user.", PWD = ".$pwd.", DDOMAIN = ".$ddomain.", IP = ".$ip);
$context = stream_context_create(array(
'ssl' => array(
'verify_peer' => false,
'verify_peer_name' => false,
)
));
$client = new SoapClient(null, array('location' => $soap_location,
'uri' => $soap_uri,
'trace' => 1,
'exceptions' => 1,
'stream_context' => $context));
try {
if($session_id = $client->login($user,$pwd)){
$log->debug('Login OK. Session ID ='.$session_id);
// Prüfen, ob Record schon existiert und merken, wenn ja.
$record_exists=false;
$id=0;
do {
$id++;
$dns_record = $client->dns_a_get($session_id, $id);
$record_exists = ($ddomain==$dns_record["name"]);
} while (!empty($dns_record) && !$record_exists);
if($record_exists){
if($dns_record["type"] == "A"){
if ($dns_record["data"] != $ip){
$dns_record["data"] = $ip;
$dns_record["serial"] = (int)$dns_record["serial"]+1;
// TODO: Korrekte SN ermitteln nach Datum + hochzählen.
$affected_rows = $client->dns_a_update($session_id, $client_id, $id, $dns_record);
$log->debug("Affected Rows = ".$affected_rows.", neue SN = ".$dns_record["serial"]);
echo "good";
} else {
echo "nochg";
}
} else {
$log->debug("DNS-Record existiert bereits aber falscher Typ!");
echo "dnserr";
exit;
}
} else {
$log->debug("DNS-Record existiert noch nicht.");
$params = array(
'server_id' => $dns_record["server_id"],
'zone' => $dns_record["zone"],
'name' => $ddomain,
'type' => 'A',
'data' => $ip,
'aux' => '0',
'ttl' => '3600',
'active' => 'y',
'stamp' => date("Y-m-d h:i:s"),
'serial' => '1'
);
// Hier hakt's! Why???
$id = $client->dns_a_add($session_id, $client_id, $params);
$dns_record = $client->dns_zone_get($session_id, $id);
$affected_rows = $client->dns_zone_update($session_id, $client_id, $id, $dns_record);
$log->debug("Number of records that have been changed in the database: ".$affected_rows);
echo "good";
}
} else { echo "badauth"; }
} catch (SoapFault $e) {
echo $client->__getLastResponse();
die('SOAP Error: '.$e->getMessage());
}
// TODO: Logouts der Sessions.
?>