cantor
Goto Top

Dynamic DNS und pfSense - IP über custom URL aktualisieren

Ich möchte über meine pfSense (2.0.1) den A-Record einer Subdomain von mir automatisch mit der WAN-IP meines Heimnetzwerkes aktualisieren.

Dazu muß ein URL der folgenden Form
https://sub.domain.tld/dns.php?<mehrere parameter>?ip=<WAN-IP>?<weitere Parameter>
aufgerufen werden.

Mein Problem besteht darin, daß ich nicht weiß, wie ich pfSense dazu bringen kann, mit der vorhandenen WAN-IP den obigen URL zusammenzubauen und dann einmal täglich per cron aufzurufen.

Mit pfSense habe ich bisher lediglich über die GUI gearbeitet und ich verfüge bedauerlicherweise über so gut wie keine Linux-Kenntnisse.

Für Tipps, Hinweise und Hilfe bei der Lösung des Problems wäre ich daher sehr dankbar.

Gruß Jürgen

Content-ID: 207264

Url: https://administrator.de/contentid/207264

Ausgedruckt am: 26.11.2024 um 06:11 Uhr

kingkong
kingkong 30.05.2013 um 23:20:21 Uhr
Goto Top
Welchen DNS-Server setzt Du denn ein? Bzw. wie würdest Du im PHP-Skript das Update durchführen? Per nsupdate?

Ich frage, weil pfSense grundsätzlich in der Lage ist, als RFC2136-Client, d.h. als DynamicDNS-Client, zu arbeiten. Wenn Du beispielsweise bind einsetzt, dann könnte dieser als RFC2136-Gegenstelle agieren und Du bräuchtest das PHP-Skript nicht.

Ansonsten brauchst Du doch eigentlich nur mit pfSense und z.B. wget eine statische URL aufrufen, in der als einziger Parameter ein Passwort steht. Dynamisch müsste da nichts sein, weil das PHP-Skript ja die Adresse des anfragenden Routers als neue Zieladresse setzen kann, wenn das Passwort korrekt ist.
pfSense ruft nach jeder IP-Änderung auf dem roten Interface sowieso schon ein Skript auf, welches dann den RFC2136-Prozess startet. Da könntest Du u.U. auch Deine Befehle unterbringen.

Ich schätze aber, Du wirst etwas mit Deiner pfSense spielen müssen. Ich weiß gerade selbst nicht, wo die Skripte liegen und wie sie heißen, aber Google müsste zu diesem Thema eigentlich einiges finden.
C.R.S.
C.R.S. 30.05.2013 um 23:29:47 Uhr
Goto Top
Am einfachsten wäre, das ins GUI zu integrieren.

In den beiden Dateien fürs Webinterface sind die Listen um einen eigenen Anbieter zu erweitern (je in zwei aufeinander folgenden Zeilen, entsprechend den voreingestellten):

/usr/local/www/services_dyndns.php
/usr/local/www/services_dyndns_edit.php

Die Anbieterkonfigurationen stehen in /etc/inc/dyndns.class

Ich möchte jetzt aus der Erinnerung kein Tutorial dazu verfassen. Aber wenn Du dich in die dyndns.class ein bisschen reindenktst und die curl_setopt-Zusammensetzung verschiedener Anbieter vergleichst, sollte das nicht mehr allzu schwer sein bzw. ein vorhandener Anbieter schon in etwa zu übernehmen sein.
Das Ganze überlebt ein Update nicht (was bei 2.0.1 zu empfehlen wäre).

Grüße
Richard
cantor
cantor 30.05.2013 um 23:29:47 Uhr
Goto Top
Ich verfüge über eine bei all-inkl.com gehostete Domain und kann dort mit der AutoKAS Schnittstellen-API den A-Record meiner Subdomain ändern. dazu muß ich aber besagte URL aufrufen, welche die aktuelle WAN-IP der pfSense als Parameter enthalten muß.

Gruß Jürgen
cantor
cantor 31.05.2013 um 00:10:20 Uhr
Goto Top
Hmm ... Die pfSense habe ich gerade auf 2.0.3 aktualisiert und mir die angesprochenen drei Dateien angesehen. Da ich mehr oder minder als reiner "Anwender" unterwegs bin, steige ich bei dem PHP-Code definitiv nicht durch, um die Scripte und insbesondere die dyndns.class zu ergänzen.

Ich hatte mir eigentlich vorgestellt, ein kurzes PHP-Script zusammenzudengeln, welches lediglich die aktuelle IP in den URL integriert und den URL dann aufruft. Das Script seinerseits hätte ich dann versucht, über einen Cronjob zu starten. Ich scheitere im Moment schon daran, die Variable für die aktuelle WAN-IP zu identifizieren bzw. diese über PHP zu ermitteln.

Gruß Jürgen
aqui
aqui 31.05.2013 um 11:13:14 Uhr
Goto Top
Du kannst das auch über einen CRON Job regeln. Im pfSense Forum mal suchen nach cron da wird man fündig.
Eigentlich ist das schnell erledigt...wenn man denn weiss was man macht ?!
cantor
cantor 31.05.2013 aktualisiert um 23:14:08 Uhr
Goto Top
Zitat von @aqui:
Du kannst das auch über einen CRON Job regeln. Im pfSense Forum mal suchen nach cron da wird man fündig.
Eigentlich ist das schnell erledigt...wenn man denn weiss was man macht ?!


