Impressum Startseite Grund Installation Grundlagen Code-Schnippets Hilfreiches Projekte Querschläger Meckerecke

Wir bauen uns einen eigenen "DynDNS Dienst! - mit einer Fritzbox und etwas PHP fähigen Webspace

Dieses ist eine Anleitung zur Umleitung 8-) - Mehr macht dieses hier angebotene Script nicht. Es leitet Anfragen zu eurer Domain/subdomain auf eure dynamische IP Zuhause um - und das mittels php...

Was macht denn so ein "DynDNS" dienst eigentlich ?

Wenn man Zuhause mit dem Internet verbunden ist, bekommt man für die Internet Sitzung dynamisch je nach Provider eine IP zugewiesen. Diese IP kann je nach Anbieter variieren und dynamisch Zeitabhänigig zugewiesen werden. Und hier ist schon das Problem: Wenn man Zuhause beliebige Geräte erreichbar haben möchte (z.b. ein NAS) braucht man eine "feste" Adresse, oder eben nur kenntnis von der jeweiligen aktuell gültigen IP Adresse.
Hier setzen diese kostenlosen und auch kostenpflichtigen DynDNS Dienste an, man bekommt einen wählbaren "Kurz-Namen" mit einer festen Endung zugewiesen. Dann muss auf dem Rechner zuhause ein Programm laufen, welches bei einem Wechsel der IP diese diesem Dienst mitteilt, damit beim Aufruf der Adresse dieser Dienst zu dieser IP auch "Umleiten" kann.
Mittlerweile können sehr viele Router und auch NAS Geräte solch einen DynDNS dienst "bedienen", d.h. die übergeben die aktuelle IP diesem Dienst und kein Rechner muss zwingend Zuhause an sein und die IP erneuern.

OK, DynDNS klingt gut, aber muss es ein "externer Dienst" sein ? Werden die Zugriffe irgendwo gespeichert, ist es kostenlos, ist es immer erreichbar ?
Fragen über fragen..., diese habe ich mir auch gestellt und dann viel gegoogelt um rauszufinden ob man diesen DynDNS Dienste überhaupt braucht.
Das Ergebnis ist : Nein, man kann so einen Dienst auch selbst mit einfachen mitteln aufsetzen. Ich habe viel gegoogelt und es gabe viele Umsetzungen - fast alle haben die gleiche Funktion: Das übergeben der aktuellen IP an ein Script und das zwischenspeichern dieser IP auf einem Webspace. Ich habe es soweit vereinfacht und optimiert so das es hier einwandfrei läuft und auch simpel anzupassen ist.


Was braucht man ?

-Einen Router der fremde DynDNS Dienste unterstützt, z.b. div. AVMs Fritzboxen - aber auch div. andere Router sollen das können.
-Eine eigene Domain mit php fähigen Webspace (Gibt es auch kostenlos).
-ein bischen Spaß am rumprobieren, auf Anhieb läuft fast nie was. Sollte es doch auf Anhieb funktionieren, habt ihr was falsch gemacht 8-)

Alternativ kann man auch einen Raspberry Pi oder ähnlichen Rechner im heimischen Netzwerk für die IP erneurung nutzen, das tue ich mittlerweile auch.

 


Wie funktioniert das ganze konkret ?

Statt eines offiziellen DynDNS Dienstes wird ein PHP Script auf dem eigenen Webspace aufgerufen. Dabei werden Parameter wie die aktuelle IP und ein Passwort übergeben, damit das Script weiss das die IP erneuert werden soll.
Das Script selber schreibt in eine kleine Textdatei die aktuell gültige IP rein - nicht mehr.
Bei Aufruf des scripts ohne Passwort leitet das script direkt zu der IP weiter + intern angegeben evtl. Port oder Parametern.
Damit kann man also z.b. auf Port 8080 (meist bei Qnaps voreingestellt) weiterleiten. Jetzt muss man nur noch in der Fritzbox eben eine solche Portfreigabe für den Port einrichten und angeben welches Gerät man ansprechen möchte.
Voila! - aber das Thema Portfreigabe wird hier nicht behandelt - dafür gibt es Handbücher und google hilft einem bestimmt auch noch weiter.

Wie bekomme ich einen schönen einfachen einprägsamen Namen ?

Wer einen kostenlosen Account bei DynDNS hat bekommt meist einen kleinen schicken einfach zu merkenden Namen - das geht hier auch. Wer eine eigene Domain hat, kann ja, z.b. eine "Subdomain" anlegen, z.b. http:/subdomain.meineDomain.de. Diese Subdomain sollte auf das script zugreifen.(z.b. eine index.php ins Hauptverzeichnis legen).
Bei Aufruf wird dann direkt an die HomeIP weitergeleitet. So hat man einen einfachen einprägsamen schönen Namen, und eine schnelle direkte Umleitung auf den Anschluß zuhause.

Mehr Vorteile oder mehr Nachteile ?

Keine Vorteile ohne Nachteile. Dieses ist ein PHP script, d.h. es muss vom Server per "Http" aufgerufen werden. Also ist KEIN direkter Aufruf über "FTP" oder so möglich. PHP wird erst vom Server eingelesen und ausgeführt, erst dann folgt die Ausgabe. Das lässt sich aber umgehen, wenn man auf eine weitere Seite umleitet wo die IP entsprechend als FTP Link aufbereitet wird - das geht auch per PHP -> selber googlen...

Weiterhin wird im Ereignisprotokoll der Fritzbox jedes mal nach wechsel der IP solch eine Meldung ausgegeben: "Dynamic DNS-Fehler: Die Dynamic DNS-Aktualisierung war erfolgreich, anschließend trat jedoch ein Fehler bei der DNS-Auflösung auf." - damit kann man leben. Es beeinflusst nicht die Funktion.

Was gibt es noch für kostenlose möglichkeiten ?

Wer sowieso eine Fritzbox betreibt kann "myFritz" nutzen. Der Aufruf geschieht dort über https:// und man bekommt einen Individuellen kryptischen Namen zugewiesen. Über dieses MyFritz kann man auch Prima ein VPN in der Fritzbox aufsetzen. Anmelden tut man sich für den Dienst in der Fritzbox.

Ich habe den VPN Dienst erfolgreich vom Ausland aus getestet (Mexiko) und konnte hier zuhause auf alle Webgeräte zugreifen. Trotz allem nutze ich noch das php Script für die IP erneuerung, da ich noch andere Dienste nutze wofür ich kein MyFritz benötige (Smart Home).


Versions Übersicht - Direktverlinkung

Version 1.0 - Super Simpel !

Version 2.0 - Ziemlich erweiterungsfähig

Version 3.0 - Total überfrachtet 8-)


Version 1.0 , die simple Lösung...

Als erstes sollte das PHP Script an seine Bedürfnisse angepasst werden:Passwort und Port muss angepasst werden. Sowie der Filename für die "IP Textdatei": "homeIP.txt" die folgenen Inhalt haben kann "127.0.0.1".

Das folgende PHP script sollte man unter einen beliebigen Namen speichern, z.b. "filename.php". Dann erstellen wir auf unseren PHP fähigen Webspace einen Ordner,z.b. "ordner" und legen das file "filename.php" darin ab - genauso wie die Datei "homeIP.txt" oder wie auch immer ihr sie genannt habt. Die groß und kleinschreibung sollte man immer beachten, nicht so wie ich hier auf dieser Webseite (ist innerhalb einer halben Stunde erstellt worden, ich sehe das alles nicht so eng.).

Weiterhin müssen die Rechte in diesem Ordner angepasst werden - ich stelle immer alles auf "777" - also alles Lesen, alles Schreiben, alles Ausführen - erspart mir eine menge Stress. Aber nur für den Ordner.

<?
// DynDNS über Fritzbox
//
// Passwort und Port nach belieben anpassen.
//
// In der Fritzbox das Script z.b. so aufrufen:
// Update Url: www.MeineDomain.de/ordner/filename.php?pass=Passwort&meineip=<ipaddr>
// Domainname: MeineDomain.de/
//
// Dieses Beispiel leitet zu der "IP:8080/cgi-bin/filemanager/" weiter...

$pwort = 'Passwort'; // Hier sollte man sein persönliches Passwort für die Erneuerung der IP eintragen.
$port = ':8080/cgi-bin/filemanager/'; // Diese legt nur den "Port" und evtl Parameter fest.Kann auch leer bleiben

