PHP Skript für DNS Update

  • Ab sofort steht euch hier im Forum die neue Add-on Verwaltung zur Verfügung – eine zentrale Plattform für alles rund um Erweiterungen und Add-ons für den DSM.

    Damit haben wir einen Ort, an dem Lösungen von Nutzern mit der Community geteilt werden können. Über die Team Funktion können Projekte auch gemeinsam gepflegt werden.

    Was die Add-on Verwaltung kann und wie es funktioniert findet Ihr hier

    Hier geht es zu den Add-ons

Status
Für weitere Antworten geschlossen.

mexx81

Benutzer
Registriert
17. Dez. 2013
Beiträge
597
Reaktionspunkte
1
Punkte
42
Hallo,

ich habe eine DS1813+ mit DSM 6, fester IP und diverse Domains. Ich möchte ein bisschen "rumspielen" und habe für einer meiner festen Domains den Nameserver auf meinen DNS Server geändert. Funktioniert! Abfragen von Ressourceneinträgen zur Domain, werden von meinen DNS Server beantwortet.

Nun möchte ich gerne wissen, wie ich per PHP Skript A-Records für Subdomains setzten kann. Skript-Know-How und grundlegende Kennwtnisse in der Programmierung habe ich, jedoch nicht für PHP. Kann mir jemand helfen, ein einfaches Update Skript auf die Beine zu stellen, welches Ressourceneinträge erzeugt?

Vielen Dank,
mexx
 
Ich versuche das PHP Skript und komme zu folgenden Ergebnis. Am ende füllt es eine temporäre Datei mit den Befehlen für nsupdate. Die Befehle werden am Ende ausgeführt und sehen so aus.

zone %meine_zone.de%
update delete %test_subdomain%.%meine_zone.de% A
update add %test_subdomain%.%meine_zone.de% 3600 A %WAN_IP%
send

Es wird kein Record gesetzt. Führe ich die Befehle per SSH manuall aus, erhalte ich nach den send die Fehlermeldung: update failed: REFUSED

Ich recheriere weiter, wieso es nicht geht, aber vielleicht hat jemand eine Idee.
 
Du musst 127.0.0.1 zur Erlaubtliste hinzufügen.
 
Unter Zoneneinstellung als Zonentransferregel oder Quell-IP-Dienst?

In beiden Fällen erhalte ich nach wie vor "update failed: REFUSED". Bin per SSH SU drauf.
 

Anhänge

  • Unbenannt.JPG
    Unbenannt.JPG
    84,5 KB · Aufrufe: 41
du musst den Key haben, damit du nsupdate nutzen kannst, auch als localhost. Bei einem Standart-bind liegt dieser in der Datei /etc/bind/rndc.key
Wo Synology den hingepackt hat weiss ich ned, such mal mit
Code:
find / -type f -name rndc.key
das dort angegebene Secret musst du an die OPT Variable im Script verfüttern
Code:
TSIG_Key => 'YOUR TSIG KEY',
TSIG_Secret => 'YOUR TSIG SECRET',
 
An diesen Punkt war ich ebenfalls uns versucht es damit.


ash-4.3# /volume1/@appstore/DNSServer/bin/nsupdate -k /volume1/@appstore/DNSServer/named/rndc.key
> key rndc-key %SECRET%
> zone %meine_zone.de%
> update delete %test_subdomain%.%meine_zone.de% A
> update add %test_subdomain%.%meine_zone.de% 3600 A %WAN_IP%
> send
update failed: REFUSED
 
Ich habe unter /volume1/@appstore/DNSServer/named/etc/zone/data meine Konfigurationsdatei für meine Zone gefunden.

So sieht der Inhalt aus.



zone "%meine_zone.de%" {
type master;
file "/etc/zone/master/%meine_zone.de%";
allow-transfer {any;};
allow-query {any;};
allow-update {key "/volume1/@appstore/DNSServer/named/rndc.key";};
};

Dennoch lassen sich keine Records setzten. Auch wenn ich nsupdate mit der Key-File starte oder Key als Parameter angebe.
 
Ich mache mal weiter mit meinen Erkentnissen. Vielleicht interessiert es ja jemanden.

Wenn ich allow-update auf meine feste IP setzte, die Zone deaktiviere und wieder aktiviere, erhalte ich im Log die Meldung security: zone '%meine_zone.de%' allows updates by IP address, which is insecure

