[HowTo] Plesk Dynamic DNS

biertragl

Member
Aus aktuellem Anlass stelle ich hier mal ein HOW-TO für alle Interessenten zusammen.
(wurde hier diskutiert)

Original-Anleitung:
Thema: Dynamic DNS
Oberfläche: Plesk 12.5
Betriebssystem: Debian Jessie 8.4
Domainhost: Artfiles
Eigener Server mit fester IP
Router zu Hause: Fritz!Box 7490

Folgende Variablen werden genutzt und müssen durch eigene Angaben ersetzt werden:
<DOMAIN> = Domain für den eigenen Nameserver
<DYNDOMAIN> = Domain für die spätere Dynamic DNS Nutzung (die, die auf euren Rechner daheim verlinken soll)
<SERVER-IP> = Statische IP eures Servers, wo Plesk läuft.
<SQL-PW> = Passwort des SQL-Users

Benötigt werden mind. 2 Domains und ein eigener Server mit Root-Zugang,
desweiteren einen eigenen Nameserver (Master) und einen Slave Nameserver.
In diesem Fall die eigene Domain als Master Nameserver, Arfiles als Slave.

Plesk:
Bei der Domain, welche als eigener Nameserver dienen soll, sind folgende
DNS-Einstellungen wichtig:

Code:
<DOMAIN> NS ns1.<DOMAIN>.
<DOMAIN> NS auth2.artfiles.de. (der Slave)
<DOMAIN> A <SERVER-IP>
Die TTL/SOA sollte angepasst werden:

Code:
TTL 3 Minuten
Aktualisieren 3 Minuten
Erneut versuchen 3 Minuten
Ablauf 1 Tag
Minimum-TTL 3 Minuten
Bei Tools & Einstellungen -> DNS-Zonen-Template müsst ihr nun noch
in den Transferbeschränkungen die IP des Slave eintragen. Hier: 212.48.125.53
-> die IP von auth2.artfiles.de

Artfiles:
Im Controlpanel von Artfiles Domains -> DNS-Zonen -> <DYNDOMAIN>
stellt folgendes ein:

Code:
Minimum TTL: 600 (niedriger geht bei artfiles nicht)
Typ: secondary
Master: <SERVER-IP>
Nameserver: ns1.<DOMAIN>.
                  auth2.artfiles.de.
die restlichen Felder sollten leer bleiben.
Dann auf Domains -> <DYNDOMAIN> -> bearbeiten -> Nameserver:
Code:
ns1.<DOMAIN>
auth2.artfiles.de
Im Anschluss auf "Domain updaten"
Ca. 15-30 Minuten müsst ihr warten, dann sollte dort "Update komplett" stehen und eure
<DYNDOMAIN> hat bei Denic.de nun die neuen Nameserver registriert. Ihr solltet nun 1 Tag abwarten, bis sich überall die TTL's aktualisiert haben und somit jegliche Änderungen innerhalb
von max. 10 Minuten aktiv werden.

Server:
Erstellt auf dem Server, wo Plesk läuft einen neuen User, welcher die DNS-Änderungen eintragen kann: (per SSH mit Rootrechten einloggen)
Code:
plesk db
CREATE USER 'dnsupdateuser'@'localhost' IDENTIFIED BY '<SQL-PW>';
GRANT SELECT, UPDATE (time_stamp, displayVal, val) ON `psa`.`dns_recs` TO 'dnsupdateuser'@'localhost';
GRANT SELECT, UPDATE (serial) ON `psa`.`dns_zone` TO
'dnsupdateuser'@'localhost';
exit
Plesk:
erstellt euch einen "Webspace" (z.b. ddns.<DOMAIN>) für 2 .php-Dateien und 1 Ordner, darüber schickt euer Router später die jeweils aktuelle IP. Auf den Webspace packt ihr schonmal eine
.htaccess-Datei mit folgendem Inhalt:
Code:
AuthType Basic
AuthName "Login"
AuthUserFile /var/www/vhosts/<DOMAIN>/ddns.<DOMAIN>/.htpasswd
Require valid-user
Options +Indexes
und generiert euch eine .htpasswd-Datei, welche ihr dann ebenfalls dort ablegt:
http://www.htaccesstools.com/htpasswd-generator/

Erstellt eine index.php:
PHP:
<?php

include 'mysql_config.php';

$dynDomains = array('<DYNDOMAIN>');

$newIP = $_SERVER['REMOTE_ADDR'];
$DoUpdateFile = "updatefile/doupdate";

if(!isset($_GET['domain'])){
    die('Parameter "domain" not set');
}
// Check if the requested domain is in our list of domains we want to keep updated.
if(! in_array($_GET['domain'], $dynDomains)){
    die('Requested domain is not in the list of maintained dyn domains.');
}

