DynDNS - Server mit eigener Domain?

djrick

Registered User
Hallo,

wie man einen Bind9 richtig konfiguriert wissen ja die meisten.
Jedoch habe ich im Moment folgendes Problem:
Ich habe eine Subdomain sagen wir mal: dynip.domain.tld
Diese Subdomain will ich auf meinen PC @ Home (mit DynIP, natürlich) weiterleiten. Ähnlich wie es einschlägige Dienste ala dyndns.org machen.

Jetzt die Frage: wie mache ich das? Ich brauche als ein Programm, welches meine aktuelle IP an meinen Server schickt; ich denke dass läßt sich, da ich mehrere Windows Programiersprachen behersche noch leicht realisieren. Aber nun:
Wie muss ich meinen Bind einstellen, wie kriege ich das hin? Oder gibts vielleicht schon Scripts die soetwas bewältigen? Ich hab mal gegooglet aber nix gefunden. Vielleicht hab ich auch nur nach dem falschen Begriff gesucht...aber meine Bemühungen verliefen bislang immer im Sand.

Sollte es funktionieren, wäre es vielleich auch eine gute Diskusion für "Projekte".
 
Hallo djrick,
da gibt es scheinbar recht wenig brauchbare Quellen. Bei Sourceforge.net gibt es/gab es einige Projekte. Problem ist eben, das du Bind die dynamischen Aktualisierungen erst beibiegen musst. Den Clientteil gibt es ja bereits - auch für Linux Clients.

mfG
Thorsten
 
djrick said:
wie man einen Bind9 richtig konfiguriert wissen ja die meisten.
Jedoch habe ich im Moment folgendes Problem:
Ich habe eine Subdomain sagen wir mal: dynip.domain.tld
Diese Subdomain will ich auf meinen PC @ Home (mit DynIP, natürlich) weiterleiten. Ähnlich wie es einschlägige Dienste ala dyndns.org machen.

hier findest du perlscripts dafür ;)
http://www.ciberlinux.net/proyectos/sddns/

den server lässt du als cgi laufen und er authentifiziert dich und ordnet dann deiner subdomain die dynamische ip zu; die umsetzung (in bind) macht (aus sicherheitsgründen) ein cron-job.
hast du eine linux kiste zuhause, dann findest du auch einen client dafür; aber einen für windows zu schreiben (VBasic, Delphi,..) ist auch recht simple ;)

gruss
 
Last edited by a moderator:
Hallo,

du brauchst da keine scripts für, ein einfacher CNAME tuts. trage einfach folgendes in das jew. zonefile ein:

Code:
dynip  IN  CNAME  host.dyndns.org.

dynip.domain.tld löst nun auf host.dyndns.org auf.

-Torsten
 
Ich habe eine Subdomain sagen wir mal: dynip.domain.tld
Diese Subdomain will ich auf meinen PC @ Home (mit DynIP, natürlich) weiterleiten. Ähnlich wie es einschlägige Dienste ala dyndns.org machen

ich glaube, er will sowas in eigenregie machen ;)

gruss
 
1) Ja, ich will sowas eigenes machen, denn, das ganze ist für einen Freund von mir bei dem, aus welchen gründen auch immer, dyndns.org nicht funktioniert. Und auch wenn es funktionieren würde, wäre es dennoch ein tolles projekt
2)Ja es ist Windows, also den Client werde ich selber programieren müssen, sollte aber wirklich kein Problem sein, meine dritte Fremdsprache ist neben English und Latein, Pascal ;)
3)Werde mich jetzt wieder ans werk machen ;)

Mein bisheriger Plan sah so aus:
-Ein Delphi Windows Client frag die IP ab (aus Router gründen macht der das, indem er ein PHP Script auf meinem Server via HTTP Öffnet, welches nur die IP anzeigt, so ist sichergestellt dass es auch garantiert die Internet und nicht die LAN IP ist)
-Der Client schreibt mit dieser IP eine named Zonefile, sollte die IP anders der vorherigen sein und läd diese dann auf meinen Server in einen eigens dafür laufenden Named
-Der Named muss die Zonefile nur noch jede Minute rehashen (ob das allerdings funktioniert.. :rolleyes: )
 