// Bei Aufruf dieses Scriptes würde die IP aufgerufen, z.b. "http://127.0.0.1:8080/cgi-bin/filemanager/"

$dyntxt = "homeIP.txt";
$pworttest = $_GET["pass"];
$IP = $_GET["meineip"];

//Ist das Passwort richtig wird die IP erneuert.

if (file_exists($dyntxt)){if($pworttest==$pwort) { $a = fopen("$dyntxt", "w");
$dynamicip = $_SERVER["REMOTE_ADDR"];

echo "good ".$IP; // Hierdurch soll der Fehler in dem Fritzbox ereignis Protokoll verschwinden.(Nicht wirklich)
fwrite($a, $IP);
fclose($a); }

else { $a = fopen("$dyntxt", "r+"); //Kein Passwort, dann nur IP auslesen und weiterleiten
$dynamicip = fread($a,filesize($dyntxt));
fclose($a);

$url="http://".$dynamicip."".$port; //Hier kann man so einiges nach eigenen Bedürfnissen anpassen.
header("Location: $url");} } //Hier erfolgt die Weiterleitung
?>

Das PHP Script gibt es hier im Download.


Einstellungen in der Fritzbox...

Wenn das obige alles richtig erfolgt ist, war das schon die halbe Miete. Weiter geht es in der Fritzbox, hier gehen wir zu "Internet/Freigaben/Dynamic DNS/"

und stellen folgendes ein:

Dynamic DNS benutzen : Ja
Dynamic DNS-Anbieter : Benutzerdefeniert
Update-URL: www.MeineDomain.de/ordner/filename.php?pass=Passwort&meineip=<ipaddr>
Domainname: fritz.box
Benutzername: IrgendeinName Beliebiger inhalt
Kennwort: 12345678 Beliebiger inhalt
Kennwort Bestätigung: 12345678 Beliebiger inhalt

Die Box hat die Angaben so geschluckt und funktioniert:

Das war es ! - nach dem Button übernehmen sollte das ganze schon funktionieren - wenn nicht habt ihr was falsch gemacht.

Der Kürzel "<ipaddr>" schreibt man genau so rein, die Fritzbox ersetzt es selbständig durch die aktuell gültige IP.

Jetzt muss man nur noch auf seinen Webspace eine Subdomain anlegen die auf dieses Script verweist: z.b.

www.MeineDomain.de/ordner/filename.php

Bei Aufruf dieser Adresse würde man direkt zur aktuell gültigen IP weitergeleitet werden.

Viel Spaß beim "rumprobieren" - Ich selber hatte obriges Script hier laufen, natürlich entsprechend meiner Domain angepasst. Mittlerweise habe ich die neueste Version von ganz unten drauf die alles bietet was ich so brauche - aber für den Anfang zum ausprobieren ist die Version V1.0 optimal.


Fehlersuche ? Wie kreise ich meine Fehler ein ?

Die Fehlersuche ist recht einfach. Einfach das Script inkl. Passwort direkt im Browser aufrufen. z.b.:

http://www.MeineDomain.de/ordner/filename.php?pass=Passwort&meineip=127.0.0.1

Dadurch sollte die Adresse 127.0.0.1 in der Textdatei geschrieben werden was man so kontrollieren kann:

http://www.MeineDomain.de/ordner/homeIP.txt

Die Ausgabe sollte im Browser jetzt 127.0.0.1 lauten. Ist das nicht der fall, sind irgendwelche Variablen falsch (Passwort?)

Wenn man jetzt:

http://www.MeineDomain.de/ordner/filename.php

aufruft, sollte dann die Umleitung stattfinden.

Wer es nicht zum laufen bekommt, kann ja weiterhin einen kostenlosen oder kostenpflichtiges DynDNS Dienst nutzen...., habe ich auch Jahrelang gemacht.

Die beliebtesten Fehler:

  - Rechte der Ordner nicht richtig angepasst - Rechte sollten auf 777 gestellt werden.
  - Falsches Passwort eingetragen - das richtige Passwort sollte im Router und auch im php Script identisch sein.
  - Groß und Kleinschreibung der Passwörter nicht beachtet...
  - Port Freigaben im Router sind falsch - Router Anleitung lesen...
  - Webspace kann kein PHP 8-) (Ja, auch so etwas gibt es heute noch).
  - Ihr habt die Filenamen abweichend von dieser Anleitung verändert ?

Was noch sein kann:

Jeder hat andere Hardware, einen anderen Webspace, eine andere PHP Umgebung (und Version) oder einfach nur keinen Plan wie man mittels FTP Daten auf dem Webspace hochschiebt - von daher können fehler auftreten, dafür seid ihr alle selbst verantwortlich.


Bekannte Probleme und Fehler ?

  - Es geht immer nur der direkte Aufruf über HTTP, also kein direktes FTP, oder VNC Protokoll. Aber man kann ja z.b. in Mozilla eine http anfrage direkt zu einem FTP Server umleiten.

 

- Im Ereignis Protokoll der Fritzbox wird alle paar Minuten eine Fehlermeldung ausgegeben. Diese kann man Ignorieren, oder man passt die Fritzbox mit dem Fritzbox Editor an - dann verschwindet diese Meldung.

Alternativ einfach "fritz.box" bei Domain eintragen, dann verschwindet diese angeblich Meldung auch (bei mir blieb Sie bestehen).

 


Version 2.0 - 4.1.2014 - Etwas anspruchsvollere Lösung...

Ich wollte eine neue Funktion mit in mein erstes Script von ganz oben mit einbauen, dabei ist das Script noch etwas mehr erweitert worden - Ich glaube das nennt man über das Ziel hinaus geschossen 8-)

Da neue Script kann etwas mehr als das erste, die Bedienung ist aber wie im ersten, also so weit, so grob kompatibel.

Neu ist, das man das benötigte Protokoll übergeben kann. Man ruft also die PHP Datei auf, und lässt dadurch z.b. einen VNC Screensharing Dienst oder einen FTP Aufruf starten - wie man möchte.

Weiterhin kann man den Port mit übergeben, einen Pfad angeben und das Script legt eine evtl fehlende IP Datei automatisch an, falls sie fehlt.

OK, das können die anderen Scripte von oben evtl auch, aber ich wollte eine eigene Vorratsdatenspeicherung mit einbauen.

Hintergedanke:Das Netz wird ja immer verrückter und die Provider geben ja gespeicherten IPs an fast jeden raus - meist auch falsche, da erscheint es einem durchaus sinnvoll die eigenen IPs zu speichern, damit man selber weiss, welche IP hatte ich vor 2 Jahren ??? - OK, ich kann das schon seit 4 Jahren Lückenlos belegen, der eingebaute Push Service der Fritzbox ermöglicht ja das täglich versenden dieser Verbindungsdaten an die eigene Email Adresse. Aber was ist wenn der Rechner mal nicht mehr will ? - wenn dann auf einmal alles weg ist, gerade wenn man es mal braucht ? Doppelt hält besser, also wenn die Fritzbox eine neue IP erhält, wird auch der DynDNS upgedatet, und dort greife ich mit ein und speichere das aktuelle Datum, Uhrzeit und die IP in einer Textdatei, so ist das alles doppelt gesichert.

Ob die Daten als Beweis taugen ? - Wahrscheinlich nicht. Aber hier der Grundgedanke: Warum sollen die eigen Daten schlechter sein, als die des Providers ? Ob die Daten beim Provider korrekt erfasst worden sind ist ja auch immer fraglich - Wer hat das ganze bei denen Programmiert, wie wird die IP erfasst, wie gespeichert und wer liest die Daten aus, etc... Da traue ich meinen script 1000x mehr ! Hier ist wenigstens der Source Code komplett lesbar und alles transparent nachvollziehbar - und bei eurem Provider ? Ob der einem seinen Sourcecode von der Aufzeichnung zu kommen lässt ? - ich bezweifel es stark...

Aber man muss es so sehen: Wenn ich an den gesammelten IP Daten nicht rumgepfuscht habe, und jemand behauptet ich hätte an einem bestimmten Datum eine bestimmte IP gehabt - die aber gar nicht mit meinen Aufzeichnungen übereinstimmt - dann lässt das nur einen Schluss zu: Alles Lügner und Betrüger!

Wer es nicht braucht kann die Funktion aber auch mit einem "NEIN" in der Konfiguration deaktiveren.

