o2 Box 6431 IP auslesen für DynDNS & Co

Für die, die gerne an ihre IP im O2 Box 6431 Router gelangen möchten, damit sie DynDNS und andere Dienste nutzen können, habe ich hier ein kleines Workaround. Für die, die externe Webseiten zur Auflösung der IP nutzen kann dies auch von Vorteil sein. Euren Router kümmert es nicht wie oft ihr die IP auslest. Voraussetzung ist leider, dass ihr einen Rechner zur Verfügung habt, der ununterbrochen Anfragen and euren Router senden und Updates durchführen kann. Das kann ein Raspberry sein oder ein mini ITX Rechner oder eine “alte Möhre” die ihr noch rumstehen habt.

Abhängig von dem DynDNS Client den ihr nutzt müssen die Scripte abgestimmt werden. Beispiele  gibt es hier für Windows und Linux. Enjoy!

Update 17.03.2015:
Keine Probleme mehr. War wohl eher ein O2 Problem.

Update 30.11.2014:
Ich habe feststellen müssen, dass seitdem ich die IP über das Web-Interface beziehe, ich alle 2-3 Tage den Router neustarten muss. Es erfolgt sonst keine Neueinwahl mehr. Heute habe ich das Skript so geändert, dass es Daten aus der diagnostic.htm ausliest und nicht mehr aus der wan_ipaddr.htm. Ergebnisse folgen.

Update 06.12.2014:
Brachte keine Besserung.

 

Windows Powershell

Achtung! Falls das Ausführen von Powershell Scripten momentan nicht erlaubt sein sollte, kann es hilfreich sein die Policy auf RemoteSigned zu setzen. Dazu die Powershell als Administrator starten!

Befehl:

Set-ExecutionPolicy RemoteSigned

Powershell:

PS C:\Windows\system32> Set-ExecutionPolicy RemoteSigned

Ausführungsrichtlinie ändern
Die Ausführungsrichtlinie trägt zum Schutz vor nicht vertrauenswürdigen Skripts bei. Wenn Sie die Ausführungsrichtlinie
 ändern, sind Sie möglicherweise den im Hilfethema "about_Execution_Policies" beschriebenen Sicherheitsrisiken
ausgesetzt. Möchten Sie die Ausführungsrichtlinie ändern?
[J] Ja  [N] Nein  [H] Anhalten  [?] Hilfe (Standard ist "J"): J

 

Script:

<router-ip>;<passwort>; u.s.w. bitte entsprechend anpassen, aber aufgepasst, das funktioniert nur wenn niemand sonst am Router angemeldet ist.

$nw = New-Object system.Net.WebClient;
$gc = $nw.downloadString("http://<router-ip>/cgi-bin/Hn_login.cgi?idTextPassword=<passwort>");
$gc = $nw.downloadString("http://<router-ip>/wan_ipaddr.htm");
$test = echo $gc | findstr /R "wan_ip='[0-9]*.[0-9]*.[0-9]*.[0-9]*'";
$last = $test.LastIndexOf("'");
$first = $test.IndexOf("'");
$test = $test.substring($first+1,$last-$first-1);
echo $test;
$gc = $nw.downloadString("http://<router-ip>/cgi-bin/Hn_logout.cgi");

Hier wird an einer stelle mit echo die IP ausgegeben-> das Script kann ganz simpel mit einem Befehl erweitert werden um euren dyndnsclient über console bzw. Eingabeaufforderung auszuführen.

Zum Beispiel könnte man ddclient + Perl für Windows verwenden. Wenn ihr Hilfe braucht, sagt einfach bescheid.

Wegen der hohen Anfragen habe ich jetzt ein kleines Video erstellt als Guide für die Umsetzung der Perl + ddclient + Powershell Version.

 

Da ich auf Probleme mit SSL gestossen bin, war es notwendig neue Pakete einzuspielen:

Fehlermeldung Keywords:

SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

IO::Socket::INET configuration failed

Komplette Meldung:

IO::Socket::SSL: SSL connect attempt failed with unknown error error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed at [scriptname] line 123456. IO::Socket::INET configuration failed error

 

Perl (Module) Pakete: http://www.sisyphusion.tk/ppm/

 

Ähnliche Fehlermeldungen:

IO::Socket::SSL: SSL connect attempt failed with unknown error error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed at [scriptname] line 123456. IO::Socket::IP configuration failed error

Hier ist es immer hilfreich auf die neuesten Versionen der Module upzugraden. Aufmerksamkeit sollte bei den Modulen

  • IO-Socket-IP
  • IO-Socket-INET
  • IO-Socket-SSL

liegen.

 

oder ausschließlich SSL Fehler:

IO::Socket::SSL: SSL connect attempt failed with unknown error error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed

Das kann eventuell daran liegen, dass euer SSL kein SSL3 unterstützt. Ich umgehe es mit folgender zusätzlicher Zeile. Dieser Block ist bei etwa Zeile 1882 zu finden im ddclient Script selbst.

    } elsif ($use_ssl) {
            $sd = IO::Socket::SSL->new(
            PeerAddr => $peer,
            PeerPort => $port,
            Proto => 'tcp',
            MultiHomed => 1,
            SSL_verify_mode => 'SSL_VERIFY_NONE',
            Timeout => opt('timeout'),
        );

 

Download

Zu guter letzt, die ddclient Konfigurationsdateien aus dem Video: ddclient config files
Und das angepasste Powershell Script: Powershell Script getip

$nw = New-Object system.Net.WebClient;
$loc_ip = "192.168.1.1";
$pw = "1234567890";
$gc = $nw.downloadString("http://$loc_ip/cgi-bin/Hn_login.cgi?idTextPassword=$pw");
$gc = $nw.downloadString("http://$loc_ip/wan_ipaddr.htm");
$test = echo $gc | findstr /R "wan_ip='[0-9]*.[0-9]*.[0-9]*.[0-9]*'";
$last = $test.LastIndexOf("'");
$first = $test.IndexOf("'");
$test = $test.substring($first+1,$last-$first-1);
$gc = $nw.downloadString("http://$loc_ip/cgi-bin/Hn_logout.cgi");
return $test;

 

Das Video

 

Der Grund dafür, wieso ich das IP-Sammel Script in Powershell konstruiert habe ist einfach der, dass Powershell nunmal ein Hausmittel von MS ist und sich für eine Lösung anbietet. Damit dieses Script im Mittelpunkt verbleit, wurde die “Perl und ddclient” Lösung drumherum aufgebaut. Natürlich ist es möglich alles mit Perl zu erledigen. Durch die seperate Lösung mittels Powershell kann man jedoch auch jederzeit den Client wechseln, sofern dieser externe Befehle zum ermitteln der IP Adresse ausführen kann. So muss das Ermitteln nicht neu erfunden werden für diesen Router auf MS.

In der Regel wird das eigentliche Update des DNS-Eintrags durch den Aufruf einer https-Adresse angestoßen. Also bei DynDNS. Für euch selbst könntet ihr somit auch ein auf euren Anbieter abgestimmtes Powershell Script schaffen, indem ihr nur eine Hand voll Zeilen hinzufügt. Den Aufruf selbst und die Prüfung ob es erfolgreich war.

 

Zum Beispiel:

$lastupdate = get-content "update.cache";  // IP-Adresse mit der zuletzt am DNS geupdated wurde

...

Code zum Beziehen der IP (unser vorhandenes Script ohne return-Zeile)

...


$current_ip = $test; // nimm die ermittelte IP (aus unserem Script)  und schreib sie in "$current_ip"

if ($lastupdate) { // wurde bisher ein Update gefahren, würde dann hier eine IP-Adresse enthalten sein

    if($lastupdate -eq $current_ip) {  exit; } // hat sich die IP-Adresse nicht geändert? raus hier
    } else {  //ansonsten Update durchführen!!

    $update_status = $nw.downloadString("https://www.eueranbieter.de/nic/irgendeinpfad/update?myip=$current_ip&hostname=mein.dyndns.host.org");
...hier der Code um zu prüfen, ob das Update erfolgreich war (möglich, dass es schon ausreicht nach einem Stichwort zu suchen wie "Success". Bei dyndns2 kommt laut API zum Beispiel ein "good" wenn das Update erfolgreich war) Und um Himmels willen besorgt euch die richtigen Update Urls von eurem Anbieter...

    $update_status =  select-string "good" -InputObject $update_status; // nur als Beispiel!!!
    if ($update_status) { // wenn ja dann neue IP-Adresse in die cache schreiben:
        set-content "update.cache" $current_ip;
    } else {
        echo "nicht geklappt";

}

 

Linux console

 

Für Linux habe ich keine separaten Downloads bereitgestellt. Copy&Paste dürfte ausreichen.

auch hier: <router-ip>;<passwort>; u.s.w. bitte entsprechend anpassen, aber aufgepasst, das funktioniert nur wenn niemand sonst am Router angemeldet ist.

#!/bin/sh

wget -q --delete-after http://<router-ip>/cgi-bin/Hn_login.cgi?idTextPassword=<passwort>
wget -q http://<router-ip>/wan_ipaddr.htm
wget -q --delete-after http://<router-ip>/cgi-bin/Hn_logout.cgi

IP=`grep wan_ip wan_ipaddr.htm | egrep -o '([[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+\.[[:digit:]]+)'`

rm wan_ipaddr.htm

if [ $IP != "" ]
       then
       echo -n "$IP"
fi

Bei einigen DynDNS Clients könntet ihr dieses Script eventuell als externen Befehl zum Beziehen der IP Adresse angeben.

Ihr versteht sicher, dass ich für nichts garantiere – aber es funktioniert, wie ihr seht. Diese Seite läuft auf  My new tiny Home-Server mit DynDNS.

 

Zu guter letzt noch ein Beispiel für die ddclient.conf

# Configuration file for ddclient generated by debconf
#
# /etc/ddclient.conf

daemon=60
use=cmd, cmd=/Pfad/zum/IP-Script
ssl=yes
syslog=yes
verbose=yes
pid=/var/run/ddclient.pid

protocol=dyndns2,               \
server=dein.dyndns-provider.com,       \
login=dein-benutzername,             \
password='passwort'       \
dein.dyndns-hostname.com

 

 

Nachtrag: 31. August 2014

Ich erlebe immer häufer, dass der Router schlicht  keine neue IP Adresse bezieht, seit ich das Script nutze. Woran das liegt sind wohl die unzähligen Zugriffe des Scripts auf den Router zum Auslesen der IP. Was genau dabei bei dem Router durcheinandergerät, weiß nur o2 oder dessen Lieferant und Hersteller der Router. Die erste Maßnahme ist, den Intervall zu vergrößern. Zuvor lag dieser bei 60 Sekunden und wurde jetzt auf 120 eingestellt. Ergebnisse folgen.

Nachtrag: 02. September 2014

Den Interval auf 2 Minuten (120 Sekunden) zu erhöhen hat sich vorerst als Lösung etabliert.  Ich werde diese “Erkenntnis” jedoch nicht in der Beispielkonfiguration übernehmen und den Wert für daemon auf 60 belassen. Ganz einfach, weil stets ein schnelles Update der IP gewünscht ist. Solltet ihr aber auf ähnliche Probleme stoßen erhöht den Interval.

One thought on “o2 Box 6431 IP auslesen für DynDNS & Co

Leave a Reply

Your email address will not be published.