Last edited by a moderator:
Fertig!

So, 2 Tages hat es gedauert einen eigenen DynIP Serice zuerstellen.
Es läuft wie folgt:

Ein Windows-Client (geschrieben mit Delphi) fragt eine Internetseite ab. Auf dieser Seite (ein php Script) steht nur die IP, realisiert mit:
Code:
<?
echo $HTTP_SERVER_VARS["REMOTE_ADDR"];
?>
Diesen "String" setzt der Client in eine Zonfile an der richtigen Stelle ein. Das geschieht indem der Client eine Template-Zonefile öffnet in der an der Stelle für die IP ein Platzhalter steht (bei mir '>>IP>>'). Dieser Platzhalter wird mittels eines Replace Dialogs durch die richtige IP ersetzt.
Diese 'neue' Zonefile wird via FTP auf meinen Server in ein eigenes Verz. hochgeladen.
Der Bind9 auf dem Server (der eigens für diesen DynIP Service installiert ist) wird jede Minute mit /etc/init.d/named reload neugestartet/reloadet und somit holt sich der Bind-Service die aktuelle Zonefile immer aus diesem Verzeichnis.

That's it!
Eigentlich relativ simpel, für Version 1.0 Alpha :).

TODO:
- Kein Update durchführen wenn die IP sich nicht geändert hat
- Timer so umbauen dass der User selbst das Update-Intervall einstellen kann
 
Herzlichen Glückwunsch.

Ich will keine destruktive Kritik üben, aber ich finde den Weg doch etwas umständlich. Warum machst Du soviele Schritte?
Laß doch gleich das PHP-Script das Zonenfile erstellen (wenn sich die IP geändert hat). Damit das Script weiß, daß es der echte Client ist und kein Browser oder Spider, kannst Du ja einen eigenen speziellen Parameter im HTTP-Header übergeben, der eine Authentifizierung darstellt. (Und alle nötigen Parameter ebenfalls.)

Dies macht den Client schlanker und flexibler und auf dem Server ist nur ein relevantes Script zu warten.

huschi.
 
Huschi said:
Ich will keine destruktive Kritik üben, aber ich finde den Weg doch etwas umständlich. Warum machst Du soviele Schritte?
*sektflasche wieder einpack* *partygäster wieder auslad* *lach* Nein...
Ja hättest du mir das am Anfang gesagt hätte ich das vielleicht so gemacht. Wäre vielleicht in Version 2.0 auch mal zu überlegen bei einem kompletten rewrite.
Ich hab wahrscheinlich einfach nicht soweit (an PHP) gedacht. Und Delphi programier ich halt im Schlaf und bei PHP brauch ich zu mindest immer noch ein Comando-Buch daneben. So war das für mich der einfachste Weg. Aber die Idee ist wirklich nicht schlecht, wenn ich mal wieder mehr Zeit habe werde ich mich da mal dran setzen, thx Huschi.
 
Etwas off-topic: Mir geht es mit dem Delphi- und dem PHP-programmieren genau umgekehrt, bei Delphi bekomme ich immer Zustände, wenn ich das sehe und PHP ist einfach etwas geniales. ;-)

Naja, aber die "Hushi-Methode" ist auch das nächstliegende, wobei ich dazu sagen muss, dass es über ein sh-CGI evtl. noch einfacher gehen würde. Also die ganzen Befehle mit reload usw. als Shellscript schreiben und in ein CGI umwandeln (sind im Normalfall nur 3 Zeilen mehr notwendig). Einziges Problem dabei: Die Rechte des CGIs (du musst immerhin einen Prozess neu laden). Aber auch das sollte machbar sein ohne sich eine Sicherheitslücke in das System zu bauen.


So far!
#
Luke
 