// Check if IP is really an IP (should always be the case, but just to be safe...)
if($newIP == "" || !preg_match_all("/(\d{1,3}\.){3}\d{1,3}/", $newIP, $matches )){
    die();   
}   

// We need to append a dot (.) to the end of the requested domain
$dyndns = $_GET['domain'] . '.';

$query = "SELECT id, val, dns_zone_id FROM dns_recs WHERE host = '$dyndns' AND type = 'A';";

$result = mysql_query($query);
$row = mysql_fetch_assoc($result);

$rowId = $row['id'];
$oldIP = $row['val'];
$dnsId = $row['dns_zone_id'];

if($oldIP == $newIP){
    echo "No update. IP has not changed since last update: " . $newIP;
    echo "good ".$newIP;
    die();
}

// Update IP

$newSerial = date("YmdH");

$updateQuery = "UPDATE dns_recs SET val = '$newIP', displayVal = '$newIP' WHERE id = '$rowId';";
$updated = mysql_query($updateQuery ) or die (mysql_error());

$updateQuery = "UPDATE dns_zone SET serial = '$newSerial' WHERE id = '$dnsId';";
$updated = mysql_query($updateQuery ) or die (mysql_error());

$updateDomain = $_GET['domain'] . ";";
# Create do-update file to notice cron job to update the DNS entry
file_put_contents($DoUpdateFile, $updateDomain, FILE_APPEND);

echo "good ".$newIP;

?>
Erstellt eine mysql_config.php:
PHP:
<?php

$server = "localhost";
$user_server = "dnsupdateuser";
$password_server = "<SQL_PW>";
$database= "psa";

$verbindung = mysql_connect ("$server", "$user_server", "$password_server")
or die ("connection failed. User and/or password incorrect.");

mysql_select_db("$database")
or die ("Database does not exist");

?>
legt ein Verzeichnis namens "updatefile" an (am besten über das Plesk Interface, dann
stimmen die Berechtigungen direkt)

Alle anderen Files und Ordner sollten gelöscht werden, sodass nur noch folgender Inhalt da ist:
.htaccess
.htpasswd
index.php
mysql_config.php
Ordner updatefile

Nun benötigen wir ein Shell-Skript, welches per Cronjob ausgeführt wird:
speichern unter: ~/dyndns.sh

#!/bin/bash

# we need bash here, because sh does no longer link to bash in debian
# and we want to use posix commands

# log file
logfile='/var/log/dynamicdns/dnsupdate.log'

# update file
updatefile='/var/www/vhosts/<DOMAIN>/ddns.<DOMAIN>/updatefile/doupdate'

## do things

# check the update file exists. If not, do not update DNS record

if [ ! -s $updatefile ]
then
echo "$(date -R) Update file doesn't exist. No update necessary. Quitting." >> "$logfile"
exit
fi

domainList=`cat $updatefile`

# Split domain list by ;
IFS=';' read -ra domainsArr <<< "$domainList"

# Iterate over all domains in the array and update them one by one
for domain in "${domainsArr[@]}"; do

echo "$(date -R) Updating DNS entry for $domain" >> "$logfile"

# Update DNS entry for $domain via PLESK
/opt/psa/admin/bin/dnsmng --update $domain

done

# delete update file
rm $updatefile
Das ganze noch ausführbar machen:
Code:
chmod +x ~/dyndns.sh
Das Verzeichnis für die Logdatei anlegen:
Code:
mkdir var/log/dynamicdns/
Cronjob einfügen:
Code:
crontab -e
Code:
*       *       *       *       *       ~/dyndns.sh
Das war's auch eigentlich schon.

Jetzt müsst ihr euren Router noch für das Dynamische DNS einstellen. In meinem Fall
die Fritzbox. Internet -> Freigaben -> Dynamic DNS
Haken bei "Dynamic DNS benutzen" reinmachen
Code:
Dynamic DNS-Anbieter: Benutzerdefiniert
Update-URL: http://ddns.<DOMAIN>/?domain=<DYNDOMAIN>
Domainname: fritz.box
Benutzername: den Username aus der .htpasswd
Kennwort: das Kennwort aus der .htpasswd
Ein letzter Klick auf "Übernehmen" und das ganze sollte funktionieren.
Habe ich hier einen Fehler gemacht, dann bitte bescheid geben.

Ansonsten geht ein großer Dank an den Ersteller der Original-Anleitung (welche ich in Zusammenarbeit mit Forenusern von hier umgebaut habe)

danton
reccon
schtebo


Herzlichen Dank!
 
Last edited by a moderator:
Top