Hier ist also die neueste Version. Ja, ich weiss, schön programmiert sieht anders aus - aber mir ging es um die Funktion - und die ist gegeben.

Bedienung und einrichtung wie oben bei der ersten Version ! Ansonsten steht in den Kommentaren wie man es bedient und was die Zeilen Code so machen - viel Spaß!

<?
// Sehr flexible IP Weiterleitung, anpassbar mittels Protokoll, Port, Pfad nach belieben.
// (c)2014 www.AxelTeichmann.de
//
// Dieses Script erlaubt folgene Schlüsselwörter:
// port=Portnummer (1-xxxx)
// protocol=Protokoll (z.b. "VNC", "FTP", "SMB" oder "HTTP"(s) etc...) Standard ist "http"
// pfad=unterordner (z.b. "meinOrdner" oder start.html) Ein "/" Wird automatisch vorangestellt.
//
// Weiterhin wird in einem Archiv Ordner die verwendeten IPs in einer Textdatei mit Datum und Uhrzeit der
// Zuweisung gespeichert - wenn gewünscht. Denn wer Weiss denn schon welche IP er vor einem halben Jahr
// hatte ? So lässt sich das jederzeit überprüfen.
//
// Bitte folgende Variablen anpassen:

$IP_Datei = "dynip.txt"; //Filename der IP Datei auf dem Server (könnt ihr nennen wir ihr wollt)
$PASSWORT = '
Passwort'; // Passwort für die IP Erneuerung (gleiches Passwort wie in der Fritzbox)

$Vorratsdatenspeicherung = "JA"; // JA oder NEIN ?
// Bei Ja, wird die IP in einer großen Datei auf dem Server gespeichert
$VorratsdatenspeicherungsOrdner= "
Mein-IP-Archiv"; //Ordner in dem das IP Archiv angelegt wird
$IParchivname = "
IP-Archiv"; // Name der Datei ist "Jahreszahl-Monta-IP-Archiv", also "2014-01-IP-Archiv.txt"

//
// Dieser Aufruf von der Fritzbox aus:
// http://www.deineDomain.de/Unterverzeichnis/index.php?pw=Passwort&mip=<ipaddr>
// Erneuert die IP auf dem Webspace.
//
// Dieser Aufruf vom Browser aus:
// http://www.deineDomain.de/Unterverzeichnis/index.php?pw=Passwort&mip=127.0.0.1>
// Erneuert die IP auf dem Webspace und schreibt 127.0.0.1 hinein.
//
// Dieser Aufruf:
// http://www.deineDomain.de/Unterverzeichnis/index.php
// startet einen http//:deineIP (also standard Port 80)
//
// Dieser Aufruf:
// http://www.deineDomain.de/Unterverzeichnis/index.php?protocol=ftp&port=21
// startet einen Aufruf mittels FTP//:deineIP:21
//
// Dieser Aufruf:
// http://www.deineDomain.de/Unterverzeichnis/index.php?protocol=vnc&port=5600
// startet einen Aufruf mittels VNC//:deineIP:5600
//
// Dieser Aufruf:
// http://www.deineDomain.de/Unterverzeichnis/index.php?protocol=http&port=777&pfad=LustigerPfad
// startet einen Aufruf mittels http//:deineIP:777/LustigerPfad
//
// Durch die verschiedenen Parameter sollte die Konfiguration ein Kinderspiel für jeden sein.
//
// Ab hier nichts ändern, es sei denn man traut sich 8-)
// Eigentlich sind keinerlei Sicherheitsabfragen oder ähnliches eingebaut.

$Passwort = $_GET['pw']; // liest ein evtl übergebendes Passwort aus
$Port = $_GET['port']; // liest ein evtl übergebenden Port ein
$Port=$Port+0; // Es wird eine 0 zum Port addiert, das macht die Variable ganz sicher Numerisch
$Protocol = $_GET['protocol']; // liest ein evtl übergebenden Protokoll ein
$Pfad = $_GET['pfad']; // liest ein evtl übergebenden Pfad ein
$FritzIP = $_GET['mip']; // übermittelt die IP von der Firtzbox an die Variable FritzIP
$domain=$_SERVER['SERVER_NAME']; // ermittelt den aktuellen Domainnamen

// Variablen anpassen
date_default_timezone_set('Europe/Berlin'); setlocale(LC_TIME, "de_DE");
if ($Protocol=="") {$Protocol="http";} // Falls kein Protokoll angegeben wurde wird http verwendet.
if ($Port==0) {$Port="";} // Wurde kein Port angegeben dann nutze auch keinen.
if ($Port>=1) {$Port=":".$Port;} // Gibt es einen Port größer als 1 dann füge einen : hinzu
if ($Pfad!=="") {$Pfad="/".$Pfad;} // Gibt es ein Pfadangabe, dann stelle ein "/" voran.

// IP Datei erzeugen wenn sie nicht existiert
if (!file_exists($IP_Datei)) { // Existiert die Datei nicht ?
$datei = fopen("$IP_Datei", "w+"); // Lege eine Datei mit dem Namen an
fwrite($datei, "127.0.0.1"); // Als Dummy schreibe die IP 127.0.0.1 hinein.
fclose($datei); // Schließe die Datei
}
// Passwort überprüfen, IP Datei erneuern.
if($Passwort==$PASSWORT) { // Ist das passwort Korrekt, dann erneuere die IP
$datei = fopen("$IP_Datei", "w"); // Öffnen der IP Datei zum Schreiben
fwrite($datei, $FritzIP); // schreibt die übergebene IP in die Datei
fclose($datei); // Schliesst die Datei für den Schreibzugriff
echo "good ".$domain; // gibt "good Domainname" aus.

// Ab hier kommt die VorratsDatenspeicherung

if ($Vorratsdatenspeicherung=="JA") { // Sollen die IPs dauerhaft gespeichert werden ?
$jahr=date("Y");$monat=date("m"); // Jahreszahl und Monatszahl ermitteln
// und zu Filenamen zusammensetzen:
$Filename=$VorratsdatenspeicherungsOrdner."/".$jahr."-".$monat."-".$IParchivname.".txt";

// Eintrag zusammenstellen: yyyy-mm-tt hh:mm:ss IP:ipadresse
$datum=date("Y-m-d H:i:s",time()); $inhalt=$datum." IP:".$FritzIP."\n";

// existiert der Ordner für das IP Archiv noch nicht, dann erzeuge es:
if (!file_exists($VorratsdatenspeicherungsOrdner)) { mkdir($VorratsdatenspeicherungsOrdner, 0777, true); }

// Öffne aktuelle Monatsdatei und hänge aktuelle IP an, wenn noch keine Datei existiert
// wird eine neue angelegt

$datei = fopen("$Filename", "a"); // Öffnen der IP Datei zum Schreiben
fwrite($datei, $inhalt); // schreibt Datum, Uhrzeit und IP in die Datei
fclose($datei); // Schliesst die Datei
}
exit; // Beende das Script
}
// Bei allen anderen Aufrufen entsprechend umleiten
if (file_exists($IP_Datei)) { // Wenn das Passwort nicht korrekt oder gar
// gar nicht übermittelt wurde, dann...
$datei= fopen("$IP_Datei", "r"); // Öffne die Datei nur zum Lesen
$inhalt = fread($datei,filesize($IP_Datei)); // Inhalt in die Variable $inhalt einlesen
fclose($datei); // Schließe die Datei wieder.
$url=$Protocol."://".$inhalt."".$Port."".$Pfad; // die Url wird zusammen gesetzt
header("Location: $url"); // Ruft die Url passend auf
exit; // beendet das Script
}

?>

Hier gibt es die aktuelle PHP Datei auch zum Download...


Version 3.0 - vom 11.01.2014

Ich habe das Script vom 4.1.2014 noch etwas erweitert:

- Die Vorrats Datenspeicherung speichert jetzt nicht alle 30 Minuten, sondern nur wenn die IP sich ändert. (Die Fritzbox erneuert ca alle 30 Minuten ansonsten den Eintrag - und der ist immer gleich.)

- Es ist eine Suche eingebaut, die es ermöglicht das IP Archiv nach dem Vorkommen einer bestimmten IP zu durchsuchen. Aufruf mittels z.b. index.php?suche oder auch index.php?suche=127.0.0.1 (Als Beispiel für die Suche der IP 127.0.0.1). Das spart einem das einladen von evtl vielen Textdateien auf der Suche nach einer IP...