Ein Add eines Records funktioniert! Er wird zwar in der GUI nicht angezeigt, aber ich kann den Record auflösen. Das ist schon mal ein Teilerfolg.

Wenn ich das allow update auf ein Key-File setzte, kommt im Log keine Warnung und beim Versuch ein Record zu setzten erscheint diese Meldung.

update-security: client %WAN_IP%#6926/key %KEY_NAME%: update '%meine_zone.de%/IN' denied
 
Zuletzt bearbeitet:
So sieht jetzt die Zone Datei aus.


Rich (BBCode):
zone "%meine_zone.de%" {
    type master;
    file "/etc/zone/master/%meine_zone.de%";
    allow-transfer {any;};
    allow-query {any;};
    allow-update {key "rndc.key";};
};

Versuche ich nun per nsupdate diese Kommandos:

Rich (BBCode):
zone %meine_zone.de%
update delete %SUB%.%meine_zone.de% A
update add %SUB%.%meine_zone.de% 3600 A %WAN_IP%
send

Ich bekomme die Meldung: update failed: REFUSED

Im Log finde ich:
20-Apr-2016 16:55:31.544 update-security: client %WAN_IP%#44243/key rndc-key: update '%meine_zone.de%/IN' denied


Versuch per PHP:
20-Apr-2016 16:55:39.965 update-security: client 127.0.0.1#33253: update '%meine_zone.de%/IN' denied
 
Nicht der Pfad nehmen sondern den Namen, .z.b. meinkey oder rndc-key

key "meinkey" {
algorithm HMAC-SHA512;
secret "--irgendetwas--";
};
 
NICE!! Thanks!!! Update per nsupdate funktioniert super, wenn ich als Parameter den Key samt secret angebe.

Nächster Schritt ist die Umsetzung im PHP Skript wie unter http://pablohoffman.com/dynamic-dns-updates-with-a-simple-php-script

Rich (BBCode):
<?php
# PHP script for very simple dynamic DNS updates 
#
# this script was published in http://pablohoffman.com/articles and 
# released to the public domain by Pablo Hoffman on 27 Aug 2006

# CONFIGURATION BEGINS -------------------------------------------------------
# define host and passwords here 
$hosts = array(
    'client' => 'secret',
    'host2'  => 'secret2',
);
$zone = "%MEINE_ZONE.DE%"; # the dynamic DNS zone
$dnsserver = "localhost"; # authorative DNS server for the zone above
# CONFIGURATION ENDS ---------------------------------------------------------


$ip = $_SERVER['REMOTE_ADDR'];
$host = $_GET['host'];
$pass = $_GET['pass'];


echo $host;
echo $pass;

$tmpfile = trim(`mktemp /tmp/nsupdate.XXXXXX`);

if ((!$host) or (!$pass) or (!($hosts[$host] == $pass))) { 
    echo "FAILED";
    exit; 
}

$oldip = trim(`host $host.$zone | cut -d ' ' -f 4`);
if ($ip == $oldip) {
    echo "UNCHANGED";
    exit;
}

echo "$ip - $oldip";

$nsucmd = "server $dnsserver
zone $zone
update delete $host.$zone A
update add $host.$zone 3600 A $ip
send
";

$fp = fopen($tmpfile, 'w');
fwrite($fp, $nsucmd);
fclose($fp);
`/volume1/@appstore/DNSServer/bin/nsupdate $tmpfile`;
unlink($tmpfile);
echo "OK";
?>

Ich verstehe den Aufruf nicht richtig. Rufe ich die URL wie folgt auf: http://%MEINE_DOMAIN%/update.php?host=peter&pass=%KEY_NAME% ofrt %KEY_SECRET% bekomme ich im Log die Meldung:

20-Apr-2016 17:32:16.640 update-security: client 127.0.0.1#54136: update '%MEINE_DOMAIN%/IN' denied

Ungeachtet dessen, wie wäre es denn am sinnvollsten umgesetzt, wenn ich die Maschinen, die mein DNS befüttern kontrollieren will? Ich möchte nicht, dass jeder DNS Einträge per PHP ausführen kann. Entweder per Zugangsdaten oder Besitz des KEYs sollte das Update erlaubt werden.
 
Status
Für weitere Antworten geschlossen.
 

Kaffeautomat

Wenn du das Forum hilfreich findest oder uns unterstützen möchtest, dann gib uns doch einfach einen Kaffee aus.

Als Dankeschön schalten wir deinen Account werbefrei.

:coffee:

Hier gehts zum Kaffeeautomat