Eigenen DynDNS Server: Unterschied zwischen den Versionen
(37 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt) | |||
Zeile 1: | Zeile 1: | ||
== Allgemein == | |||
Um einen anderen DNS Namen auf den dynamischen weiter zu leiten, ist im DNS-Server noch eine Eintrag vom Type <code>CNAME</code> notwendig: | |||
== | {| class="wikitable" | ||
!| Name | |||
!| Typ | |||
!| Inhalt | |||
!| TTL | |||
|- | |||
| test.kirner.or.at | |||
| CNAME | |||
| test.dynamic-dns.at | |||
| 1800 | |||
|} | |||
Siehe dazu auch [[Bind_Konfiguration_(Linux)#Eintrag_auf_externe_Dom%C3%A4ne_mittels_CNAME|Bind Konfiguration (Linux)#Eintrag auf externe Domäne mittels CNAME]] | |||
== Update über direkten Datenbankzugriff == | |||
=== Voraussetzungen === | |||
Dieses Tutorials setzt einen DNS-Server voraus, der seine Daten aus einem MySQL-Backend bezieht. In diesem Tutorial wurde [[PowerDNS (Ubuntu)|PowerDNS]] verwendet. | |||
=== Datenbank erstellen === | === Datenbank erstellen === | ||
Um die Passwörter für die DDNS-Hosts über das SQL-Web-Frontend [[PhpMyAdmin (Ubuntu)|PhpMyAdmin]] bearbeiten zu können, habe ich diese in eine Datenbank ausgelagert. | |||
Dazu erstellen wir eine Datenbank ''ddns'' und verwenden der Einfachheit den selben Benutzer wie für die ''powerdns''-Datenbank: | |||
<pre> | <pre> | ||
create database if not exists ddns; | create database if not exists ddns; | ||
grant all on ddns.* to 'powerdns'@' | grant all on ddns.* to 'powerdns'@'%'; | ||
</pre> | </pre> | ||
Die Tabelle ''ddns_hosts'' enthält 2 Spalten für ''hostname'' und ''password'': | |||
<pre> | <pre> | ||
CREATE TABLE | CREATE TABLE ddns_hosts ( | ||
id INT NOT NULL AUTO_INCREMENT, | id INT NOT NULL AUTO_INCREMENT, | ||
hostname VARCHAR(64) NOT NULL, | |||
password VARCHAR(64) NOT NULL, | password VARCHAR(64) NOT NULL, | ||
PRIMARY KEY (id) | PRIMARY KEY (id) | ||
); | ); | ||
</pre> | |||
Zum Testen noch einen Testeintrag: | |||
<pre> | |||
INSERT INTO ddns_hosts ( hostname, password ) VALUES ( 'zuhause', 'abc123' ); | |||
</pre> | </pre> | ||
=== Script === | === Script === | ||
<pre> | |||
sudo vi /var/www/ddns/index.php | |||
</pre> | |||
<pre> | <pre> | ||
<?php | <?php | ||
$ | /* ============================== Change according to your environment ================================== */ | ||
$DATABASE_SERVER = "<ip address>"; | |||
$DATABASE_USER = "powerdns"; | |||
$DATABASE_PASSWORD = "<password>"; | |||
$DATABASE_DB_DDNS = "ddns"; | |||
$DATABASE_DB_POWERDNS = "powerdns"; | |||
$ROOT_DOMAIN="dynamic-dns.at"; | |||
/* ========================================== Do not change ============================================== */ | |||
$mysqli = new mysqli($DATABASE_SERVER, $DATABASE_USER, $DATABASE_PASSWORD, $DATABASE_DB_DDNS); | |||
/* check connection */ | /* check connection */ | ||
if (mysqli_connect_errno()) { | if (mysqli_connect_errno()) { | ||
die(" | die("Connection failed: " . mysqli_connect_error()); | ||
} | } | ||
$pass1=$mysqli-> | $host = mysqli_real_escape_string($mysqli, $_SERVER['PHP_AUTH_USER']); | ||
//$ | $pass1 = mysqli_real_escape_string($mysqli, $_SERVER['PHP_AUTH_PW']); | ||
$ip=$_SERVER[' | |||
$ | /* Select queries return a resultset */ | ||
if ($query = $mysqli->query("SELECT password FROM ddns_hosts WHERE hostname = '" . $host . "'")) { | |||
if ($row = mysqli_fetch_assoc($query)) { | |||
$pass2 = $row["password"]; | |||
$ | } else { | ||
invalidCredentials(); | |||
} | |||
$ | |||
/* free result set */ | |||
$query->close(); | |||
} else { | |||
printf("Invalid query: %s\n", mysqli_error($mysqli)); | |||
exit(); | |||
} | |||
if ($pass1 != $pass2) { | |||
invalidCredentials(); | |||
} else { | |||
/* change db to powerdns_admin db */ | |||
$mysqli->select_db($DATABASE_DB_POWERDNS); | |||
if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { | |||
$ip=$_SERVER['HTTP_X_FORWARDED_FOR']; | |||
} else { | |||
$ip=$_SERVER['REMOTE_ADDR']; | |||
} | |||
$domain=$host.".".$ROOT_DOMAIN; | |||
//$domain2="*.".$ROOT_DOMAIN; | |||
if (!$result1 = $mysqli->query("UPDATE records SET content='$ip' WHERE name='$domain';")) { | |||
printf("Invalid query: %s\n", mysqli_error($mysqli)); | |||
exit(); | |||
} | |||
//$result2=mysql_query("UPDATE records SET content='$ip' WHERE name='$domain2';"); | |||
print("Success."); | |||
} | } | ||
function invalidCredentials() { | |||
die("Wrong password or unknown host!"); | |||
} | } | ||
?> | ?> | ||
</pre> | </pre> | ||
=== Testen === | |||
Zum Testen rufen wir das Script im Browser auf (Anführungszeichen beachten): | |||
<pre> | <pre> | ||
http:// | curl "http://zuhause:abc123@update.dns1.dynamic-dns.at" | ||
</pre> | </pre> | ||
Bei erfolgreichen Update sollte ''Success.'' ausgegeben werden. Bei falschen Zugangsdaten ''Wrong password or unknown host!''. | |||
=== Router === | |||
== Links == | ==== DD-WRT ==== | ||
[https://wiki.dd-wrt.com/wiki/index.php/Dynamic_DNS#Custom_.28URL_Updates.29 https://wiki.dd-wrt.com/wiki/index.php/Dynamic_DNS#Custom_.28URL_Updates.29] | |||
=== Links === | |||
[https://klenzel.de/1575 https://klenzel.de/1575] | [https://klenzel.de/1575 https://klenzel.de/1575] | ||
[https://www.debacher.de/wiki/Mein_eigenes_DynDNS https://www.debacher.de/wiki/Mein_eigenes_DynDNS] | [https://www.debacher.de/wiki/Mein_eigenes_DynDNS https://www.debacher.de/wiki/Mein_eigenes_DynDNS] | ||
== Update per nsupdate == | |||
Siehe auch [[PowerDNS nsupdate (Ubuntu)|PowerDNS nsupdate]] | |||
=== Links === | |||
[https://controlc.de/2013/09/10/debian-selbstgehosteter-dyndns-dienst/ https://controlc.de/2013/09/10/debian-selbstgehosteter-dyndns-dienst/] | [https://controlc.de/2013/09/10/debian-selbstgehosteter-dyndns-dienst/ https://controlc.de/2013/09/10/debian-selbstgehosteter-dyndns-dienst/] | ||
Zeile 79: | Zeile 160: | ||
[https://controlc.de/2014/08/25/debian-selbstgehosteter-dyndns-dienst-der-client-teil/#more-2532 https://controlc.de/2014/08/25/debian-selbstgehosteter-dyndns-dienst-der-client-teil/#more-2532)] | [https://controlc.de/2014/08/25/debian-selbstgehosteter-dyndns-dienst-der-client-teil/#more-2532 https://controlc.de/2014/08/25/debian-selbstgehosteter-dyndns-dienst-der-client-teil/#more-2532)] | ||
== Update per API == | |||
=== Links === | |||
[ | [https://doc.powerdns.com/md/httpapi/README/#api-specification https://doc.powerdns.com/md/httpapi/README/#api-specification] | ||
Zurück zu [[Ubuntu#E (Server)|Ubuntu]] | Zurück zu [[Ubuntu#E (Server)|Ubuntu]] |
Aktuelle Version vom 19. Mai 2023, 13:30 Uhr
Allgemein
Um einen anderen DNS Namen auf den dynamischen weiter zu leiten, ist im DNS-Server noch eine Eintrag vom Type CNAME
notwendig:
Name | Typ | Inhalt | TTL |
---|---|---|---|
test.kirner.or.at | CNAME | test.dynamic-dns.at | 1800 |
Siehe dazu auch Bind Konfiguration (Linux)#Eintrag auf externe Domäne mittels CNAME
Update über direkten Datenbankzugriff
Voraussetzungen
Dieses Tutorials setzt einen DNS-Server voraus, der seine Daten aus einem MySQL-Backend bezieht. In diesem Tutorial wurde PowerDNS verwendet.
Datenbank erstellen
Um die Passwörter für die DDNS-Hosts über das SQL-Web-Frontend PhpMyAdmin bearbeiten zu können, habe ich diese in eine Datenbank ausgelagert.
Dazu erstellen wir eine Datenbank ddns und verwenden der Einfachheit den selben Benutzer wie für die powerdns-Datenbank:
create database if not exists ddns; grant all on ddns.* to 'powerdns'@'%';
Die Tabelle ddns_hosts enthält 2 Spalten für hostname und password:
CREATE TABLE ddns_hosts ( id INT NOT NULL AUTO_INCREMENT, hostname VARCHAR(64) NOT NULL, password VARCHAR(64) NOT NULL, PRIMARY KEY (id) );
Zum Testen noch einen Testeintrag:
INSERT INTO ddns_hosts ( hostname, password ) VALUES ( 'zuhause', 'abc123' );
Script
sudo vi /var/www/ddns/index.php
<?php /* ============================== Change according to your environment ================================== */ $DATABASE_SERVER = "<ip address>"; $DATABASE_USER = "powerdns"; $DATABASE_PASSWORD = "<password>"; $DATABASE_DB_DDNS = "ddns"; $DATABASE_DB_POWERDNS = "powerdns"; $ROOT_DOMAIN="dynamic-dns.at"; /* ========================================== Do not change ============================================== */ $mysqli = new mysqli($DATABASE_SERVER, $DATABASE_USER, $DATABASE_PASSWORD, $DATABASE_DB_DDNS); /* check connection */ if (mysqli_connect_errno()) { die("Connection failed: " . mysqli_connect_error()); } $host = mysqli_real_escape_string($mysqli, $_SERVER['PHP_AUTH_USER']); $pass1 = mysqli_real_escape_string($mysqli, $_SERVER['PHP_AUTH_PW']); /* Select queries return a resultset */ if ($query = $mysqli->query("SELECT password FROM ddns_hosts WHERE hostname = '" . $host . "'")) { if ($row = mysqli_fetch_assoc($query)) { $pass2 = $row["password"]; } else { invalidCredentials(); } /* free result set */ $query->close(); } else { printf("Invalid query: %s\n", mysqli_error($mysqli)); exit(); } if ($pass1 != $pass2) { invalidCredentials(); } else { /* change db to powerdns_admin db */ $mysqli->select_db($DATABASE_DB_POWERDNS); if (isset($_SERVER['HTTP_X_FORWARDED_FOR'])) { $ip=$_SERVER['HTTP_X_FORWARDED_FOR']; } else { $ip=$_SERVER['REMOTE_ADDR']; } $domain=$host.".".$ROOT_DOMAIN; //$domain2="*.".$ROOT_DOMAIN; if (!$result1 = $mysqli->query("UPDATE records SET content='$ip' WHERE name='$domain';")) { printf("Invalid query: %s\n", mysqli_error($mysqli)); exit(); } //$result2=mysql_query("UPDATE records SET content='$ip' WHERE name='$domain2';"); print("Success."); } function invalidCredentials() { die("Wrong password or unknown host!"); } ?>
Testen
Zum Testen rufen wir das Script im Browser auf (Anführungszeichen beachten):
curl "http://zuhause:abc123@update.dns1.dynamic-dns.at"
Bei erfolgreichen Update sollte Success. ausgegeben werden. Bei falschen Zugangsdaten Wrong password or unknown host!.
Router
DD-WRT
https://wiki.dd-wrt.com/wiki/index.php/Dynamic_DNS#Custom_.28URL_Updates.29
Links
https://www.debacher.de/wiki/Mein_eigenes_DynDNS
Update per nsupdate
Siehe auch PowerDNS nsupdate
Links
https://controlc.de/2013/09/10/debian-selbstgehosteter-dyndns-dienst/
https://controlc.de/2014/08/25/debian-selbstgehosteter-dyndns-dienst-der-client-teil/#more-2532)
Update per API
Links
https://doc.powerdns.com/md/httpapi/README/#api-specification
Zurück zu Ubuntu