- Alle anderen Funktionen wie z.b. Protokoll, Port und Co sind gleich geblieben - Hier der Code, etwas konfus Programmiert, aber ich musste mich erst mal in die "Formulartechnik" einlesen...8-) - Funktion vor Design..

<?
// Sehr flexible IP Weiterleitung, anpassbar mittels Protokoll, Port, Pfad nach belieben.
// (c)2014 www.AxelTeichmann.de
//
// Dieses Script erlaubt folgene Schluesselwoerter:
// port=Portnummer (1-xxxx)
// protocol=Protokoll (z.b. "VNC", "FTP", "SMB" oder "HTTP"(s) etc...) Standard ist "http"
// pfad=unterordner (z.b. "meinOrdner" oder start.html) Ein "/" Wird automatisch vorangestellt.
// suche=ip (Durchsucht den evtl Vorratdatenspeicher nach einer IP)
// oder nur das Wort "suche", dann gibt es ein Formular für den Such Eintrag einer IP
//
// Weiterhin wird in einem "Archiv Ordner" die verwendeten IPs in einer Textdatei mit Datum und Uhrzeit der
// Zuweisung gespeichert - wenn gewuenscht. Denn wer Weiss denn schon welche IP er vor einem halben Jahr
// hatte ? So l?sst sich das jederzeit Ueberpruefen.
//
// Bitte folgende Variablen anpassen:

$IP_Datei = "dynip.txt"; //Filename der IP Datei auf dem Server
$PASSWORT = '
passwort'; // Passwort fŸr die IP Erneuerung

$Vorratsdatenspeicherung = "JA"; // JA oder NEIN ?
// Bei Ja, wird die IP in einer gro§en Datei auf dem Server gespeichert
$VorratsdatenspeicherungsOrdner= "
Mein-IP-Archiv"; //Ordner in dem das IP Archiv angelegt wird
$IParchivname = "
IP-Archiv"; // Name der Datei ist "Jahreszahl-Monta-IP-Archiv", also "2014-01-IP-Archiv.txt"

//
// Dieser Aufruf von der Fritzbox aus:
// http://www.deineDomain.de/Unterverzeichnis/index.php?pw=Passwort&mip=<ipaddr>
//
Erneuert die IP auf dem Webspace.
//
// Dieser Aufruf vom Browser aus:
// http://www.deineDomain.de/Unterverzeichnis/index.php?pw=Passwort&mip=127.0.0.1>
//
Erneuert die IP auf dem Webspace und schreibt 127.0.0.1 hinein.
//
// Dieser Aufruf:
// http://www.deineDomain.de/Unterverzeichnis/index.php
//
startet einen http//:deineIP (also standard Port 80)
//
// Dieser Aufruf:
// http://www.deineDomain.de/Unterverzeichnis/index.php?protocol=ftp&port=21
//
startet einen Aufruf mittels FTP//:deineIP:21 (bei Mozilla geht das Problemlos)
//
// Dieser Aufruf:
// http://www.deineDomain.de/Unterverzeichnis/index.php?protocol=vnc&port=5600
//
startet einen Aufruf mittels VNC//:deineIP:5600
//
// Dieser Aufruf:
// http://www.deineDomain.de/Unterverzeichnis/index.php?protocol=http&port=777&pfad=LustigerPfad
//
startet einen Aufruf mittels http//:deineIP:777/LustigerPfad
//
// Dieser Aufruf:
// http://www.deineDomain.de/Unterverzeichnis/index.php?suche
//
Öffnet ein Suchformular für die IP Suche im eigenen Archiv
//
// Dieser Aufruf:
// http://www.deineDomain.de/Unterverzeichnis/index.php?suche=127.0.0.1
//
Durchsucht das eigene IP Archiv nach der IP 127.0.0.1
//
// Durch die verschiedenen Parameter sollte die Konfiguration ein Kinderspiel für jeden sein.
//
// Ab hier nichts ändern, es sei denn man traut sich 8-)
// Eigentlich sind keinerlei Sicherheitsabfragen oder ähnliches eingebaut.

$Passwort = $_GET['pw']; // liest ein evtl Ÿbergebendes Passwort aus
$Port = $_GET['port']; // liest ein evtl Ÿbergebenden Port ein
$Port=$Port+0; // Es wird eine 0 zum Port addiert, das macht die Variable ganz sicher Numerisch
$Protocol = $_GET['protocol']; // liest ein evtl Ÿbergebenden Protokoll ein
$Pfad = $_GET['pfad']; // liest ein evtl Ÿbergebenden Pfad ein
$FritzIP = $_GET['mip']; // Ÿbermittelt die IP von der Firtzbox an die Variable FritzIP
$domain=$_SERVER['SERVER_NAME']; // ermittelt den aktuellen Domainnamen
$suche=$_GET['suche']; // Suchwort für die Vorratsdatenspeicherung
if(isset($_POST['Submit'])){ $suche=$_POST[search]; }

// Variablen anpassen
date_default_timezone_set('Europe/Berlin'); setlocale(LC_TIME, "de_DE");
if ($Protocol=="") {$Protocol="http";} // Falls kein Protokoll angegeben wurde wird http verwendet.
if ($Port==0) {$Port="";} // Wurde kein Port angegeben dann nutze auch keinen.
if ($Port>=1) {$Port=":".$Port;} // Gibt es einen Port gr?§er als 1 dann fŸge einen : hinzu
if ($Pfad!=="") {$Pfad="/".$Pfad;} // Gibt es ein Pfadangabe, dann stelle ein "/" voran.

 

if ($suche!==NULL) { // Suchwort angegeben ? Wenn nicht dann ein kleines Formular einblenden
if ($suche=="") {

echo '<form action="'.$_SERVER['PHP_SELF'].'" method="post">

<input name="search" type="text" value="127.0.0.1" size="20" maxlength="15" />
<input type="submit" name="Submit" value="Suchen die IP im Archiv" /></form>';
exit;
}
//Prüfen ob die IP aus 3 Punkten und Zahlen besteht
$ipcheck=substr_count($suche,"."); if ($ipcheck!==3) {echo "Fehler bei der IP Eingabe - Die Zahlen müssen durch Punkte getrennt sein"; exit;}
$iproh=str_replace(".","",$suche); if (is_numeric($iproh)==FALSE) {echo "Fehler bei der IP Eingabe - Es sind nur Zahlen erlaubt"; exit;}

// Ordnerinhalt (Dateinamen) in eine Variable einlesen
$handle=opendir($VorratsdatenspeicherungsOrdner); $ipfilesAlle="";
while ( $ipfiles = readdir ($handle)) {
if ($ipfiles != "." && $ipfiles != ".." && $ipfiles != ".DS_Store" && ! is_dir($ipfiles)) {
$ipfilesAlle=$ipfilesAlle."|".$ipfiles; } }
closedir($handle); $ipfilesAlle=substr($ipfilesAlle,1);$zaehler=0;$treffer=0;
$aufloesung = explode("|", $ipfilesAlle); $AnzahlEintraege=count($aufloesung)-1; // in Array umwandeln

echo "Gesucht wurde folgende IP: <b>".$suche."</b>";
echo "<br>Im Ordner: <b>".$VorratsdatenspeicherungsOrdner."</b><br>";

//Die Dateien einladen und nach der IP suchen.
do {

$inhalt = file_get_contents($VorratsdatenspeicherungsOrdner."/".$aufloesung[$zaehler]);
$position=strpos($inhalt, $suche); $laengesuchwort=strlen($suche);
if ($position!==FALSE) { // Eintrag gefunden ?

// Alles etwas Lesbarer gestalten...
$auschnitt=substr($inhalt,$position-23,$position+$laengesuchwort); // Eintrag inkl Datum und Uhrzeit freilegen
$jahr=substr($auschnitt,0,4);

$monat=substr($auschnitt,5,2);
$tag=substr($auschnitt,8,2);
$uhrzeit=substr($auschnitt,11,8);

$treffer=1;

echo "<br>Die IP: <b>".$suche."</b> wurde am <b>".$tag.".".$monat.".".$jahr."</b> um <b>".$uhrzeit."</b> Uhr von der Fritzbox im Logfile gespeichert<br>Der Eintrag befindet sich in der Datei <b>".$aufloesung[$zaehler]."</b><br><br>";
} $zaehler= $zaehler+1;
} while ($zaehler<=$AnzahlEintraege);

if ($treffer==0) {echo "<br>Es wurden keine Einträge zu der IP :<b>".$suche." </b>gefunden.";}

exit;}

 