Da ich mich grad selber mit so DNS zeug befasst habe, kram ich den Thread hier mal aus dem Keller.

Habe mir einfach ein kleines PHP Script geschrieben was von dem Updateclient aufgerufen wird:

Code:
<?php
$explode = explode('.', $_GET['host']);
$host = array_shift($explode);
$zone = implode('.', $explode);
$ip = ($_GET['ip']) ? $_GET['ip'] : $_SERVER['REMOTE_ADDR'];

function reload_zone($zone) {
        exec('/usr/sbin/rndc reload ' . $zone . ' 2>&1', $rndc);

        return $rndc;
}

function valid_ip($ip) {
        return (@gethostbyaddr($ip)) ? true : false;
}

function change_zonefile($zone, $host, $ip) {
        if(file_exists('/var/lib/named/' . $zone . '.hosts')) {
                $fp = fopen('/var/lib/named/' . $zone . '.hosts', 'r');
                $found = false; $update = false;
                while($line = fgets($fp, 1024)) {
                        $buffer = rtrim($line);
                        if(preg_match("/^" . $host . "/", $buffer)) {
                                preg_match("/([0-9]{2,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3})/", $buffer, $act_ip);
                                $update = ($act_ip[1] == $ip) ? false : true;
                                $buffer = preg_replace("/([0-9]{2,3}.[0-9]{1,3}.[0-9]{1,3}.[0-9]{1,3})/", $ip, $buffer);
                                $found = true;
                        }
                        if(preg_match("/[\t]?[0-9]{10}$/", $buffer)) {
                                $buffer = preg_replace("/[0-9]{8}([0-9]{2})$/e", date("Ymd") . "$1 + 1", $buffer);
                        }
                        $zone_file .= $buffer . "\n";
                }
                fclose($fp);
                if($update) {
                        $fp = fopen('/var/lib/named/' . $zone . '.hosts', 'w');
                        fputs($fp, $zone_file);
                        fclose($fp);
                        reload_zone($zone);
                }

                return ($found) ? true : false;
        } else {
                return false;
        }
}

header("Content-Type: text/plain");
if($host && $zone) {
        if(valid_ip($ip)) {
                echo (change_zonefile($zone, $host, $ip)) ? 'OK' : 'NOK';
        } else {
                echo 'NOK';
        }
} else {
        echo 'NOK';
}
?>

Die Benutzerauthentifizierung mache ich derzeit noch einfach über .htaccess da ich der einzigste Nutzer bin :D

Zu dem Script: der Aufruf erfolgt folgendermassen:

update.php?host=dynip.meinetolledomain.de
In diesem Fall würde versucht, das Zonenfile meinetolledomain.hosts zu öffnen, es würde die Zeile gesucht, wo synip drinne vorkommt und per Regular Expressions die derzeitige IP mit der ersetzt, die der Apache in dem Script übertragen hat. Desweiteren würde die Seriennummer auch hochgezählt, damit evlt. Slaves auch was von dem Reload haben.

bei der möglichkeit 2 rufe ich zusätzlich noch den parameter &ip=127.0.0.1 auf was den Eintrag im Zonenfile auf diese übergeben IP Addresse setzen würde.

Am ENDE bekomme ich nur ein OK, wenn alles funktioniert hat, ansonsten immer ein NOK zurückgeliefert.

Damit dieses Script funktioniert muß neben den PHP beschränkungen die /etc/rndc.conf chmod 757 haben ebenso die zonenfiles 777.

Ist nicht die sicherste Lösung aber hatte nur ne Stunde zeit :D
 
Hallo,

du brauchst da keine scripts für, ein einfacher CNAME tuts. trage einfach folgendes in das jew. zonefile ein:


Code:
dynip IN CNAME host.dyndns.org.
dynip.domain.tld löst nun auf host.dyndns.org auf.

-Torsten

