Eigenen DynDNS Server: Unterschied zwischen den Versionen

Aus Tutorials
Zur Navigation springen Zur Suche springen
 
(41 dazwischenliegende Versionen desselben Benutzers werden nicht angezeigt)
Zeile 1: Zeile 1:
{{note|Noch in Bearbeitung}}
== 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:


== Script ==
{| class="wikitable"
!| Name
!| Typ
!| Inhalt
!| TTL
|-
| test.kirner.or.at
| CNAME
| test.dynamic-dns.at
| 1800
|}


=== Datenbank ===
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 ===
 
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'@'localhost';
grant all on ddns.* to 'powerdns'@'%';
</pre>
 
Die Tabelle ''ddns_hosts'' enthält 2 Spalten für ''hostname'' und ''password'':
 
<pre>
CREATE TABLE ddns_hosts (
  id INT NOT NULL AUTO_INCREMENT,
  hostname VARCHAR(64) NOT NULL,
  password VARCHAR(64) NOT NULL,
  PRIMARY KEY (id)
);
</pre>
 
Zum Testen noch einen Testeintrag:
 
<pre>
INSERT INTO ddns_hosts ( hostname, password ) VALUES ( 'zuhause', 'abc123' );
</pre>
 
=== Script ===
 
<pre>
sudo vi /var/www/ddns/index.php
</pre>
</pre>


== Mit PowerDNS ==
<pre>
<?php
 
/* ============================== Change according to your environment  ================================== */
 
$DATABASE_SERVER = "<ip address>";
$DATABASE_USER = "powerdns";
$DATABASE_PASSWORD = "<password>";
$DATABASE_DB_DDNS = "ddns";
$DATABASE_DB_POWERDNS = "powerdns";


[[PowerDNS nsupdate (Ubuntu)|PowerDNS nsupdate]]
$ROOT_DOMAIN="dynamic-dns.at";


== Links ==
/* ========================================== 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!");
}
?>
</pre>
 
=== Testen ===
 
Zum Testen rufen wir das Script im Browser auf (Anführungszeichen beachten):
 
<pre>
curl "http://zuhause:abc123@update.dns1.dynamic-dns.at"
</pre>
 
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 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 25: 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)]


[http://www.keentech.de/2013/11/der-eigene-selbstgehostete-dynamische-dns-service/ http://www.keentech.de/2013/11/der-eigene-selbstgehostete-dynamische-dns-service/]
== Update per API ==
 
=== Links ===


[http://nicht-traeumen-sondern-machen.de/RaspberryPi_Basteleien/DynDNS_mit_Fritzbox.php http://nicht-traeumen-sondern-machen.de/RaspberryPi_Basteleien/DynDNS_mit_Fritzbox.php]
[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://klenzel.de/1575

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