// IP Datei erzeugen wenn sie nicht existiert
if (!file_exists($IP_Datei)) { // Existiert die Datei nicht ?
$datei = fopen("$IP_Datei", "w+"); // Lege eine Datei mit dem Namen an
fwrite($datei, "127.0.0.1"); // Als Dummy schreibe die IP 127.0.0.1 hinein.
fclose($datei); // Schlie§e die Datei
}
// Passwort ŸberprŸfen, IP Datei erneuern.
if($Passwort==$PASSWORT) { // Ist das passwort Korrekt, dann erneuere die IP
$datei = fopen("$IP_Datei", "w"); // …ffnen der IP Datei zum Schreiben
fwrite($datei, $FritzIP); // schreibt die Ÿbergebene IP in die Datei
fclose($datei); // Schliesst die Datei fŸr den Schreibzugriff
echo "good ".$domain; // gibt "good Domainname" aus.

// Ab hier kommt die VorratsDatenspeicherung

if ($Vorratsdatenspeicherung=="JA") { // Sollen die IPs dauerhaft gespeichert werden ?
$jahr=date("Y");$monat=date("m"); // Jahreszahl und Monatszahl ermitteln
// und zu Filenamen zusammensetzen:
$Filename=$VorratsdatenspeicherungsOrdner."/".$jahr."-".$monat."-".$IParchivname.".txt";

// Eintrag zusammenstellen: yyyy-mm-tt hh:mm:ss IP:ipadresse
$datum=date("Y-m-d H:i:s",time()); $inhalt=$datum." IP:".$FritzIP."\n";

// existiert der Ordner fŸr das IP Archiv noch nicht, dann erzeuge es:
if (!file_exists($VorratsdatenspeicherungsOrdner)) { mkdir($VorratsdatenspeicherungsOrdner, 0777, true); }

// …ffne aktuelle Monatsdatei und h?nge aktuelle IP an, wenn noch keine Datei existiert
// wird eine neue angelegt
// Inhalt in die Variable $Alterinhalt einlesen
if (file_exists($Filename)) {$Alterinhalt = file_get_contents($Filename);
$umdrehen=strrev($Alterinhalt); $Position= strpos($umdrehen, ":PI"); $AlteIP= substr($umdrehen, 1, $Position-1);
$AlteIP=strrev($AlteIP); }

if ($AlteIP!==$FritzIP) { // ist die IP nicht identisch mit der Alten , dann...

$datei = fopen("$Filename", "a"); // …ffnen der IP Datei zum Schreiben
fwrite($datei, $inhalt); // schreibt Datum, Uhrzeit und IP in die Datei
fclose($datei); // Schliesst die Datei
}
}
exit; // Beende das Script
}
// Bei allen anderen Aufrufen entsprechend umleiten
if (file_exists($IP_Datei)) { // Wenn das Passwort nicht korrekt oder gar
// gar nicht Ÿbermittelt wurde, dann...
$datei= fopen("$IP_Datei", "r"); // …ffne die Datei nur zum Lesen
$inhalt = fread($datei,filesize($IP_Datei)); // Inhalt in die Variable $inhalt einlesen
fclose($datei); // Schlie§e die Datei wieder.
$url=$Protocol."://".$inhalt."".$Port."".$Pfad; // die Url wird zusammen gesetzt

header("Location: $url"); // Ruft die Url passend auf
exit; // beendet das Script
}

?>

Download der PHP Datei vom 11.01.2014....


Was geht noch ? Wie kann ich es erweitern.

Mittlerweile übergebe ich die aktuelle IP per PHP an eine weitere Webseite die mir schön sauber alle angeschlossenen Geräte zuhause auflistet (inkl. Router) und dort kann ich dann per Mausklick div. Fernwartung ausführen oder direkt auf den Inhalt der NAS Platten zugreifen. Das ganze ist mittlerweile per HTTPs realisiert, damit die Passwörter nicht im Klartext übergeben werden. Auch eine VPN Verbindung auf "knopfdruck" ist eine feine Sache.
Natürlich ist das ganze ausgiebig geschützt und wird auch noch zusätzlich überwacht.
Ich habe schon etliche Anfragen zu dem Thema bekommen, wie man so etwas umsetzt - Ich sage immer: Learning by doing...

Hier mal ein paar "Hints" - ein bischen Eigeninitative muss aber auch mal sein.

das könnte z.b. so aussehen (php) (in Auszügen):

<?php

$DYNIP="/qnap/dynip.txt"; // Ordner und Name der Textdatei wo die IP gespeichert ist.

if (file_exists($DYNIP_FILE)) {$fp = fopen("$DYNIP_FILE", "r+");// Liest die aktuelle IP in die Variable $dynip
$dynip = fread($fp,filesize($DYNIP_FILE));
fclose($fp);} ?>

Dort wo jetzt eine hübsche Tabelle mit euren Geräten oder Festplatten ist, fügt ihr z.b. statt des Hyperlinks zu "#" folgendes ein:

<a href="https://<?php echo $dynip;?>:496">Fernwartung Router</a> (Gibt einen Klickbaren Link aus, der auf Port 496 umleitet)

<a href="ftp://<?php echo $dynip;?>:21">Mein Server per FTP</a> (Auf Klick wird auf FTP umgeleitet)

<a href="http://<?php echo $dynip;?>:8080">Webcam</a> (Auf Klick wird die verbaute Webcam angesteuert)

<a href="http://<?php echo $dynip;?>:8081">Webcam2</a> (Auf Klick wird die verbaute Webcam2 angesteuert)

 

Eigentlich ganz simpel...


UPDATE 18.01.2014: Die Meldung im Ereignis Protokoll lässt sich doch verhindern !!

Danke an Reimund B.:

Die Fehlermeldung in der Fritzbox läßt sich ganz einfach beheben:

Die Fritzbox hat als Parameter für jeden hinterlegten DynDNS-Dienst (auch den benutzerdefinierten) eine zeitliche Vorgabe, wann der erfolgreiche Wechsel abgefragt werden soll.
Z.B. bei DNYDNS steht der Wert auf "0w", also sofort. Für den benutzerdefinierten bei "4m", also vier Minuten. Wenn man nun diesen Wert auf "1d" stellt, also 1 Tag, dann wird die Meldung nicht mehr generiert, da die Abfrage erst nach 24 Stunden erfolgt. Vorher sorgt die Zwangstrennung und der erneute Beginn des Zählers bei Null für das Ausbleiben der "Fehlermeldung".

Mit Fritzbox Editor die "ar7.cfg" auslesen. "ddns" suchen. Für jeden Dienst ist der Wert "livedelay = xx" hinterlegt. Nun einfach xx gegen das gewünschte austauschen (mindestens länger als die tatsächliche Updatezeit). Die cfg zurückspielen und gut ist es!!!

Kann man auch sehr schön testen, wenn man z.B. 30m eingibt. Dann kommt die Fehlermeldung nicht mehr alle 4 Minuten, sondern alle 30 Minuten.


Ich habe das hier mal getestet - es funktioniert hier tadellos. Für meine 7390 habe ich die Version 5.5 des FB Editors verwendet.

Die Version 5.5 befindet sich in diesem Thread: http://www.ip-phone-forum.de/showthread.php?t=254106

Artikel der COM Zeitschrift zu dem Editor...


UPDATE 19.01.2014: Die Meldung im Ereignis Protokoll lässt sich GANZ SIMPEL verhindern!

Danke an Johannes M.:

Die Fehlermeldung in der FRITZ!Box lässt sich auch verhindern,
indem man bei den Dynamic-DNS-Einstellungen fritz.box als Domainnamen einträgt!


Ich habe das auch mal getestet - es funktioniert ganz gut. Leider tauch nach etwa einem Tag eine neue Meldung im Ereignis Protokoll auf: "Dynamic DNS-Fehler: Der angegebene Domainname kann trotz erfolgreicher Aktualisierung nicht aufgelöst werden." und das ca alle 10 Minuten. Wer also keine Lust hat mit dem Fritzbox Editor in der FB rum zu Pfuschen, der kann diesen simplen Tipp nutzen - Um die Meldung komplett los zu werden führt bislang kein Weg am Fritzbox Editor vorbei.