Wenn ich jetzt dyndns.meinedomain.de aufrufe, oder eine domain direkt weiterleite wird immer als Adresse letztendlich name.dyndns.org angezeigt.
Kann ich das noch ängern?
wenn ich mehrere Domains auf meinenserver.dyndns.org weiterleite.
angenommen ich habe webmin oder ähnliches installiert und richte da mehrere Benutzer ein.
Kann ich dann die domainxy.de an user1 und domainabc.de an user2 usw binden oder funzt das nicht mit dyndns?
 
meine lösung

hab auch nen eigenen dyndns service mit sddns gebastelt - war eigentlich kein großer act. die ip update ich mit einem einfachen shellskript via lynx, das über cron oder (bei einwahlkisten wohl am schlausten) pppd aufgerufen wird.

link zum service
link zum skript

wenn jemand konkrete fragen dazu hat, soll er sie doch bitte stellen.

grüße,

felix
 
Die meisten Router bieten eine Funktion für die größeren Dienste, v.a. Dyndns.org... ist wohl die beste Lösung, sofern du einen verwendest.
 
sddns (eigener dynDNS)

Hallo,

ich habe mal sddns an unser System angepasst. Jetzt habe ich 2 User mit Ihren Subdomains angelegt. Wenn ich jetzt die Update-Url aufrufe, wird in der einen Datei die IP-Adresse aktualisiert. Der Cron wird auch jede Minute aufgerufen. Irgendwie wird jedoch der ZonenFile nicht wirklich aktualisiert. Von 100 Versuchen klappt es manchmal 1x.
Fehler sehe ich keinen. Zum testen habe ich mal einen komplett neuen User mit Subdomain angelegt und diesem eine IP-Adresse zugewiesen, welche es nicht gibt. Dieser User wird bei Cronaufruf auch nicht in den Zonenfile übernommen. Wenn ich jetzt Bind9 restarte und mehrmals den Cron aufrufe, dann kommt es selten vor, dass die Daten übernommen werden und die IP aktualisiert wird. Gibt es ein Cacheproblem oder wird das anders gespeichert? Wie gleicht das Script die Daten eigentlich genau ab ohne Cache Datei?

Habt Ihr evtl eine Idee/Lösung für mich. Komme hier leider nicht weiter. Wäre nett von euch. Danke.

MfG
 
Hallo,

keiner eine Idee? Evtl. auch ein Tutorial/Alternative oder andere Hilfe?

Danke..

MfG
 
Ich verwende die Losung mittels nsupdate.
Dort ist es so, daß Bind die Änderungen zunächst nur ins Journal einträgt und im RAM hält.
Das Zonenfile wird bei Änderungen zyklisch alle 30 Minuten und auf Anforderung (rndc freeze) geschrieben.
 
Hi,

Danke für deine Antwort. Hast du evtl mal ein Tutorial bzw. kannst du s mir kurz mit einem Bsp. schreiben, dass ich es mal testen kann. Da ich bis jetzt noch keien Idee hab warum es sporalisch funktioniert und dann wieder ebig nicht. Evtl. gibts bei BIND ja irgendwo einen Cache oder so, den man deaktivieren kann, damit es geht...

MfG
 
Hi all,

ich habe jetzt noch einen Fehler bei sddns. Wenn ich die IP eines Users via URL-Aufruf update, wird diese in der User-Datei richtig eingefügt, jedoch wird nach einem Crondurchlauf kein Update in der Zone gefahren. Wie bekomme ich es hin, dass er den Zonenfile Updatet? In der cron-Datei habe ich ein else-zweig eingebaut, welcher mir anzeigt, wenn der Cron sagt, IP wurde nicht geupdatet.
Für diese IF:

PHP:
	# Check if the file was updated less than $time_frame minutes
	if ( ( time() - ( stat ( $zones_dir."/".$zone ) ) [9] ) <=
		 ( $time_frame * 60 ) ) {

Egal wie oft und mit welcher IP von externen Proxys ich update, er läuft immer in die else und ich weis nicht warum.

Ich bitte um Hilfe. Danke...

MfG
 
Last edited by a moderator:
Back
Top