Einen Schritt bin ich weitergekommen, aber leider funktioniert das noch nicht wie gewünscht.

Ich habe das folgende PHP-Script erstellt:
<?php
$ifinfo      = get_interface_info(wan);
$ip_provider = $ifinfo[ipaddr];

$url_get     = "http://kasapi.kasserver.com/kas.php?kas_action=get_dns_settings&kas_login=xxxxx&kas_auth_type=sha1&kas_auth_data=yyyyy&zone_host=meinedomain.tld.&nameserver=ns5.kasserver.com";  
$url1_set    = "https://kasapi.kasserver.com/kas.php?kas_action=update_dns_settings&kas_login=xxxxx&kas_auth_type=sha1&kas_auth_data=yyyyy&record_name=subdomain&record_type=A&record_data=";  
$url2_set    = "&record_aux=0&record_id=xxxxx&nameserver=ns5.kasserver.com";  
$url_set     =  $url1_set . $ip_provider . $url2_set;


/* IP-der Subdomain ueber AutoKAS API abfragen */

$dns_abfrage = file($url_get);
$ip_nameserver = ereg_replace(".*\'(.*)\'.*","\\1",$dns_abfrage[50]);  



/* Abfrage ob IP-Aenderung auf Nameserver noetig ist */

if($ifinfo[pppoelink] == 'up' && $ip_provider != $ip_nameserver){  
	$curl = curl_init($url_set); 
	curl_setopt($curl, CURLOPT_FAILONERROR, true); 
	curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); 
	curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);   
	curl_exec($curl);
	};
?>

Wenn ich den Code zwischen <?php und ?> bei pfSense in das Feld "PHP Execute" (unter "Diagnostics" -> "Command Prompt") einfüge und ausführe, klappt alles wie gewünscht und der A-record für die Subdomain wird aktualisiert.

Im nächsten Schritt habe ich die PHP-Datei unter /usr/local/pkg/change_provider_ip.ph abgespeichert und die Rechte 0755 vergeben.

Der Eintrag unter den Cron-Settings (ich habe das Paket Cron installiert) sieht wie folgt aus:
minute hour mday month wday who   command			
[...]
*/1    *    *    *     *    root   /usr/local/bin/php /usr/local/pkg/change_provider_ip.php 0

Das Kommando im Cron-Tab orientiert sich an diesem Beitrag im pfSense-Forum.

Ich bin mit meinem (begrenzten) Wissen leider am Ende; ich kann nicht erkennen, wo der Fehler steckt. Vielleicht kann mir ja noch jemand einen Schubs in die richtige Richtung verpassen.

Eintweilen herzlichen Dank im voraus.

Gruß Jürgen
cantor
cantor 02.06.2013, aktualisiert am 04.06.2013 um 12:06:57 Uhr
Goto Top
Das Problem ist gelöst.
Für das Ursprungsscript bzw. die dort aufgerufene Funktion get_interface_info() hätte ich noch guiconfig.inc mittels require bzw. require_once einbinden müssen. Aus für mich nicht nachvollziehbaren Gründen bricht mein Script aber reproduzierbar ab, wenn ich eine beliebige Ressource mittels require oder require_once einbinde. Auf meine diesbezügliche Anfrage im pfSense-Forum ist keine Antwort eingegangen.

Das Script sieht mittlerweile wie folgt aus:

<?php
$wan        = pfsense_get_interface_addresses('pppoe0');  
$ip_wan     = $wan[ipaddr];
$status_wan = $wan[status];

$url_get    = "https://kasapi.kasserver.com/kas.php?kas_action=get_dns_settings&kas_login=xxxxx&kas_auth_type=sha1&kas_auth_data=yyyyy&zone_host=meinedomain.tld.&nameserver=ns5.kasserver.com";  
$url1_set   = "https://kasapi.kasserver.com/kas.php?kas_action=update_dns_settings&kas_login=xxxxx&kas_auth_type=sha1&kas_auth_data=yyyyy&record_name=subdomain&record_type=A&record_data=";  
$url2_set   = "&record_aux=0&record_id=zzzz&nameserver=ns5.kasserver.com";  
$url_set    =  $url1_set . $ip_wan . $url2_set;


/* IP-der Subdomain ueber AutoKAS API abfragen */

$dns_abfrage = file($url_get);
$ip_nameserver = ereg_replace(".*\'(.*)\'.*","\\1",$dns_abfrage[50]);  


/* Abfrage ob IP-Aenderung auf Nameserver noetig ist */

if($status_wan == 'up' && $ip_wan != $ip_nameserver){  
	$curl = curl_init($url_set); 
	curl_setopt($curl, CURLOPT_FAILONERROR, true); 
	curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false); 
	curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);   
	curl_exec($curl);
	};
?>

Die Funktion pfsense_get_interface_addresses() kann ich direkt verwenden. Auch wenn ich nicht verstehe, warum das so ist - es funktioniert jedenfalls wie gewünscht.