UPDATE 11.02.2014: Die Meldung "Dynamic DNS-Fehler" im Ereignis Protokoll abstellen:

Danke an Johannes N.:

die Fehlermeldung
"Dynamic DNS-Fehler: Die Dynamic DNS-Aktualisierung war erfolgreich, anschließend trat jedoch ein Fehler bei der DNS-Auflösung auf"
beendete nach einem IP Wechsel die dyndns Aktualisierung bei meiner Speed.box komplett.

Von dem FB Editor (aktuell 0.6.9) kann ich nur abraten, da auch in der neusten Version gefahren lauern betreffend untschiedlicher firmwareversionen und mit modifizierten Boxen Seiteneffekte auftreten können.
Funktionierte bei mir nicht einwandfrei (kostete mich 1 Stunde den alten stand wieder herzustellen).

Ich habe stattdessen mit folgenden Anleitungen die Datei ar7.cfg mit Erfolg direkt bearbeitet.

1) Telnet aktiviert
(info: http://www.wehavemorefun.de/fritzbox/Starten_von_telnetd)

2) Mit Putty verbinden
http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html

3) beschrieben Werte nach Reimund B. geändert (/var/flash/ar7.cfg)
(Anleitung zur Bearbeitung von Dateien: http://www.physigon.de/grundlagen/48-grundlagen-internet/63-fritzbox-dns-server-aendern)

4) reboot
(eingeben bei telnet)

5) Telnet deaktiviert


Ich habe zur Zeit leider keine Zeit das ganze auszuprobieren, evtl findet sich jemand der das mal testet ?


UPDATE 11.02.2014: Fritzbox mit VPN verbinden:

Nochmal danke an Johannes N.:

durch das Skript ist kein direkter serverzugriff (z.B. VPN) möglich, deshalb habe ich kleine Veränderungen durchgeführt.
Nachdem das batch abgelaufen ist kann man z.B. mit server1.dyndns.local direkt auf die hosts zugreifen.
Falls das von interesse ist… eine richtige Anleitung ist das natürlich nicht….

// UPDATE URL: http://meinedomain/ddns/index.php?pass=<pass>&ip=<ipaddr>&user=<username>&domain=<domain>
// DOMAINNAME: www.abc.de //wird der fritzbox mit "good www.abc.de" zurückgemeldet (die Domain sollte richtig aufgelöst werden können und wird später in der box angezeigt.)
// BENUTZERNAME: meinserver //Bezeichner für server 1) legt datei an: meinserver.txt 2) eintrag für hosts datei: meinserver.dyndns.local
// KENNWORT: meinpass //zur absicherung, dass der dienstbenutzer berechtigt ist


1) Unterstützung von mehreren fritzboxen: legt dateien nach benutzername z.B. meinserver.txt mit dem Format
192.168.0.1 meinserver.dyndns.local
2) Updateskript für die Hosts Datei mit sed und wget
http://sourceforge.net/projects/gnuwin32/files/wget/1.11.4-1/wget-1.11.4-1-setup.exe/download?use_mirror=dfn
http://sourceforge.net/projects/gnuwin32/files//sed/4.2.1/sed-4.2.1-setup.exe/download


Rem lösche dyndns.local server, hole aktuelle vom server und füge diese wieder zusammen------------------------------------------------------------------------------------------------
set FN=%WINDIR%\system32\drivers\etc\hosts.

echo remove all dyndns.local hosts from hosts file
sed {/dyndns.local/d} %FN% > hosts.new

echo remove all downloaded hosts files
del *.txt

echo download hosts
wget http://meinwebserver/server1.txt
wget http:// meinwebserver /server2.txt
wget http:// meinwebserver /staticservers.txt

hosts anfügen
type *.txt >> hosts.new

system hosts file updaten
copy hosts.new %FN% /Y




Auch hier fehlt mir die Zeit das auszuprobieren und zu implementieren. Vieleicht traut sich ja jemand.


UPDATE 19.02.2014: Wake on Lan und Magic Paket für NAS oder Rechner:

Erweiterung von Axel M.:

ich wollte mich bedanken, für das tolle php-Skript zwecks eigenem dynDNS-Dienst. Somit brauche ich keinen dynDNS-Dienst. Es muss ja nicht jeder die IP-Adresse meiner Fritz!-Box kennen. Die Vorratsdatenspeicherung der IP-Adressen finde ich ebenfalls genial. Man weiß ja nie, und wie sie selbst gesagt haben, wenns mal hart auf hart kommt, weiß man zwar nicht was es bringt, aber man hat wenigstens überhaupt was in der Hand. Gleichzeitig habe ich noch eine kleine Erweiterung eingebaut, und wollte ihnen diese mitteilen, evtl. hilft es jemandem, der eine solche Funktion benötigt.

Problemstellung war folgende. Ich habe in meinem Netzwerk eine Netzwerkfestplatte (NAS), und möchte diese, wenn ich sie benötige von überall aus über "Wake on LAN" starten, damit ich dann darauf zugreifen kann. Also habe ich das Skript um eine Funktion erweitert, mit der ich das notwendige "Magic-Packet" an das NAS-System über einen Browseraufruf senden kann und dann anschliessend mit dem entsprechenden Protokoll (http oder ftp oder was auch immer) auf das NAS-System zugreifen kann. Die Portfreigaben für den Zugriff müssen natürlich in der Fritzbox eingestellt sein, hierauf gehe ich nicht weiter ein.

Das Skript ist dann wie folgt zu erweitern:

$Mac = $_GET['mac']; // liest eine evtl. übergebene Mac-Adresse ein
$Passwort = $_GET['pw']; // liest ein evtl Ÿbergebendes Passwort aus
$Port = $_GET['port']; // liest ein evtl Ÿbergebenden Port ein
$Port=$Port+0; // Es wird eine 0 zum Port addiert, das macht die Variable ganz sicher Numerisch
$Protocol = $_GET['protocol']; // liest ein evtl Ÿbergebenden Protokoll ein
$Pfad = $_GET['pfad']; // liest ein evtl Ÿbergebenden Pfad ein
$FritzIP = $_GET['mip']; // Ÿbermittelt die IP von der Firtzbox an die Variable FritzIP
$domain=$_SERVER['SERVER_NAME']; // ermittelt den aktuellen Domainnamen
$suche=$_GET['suche']; // Suchwort für die Vorratsdatenspeicherung
if(isset($_POST['Submit'])){ $suche=$_POST[search]; }

if (!$Mac=="") {

if ($Port=="") {echo "Fehler: für MagicPacket muss Port angegeben werden"; exit;}
if (!$Protocol=="udp") {echo "Fehler: für MagicPacket muss Protocol udp sein"; exit;}

$Mac = str_replace(':', '', $Mac);
// check if $macAddress is a valid mac address
if (!ctype_xdigit($Mac)) {
throw new \Exception('Mac address invalid, only 0-9 and a-f are allowed');
}

$MacBinary = pack('H12', $Mac);

$magicPacket = str_repeat(chr(0xff), 6).str_repeat($MacBinary, 16);

$datei= fopen("$IP_Datei", "r");
$broadcastAddress = fread($datei,filesize($IP_Datei));
fclose($datei);

if (!$fp = fsockopen('udp://' . $broadcastAddress, $Port, $errno, $errstr, 2)) {
throw new \Exception("Cannot open UDP socket: {$errstr}", $errno);
}
fputs($fp, $magicPacket);
fclose($fp);
exit;
}

Danach gehts weiter mit der Version von ihnen. Es wird also eine zusätzliche Variable $Mac angelegt. Denn für das MagicPacket muss man die Mac-Adresse der Netzwerkkarte des zu startenden Rechners angeben. Als Protokoll muss udp gewählt werden (man könnte die Angabe des Protokolls in der Parameterliste auch weglassen, aber ich wollte, dass man sie angeben muss, um sicherzustellen, dass man auch wirklich das tut was man tun will.) Als Port kann man irgendeinen freien UDP-Port eingeben, dieser muss in der Fritzbox an das zu startende Gerät an den UDP-Port 7 (Standard-Port für WoL) weitergeleitet werden.
Mit dem Aufruf

http://www.meinedomain.de/Unterseite/index.php?mac=AA:BB:CC:DD:EE:FF&port=49151&protocol=udp

in dem die Mac-Adresse AA:BB:CC:DD:EE:FF durch die tatsächliche Mac-Adresse der Netzwerkkarte des zu startenden Gerätes ersetzt werden muss, kann das Gerät nun von jedem Ort an dem man Internetzugriff hat gestartet werden und anschliessend dann darauf zugegriffen werden.

Zur Ergänzung: Die Fritzbox hat eine Funktion, mit der Geräte automatisch gestartet werden können, wenn über Internet auf sie zugegriffen wird. Allerdings hat diese Funktion, zumindest bei der von mir verwendeten Fritz!Box 6360 Cable (KabelDeutschland) einen Fehler und funktioniert nicht. Dieses Problem ist bekannt und besteht schon längere Zeit, wurde aber bisher nicht behoben, weder von AVM noch von Kabel Deutschland (keiner will Schuld sein ;-)) Deshalb die Erweiterung.


Tolle Idee, ich brauch es nicht - aber für den einen oder anderen sicher eine gute Idee....

Danke dafür.


12.04.2013:

Danke an Harald K. von ENTSPERREN.NET für seine Verbesserung des Scripts:

Harald K.: "...ich habe dein script etwas abgändert..
es hat wie erwartet sofort funktioniert, doch die fehlermeldung der fritzbox sollte ja auch weg.
also habe ich nach dem spezifikationen gesucht die dyndns erwartet bei der anmeldung als router oder sonst einer pheriperie.
stand natürlich nichts darüber ;o)
aber mittels einen sniffers konnte ich genau sehen was die box zu dyndns sendet und was dyndns zur box sendet...

die lösung ist einfach: "good 172.0.0.1" ohne: " also good gefolgt von der ip adresse ;o)
also: echo 'good '.$IP;

dann ist auch der fehler in der fritzbox weg...

hier mal dein script von mir abgeändert:

<?
// DynDNS Ÿber Fritzbox
//
// Passwort und Port nach belieben anpassen.
//
// In der Fritzbox das Script z.b. so aufrufen:
// Update Url: www.MeineDomain.de/ordner/filename.php?pass=Passwort&ip=<ipaddr>
// Domainname: MeineDomain.de/
//
// www.jau.cc/dns/index.php?pass=0815&ip=91.119.82.187
// http://dns.jau.cc/?pass=0815&ip=91.119.82.187
//
// Dieses Beispiel leitet zu der "IP:8080/cgi-bin/filemanager/" weiter...
$pwort = '0815'; // Hier sollte man sein persšnliches Passwort fŸr die Erneuerung der IP eintragen.
//$port = ':8080/cgi-bin/filemanager/'; // Diese legt nur den "Port" und evtl Parameter fest.Kann auch leer bleiben
$dyntxt = "IP.txt";
$pworttest = $_GET["pass"];
$IP = $_GET["ip"];

if (file_exists($dyntxt))
{
if($pworttest==$pwort)
{
$a = fopen("$dyntxt", "w");
$dynamicip = $_SERVER["REMOTE_ADDR"];
echo 'good '.$IP;
fwrite($a, $IP);
fclose($a);
}
else
{
$a = fopen("$dyntxt", "r+");
$dynamicip = fread($a,filesize($dyntxt));
fclose($a);
$port=$_SERVER["REQUEST_URI"];
$url="http://".$dynamicip."".$port;
$url = str_replace("/?/", "/", $url, $count);
header("Location: $url");
}
}
?>


ich habe es um eine weiter funktion erweitert...

wenn man jetzt zb.: http://dyn.jau.cc/?/ORDNER/ORDNER2/test.php eingibt, würde das script
die adresse so umbauen: http://127.0.0.1/ORDNER/ORDNER2/test.php

man muss also nur ein: /?/ dazwischen einfügen und man kann dann direkt auf jeden ordner / script zugreifen als hätte man eine richige domain...
das: /?/ ist nötig damit der webhost erkennt das hier die url endet.
alles was nach /?/ kommt, fügt meine änderung an die ip adresse drann und schneidet das /?/ raus.

somit kann mein client tool super damit arbeiten wie es auch bei dyndns funktioniert hat und man kann verschiedene seite aufrufen (in meinem fall zb. für den login und für die credits abfrage, wofür ich ja verschiedene scripte aufrufen muss und nicht einfach nur eine weiterleitung brauche).

einzige schwachstelle: es funktioniert kein vnc, ftp, socket verbindungen gehen leider nicht...


15.04.2013

Nocheinmal Danke an Harald K. von ENTSPERREN.NET für seine erhebliche Verbesserung des Scripts:

Harald K: "Ich habe es erweitert um:
1.) gleichzeitiges anmelden über fritzbox beim script wie auch bei dyndns
2.) die ip aus anwedungen aus direkt abfragen.
im moment mache ich von meinem client tool eine anfrage an das script wie die aktuelle ip lautet, mein client tool
verwendet dann diese ip für alle weiteren verbindungen.. damit ist es nun möglich via sockets, ftp usw.. zu verbinden.
und das gute dabei ist, das die daten dann nicht über den dyndns server laufen (wie es zb. bei dyndns.org der fall ist),
sondern das eine direkte verbindung aufgebaut wird.

weiters habe ich nun durch punkt 1 auch die möglichkeit die dyndns.org adresse zu verwenden wenn ich doch vnc verwenden
will und zu faul bin die adresse zuerst vom script abzufragen.

3.) das passwort wird nun nicht mehr sichtbar in die url für die fritzbox angegeben, ich habe auch hier einen platzhalter verwendet.
damit kann man das passwort nicht mehr so einfach sehen und es wird bei der eingabe in dem edit feld der fritzbox auf gleichheit
kontrolliert, da man es ein zweites mal bestätigen muss.

bei meinen tests bis jetzt, keine fehlermeldung meiner fritzbox (bis jetzt) und das gleichzeitige updaten beim script und bei dyndns.org läuft auch ohne fehler.

da mein hoster das auswerten fremder seiten nicht gestattet, musste ich einiges and aufwand betreiben damit das auch funktioniert.
ich musste einen header via sockets senden und eine basic base64 auth. machen, dazu muss ein useragent mitgesendet werden.
man bekommt dann auch keine einfache "good IP" antwort, sondern man muss die antwort dann aus dem text parsen.
das script gibt nun die richtigen beiden relevanten antworten für die fritzbox: good und badauth.
badagent kommt ja nur wenn der useragent nicht akzeptiert wurde, der ist fix eingetragen, somit passt dieser und muss nicht ausgewertet werden.

4.) ich habe die beschreibung den neuen funktionen angepasst, rechtschreibfehler und formulierungen wurde nicht korregiert,
musste es auf schnell schnell umbauen..

möglich wäre noch einen benutzernamen zum script hinzuzufügen und eine kleine db und regestrierungsseite..
dann könnte man dieses script auch anderen zur verfügung stellen ohne das diese einen eigenen server bzw. eigene domain brauchen würden.
(aber der sinn des scriptes ist ja, das es jeder selbst umsetzen kann der es braucht und um es einfach zu halten, darum habe ich es weg gelassen)

hier ist das neue:

<?
/* DynDNS über Fritzbox

Dieses PHP Script sollte auf dem Webspace in einen Unterordner kopiert werden (zB. /dns) und man sollte es "index.php" benennen.
Passwort und Port nach belieben anpassen.

<------------------------------------------------------------------------------------------------------------->

ANWENDUNGSBEISPIELE:

DIE DYNAMISCHE IP ÜBER DEN BROWSER ABFRAGEN:
www.MeineDomain.de/dns/ (wenn das PHP Script als index.php benannt ist, dann braucht nichts weiter geschrieben werden)

DIE IP ÜBER DEN BROWSER UPDATEN:
http://www.MeineDomain.de/dns/?pass=Passwort&ip=IP ADRESSE

DIESES PHP SCRIPT IN DIE FRITZBOX EINTRAGEN:
Update-URL: www.MeineDomain.de/dns/index.php?pass=<pass>&ip=<ipaddr>
Domainname: leer lassen
Benutzername: leer lassen
Kennwort: Passwort
Kennwortbestätigung: Passwort ein zweites mal eingeben

EINE BESTIMMTE SEITE ÜBER DIESE PHP SCRIPT AUFRUFEN WELCHES AM SERVER DER DYN. IP GEHOSTET IST:
www.MeineDomain.de/dns/?/ <- und hier den Ordner und Namen hinzufügen.
zB.
www.MeineDomain.de/dns/?/filemanager/index.php
Dieses PHP Script würde dann die Dynamic IP + Path anwenden und zu dessen Seite weiterleiten.
Das könnte dann zB. so aussehen: http://127.0.0.1/filemanager/index.php

DIE DYNAMISCHE IP AUS ANWENDUNGEN ABFRAGEN:
Es ist möglich, aus einer Anwendung die Dynamische IP abzufragen und dann
über diese IP jede beliebige Verbindung aufzubauen, somit funktioniert auch FTP, VNC, SOCKETS usw..
Dieses PHP Script gibt als Antwort folgendes zurück: good 127.0.0.1
(wobei 127.0.0.1 für die Dynamische IP steht)
Somit ist es leicht möglich, die Dynamische IP aus eigenen Anwedungen abzufagen und diese dann
für weiter Verbindungen direkt zu verwenden.

DAS DOPPELTE UPDATEN DER IP AM PHP SCTIP UND BEI DYNDNS.ORG:
Mit diesem PHP Script ist es einfach, sowohl auf dem PHP Script als auch auf DynDns.org upzudaten.
Somit kann man dieses Script zusammen mit einem DynDns.org Account verwenden und man hat dadruch alle möglichkeiten.
Dazu muss die Variable "$update_dyndns" auf "True" gesetzt werden und deine Dyndns.org Accountdaten müssen eingetragen werden!

$update_dyndns = True;
$dyn_user = dein Dyndns.org Username
$dyn_pass = dein Dyndns.org Passwort
$dyn_host = dein Dyndns.org Hostname

TIPP:
Mit einer Subdomain könnte das Script zB. so aussehen: (Beispiel für die Fritzbox URL)
http://dns.jau.cc/?pass=<pass>&ip=<ipaddr>
<------------------------------------------------------------------------------------------------------------->*/
$pwort = 'Dein Passwort für dieses PHP Script'; // Hier sollte man sein persšnliches Passwort für die Erneuerung der IP eintragen.

//dyndns.org account data
$update_dyndns = False;
$dyn_user = 'Dein Dyndns.org Username';
$dyn_pass = 'Dein Dyndns.org Passwort';
$dyn_host = 'Deine Dyndns.org Host Adresse';

$dyntxt = "IP.txt";
$pworttest = $_GET["pass"];
$IP = $_GET["ip"];

if (file_exists($dyntxt))
{
if($pworttest==$pwort)
{
$a = fopen("$dyntxt", "w");
$dynamicip = $_SERVER["REMOTE_ADDR"];
fwrite($a, $IP);
fclose($a);
if ($update_dyndns) //send new ip also to dyndns for update:
{
$fp=DynDnsUpdate($dyn_host, $IP, $dyn_user, $dyn_pass);
//echo $fp;
/*
if dyndns.org respond with:
badauth = then ip update failed!
badagent = then the user agent inst accepted!
HTTP/1.1 200 OK Date: Sun, 14 Apr 2013 19:58:20 GMT Server: Apache X-User-Status: free Content-Type: text/plain Accept-Ranges: none Connection: close Transfer-Encoding: chunked 12 good 91.119.82.187 0 = then successfull ip update!
*/
$pos=strpos($fp, 'good '.$IP);
if ($pos === false)
{
die('badauth');
}
else
{
die('good '.$IP);
}
}
else die('good '.$IP);
}
else
{
$a = fopen("$dyntxt", "r+");
$dynamicip = fread($a,filesize($dyntxt));
fclose($a);
$port=$_SERVER["REQUEST_URI"];
//check for "/?/" in url, if not then just echo IP
$pos=strpos($port, '/?/');
if ($pos === false)
{
echo $dynamicip;
die();
}
else
{
$url="http://".$dynamicip."".$port;
$url = str_replace("/?/", "/", $url, $count);
header("Location: $url");
}
}
}

function DynDnsUpdate($dyn_host, $IP, $dyn_user, $dyn_pass)
{
/*
GET /nic/update?hostname=yourhostname&myip=ipaddress&wildcard=NOCHG&mx=NOCHG&backmx=NOCHG HTTP/1.0
Host: members.dyndns.org
Authorization: Basic base-64-authorization
User-Agent: Company - Device - Version Number
*/
$host = 'members.dyndns.org';
$path = '/nic/update?hostname='.$dyn_host.'&myip='.$IP.'&wildcard=NOCHG&mx=NOCHG&backmx=NOCHG';

$fp = fsockopen($host, 80);
fputs($fp, "GET $path HTTP/1.1\r\n");
fputs($fp, "Host: $host\r\n");
fputs($fp, "Authorization: Basic ".base64_encode($dyn_user.':'.$dyn_pass)."\r\n");
fputs($fp, "User-Agent: jau.cc - FRITZ!Box Fon WLAN 7140 Annex A - 39.04.59\r\n");
fputs($fp, "Connection: close\r\n\r\n");
while(!feof($fp))
{
$res .= fgets($fp, 128);
}
fclose($fp);
return $res;
}
?>

ich weis jetzt warum ich keine fehler meldung in meiner fritzbox sehen konnte..
ich hatte bei domainame den dyndns.org host namen eingetragen...

dieses feld ist dazu da, das man den router zb. von aussen über diese domain erreichen kann.
da ich die andresse auch bei dyndns.org eingetragen habe, funktioniert das über diese adresse auch weiterhin und deshalb bekomme
ich keine fehlermeldung...

wenn ich diese adresse entferne, habe ich die selbe fehlermeldung wie du sie mir beschrieben hast, wenn ich stattdessen dns.jau.cc eingebe, dann bekomme ich die selbe fehlermeldung.

hier steht auch ganz genau warum: http://service.avm.de/support/de/SKB/FRITZ-Box-7390/187:Fehlermeldung-Die-Dynamic-DNS-Aktualisierung-war-erfolgreich-anschliessend-trat-jedoch-ein-Fehler

wenn man also das neue script verwendet und im dual modus unterwegs ist (also via script und dyndns.org), dann kann man als domain namen einfach den dyndns.org host eintragen und der fehler ist weg und zusätlich ist die fritzbox auch mit der dyndns.org adresse erreichbar...


24.09.2013

Ein Herzliches Danke an "Marcel Meissel", für eine vereinfachung des Scriptes für die Portweiterleitung.

Marcel "danke für das super DynDNS-Script zum selbst hosten! Da ich auf meiner Fritzbox verschiedene Ports auf verschiedene Geräte zu Hause forwarde (Sat-Receiver, RaspberryPi,...) fehlte mir die Möglichkeit die mit dem Script zu tun. Meine Version hat nun noch dem Parameter des Ports dabei.

<?
// DynDNS über Fritzbox
//
// Passwort und Port nach belieben anpassen.
//
// In der Fritzbox das Script z.b. so aufrufen:
// Update Url: www.MeineDomain.de/ordner/filename.php?pass=Passwort&ip=<ipaddr>&port=Portnummer
// Domainname: MeineDomain.de/
//
// www.MeineDomain.de/dns/index.php?pass=0815&ip=127.0.0.1&port=8080
//

$pwort = 'foo'; // Hier sollte man sein persönliches Passwort für die Erneuerung der IP eintragen.

$dyntxt = "dynip.txt";
$pworttest = $_GET["pass"];
$IP = $_GET["ip"];
$vport = $_GET["port"]; //Port-# zur gezielten Weiterleitung
if (file_exists($dyntxt))
{
if($pworttest==$pwort)
{
$a = fopen("$dyntxt", "w");
$dynamicip = $_SERVER["REMOTE_ADDR"];
echo 'good '.$IP.' '.$port;
fwrite($a, $IP);
fclose($a);
}
else
{

$a = fopen("$dyntxt", "r+");
$dynamicip = fread($a,filesize($dyntxt));
fclose($a);
//$port=$_SERVER["REQUEST_URI"];
//$url="http://".$dynamicip.$port.":".$vport;
$url="http://".$dynamicip.":".$vport.$port;
$url = str_replace("/?/", "/", $url, $count);
header("Location: $url");

}
}
?>

Impressum Startseite Grund Installation Grundlagen Code-Schnippets Hilfreiches Projekte Querschläger Meckerecke