Dynamic DNS met TransIP via de API

Sinds een tijdje host ik mijn blog op een NAS.
Jachimowski.nl en nog enkele andere domeinnamen heb ik geregistreerd bij Transip.nl en dat werkt helemaal prima.
In het beheerpaneel van TransIP kan ik zelf de DNS-records beheren. Die heb ik ingesteld op mijn WAN-ip van mijn internetaansluiting bij Telfort.

Alles lijkt goed te werken, tot ik een zaterdag ochtend wakker werd en aan mijn blog wilde werken. De website was onbereikbaar! Al snel zag ik dat Telfort mijn WAN-ipadres gewijzigd had. Hierdoor was mijn website niet meer te benaderen op het ingestelde IP-adres.

Zo nu en dan kiest Telfort er voor om mijn IP-adres te vernieuwen. Dat is erg vervelend want daar kom ik pas achter wanneer mijn website weer eens niet bereikbaar is. Ook is het nauwelijks te voorspellen wanneer Telfort deze vernieuwing uitvoert. Soms duurt het een jaar en soms slechts enkele maanden. Sinds ik mijn router heb ingewisseld voor een eigen-bouw pfSense-bak, is het aantal ip-vernieuwingen drastisch omlaag gegaan!

Om mijn website bereikbaar te houden, kan ik gebruik maken van diensten zoals no-ip.com. Dat is een dynamische DNS dienst welke via een programma (of zelfs een functie op mijn pfSense router) automatisch de DNS records bijwerkt wanneer jouw WAN-ip veranderd. Deze dienst kost circa 30 dollar per jaar (bovenop de kosten voor de domeinna(a)m(en).

Helaas biedt TransIP geen dynamische DNS dienst zoals no-ip.com dat doet. Logisch, want de corebusiness van TransIP is het verkopen van webhosting en VPS diensten! Toch is het automatisch updaten via Dynamic DNS wel een groot gemis.

Omdat mijn NAS 24/7 aan staat, heb ik er voor gekozen zelf een script te schrijven welke ieder uur een check doet of mijn IP-adres gewijzigd is tenopzichte van de DNS-record van mijn domeinnaam jachimowski.nl. Wanneer het ip-adres afwijkt zorgt het script voor een aanpassing van de DNS-records bij Transip.nl. Hierdoor is mijn website maximaal een uurtje offline (wat voor een hobby blog acceptabel is). 😉

Benodigdheden:

Ga naar het Controlepaneel van TransIP en klik op “account” en vervolgens op “API”.
https://www.transip.nl/cp/account/api/

Daar kan je een nieuwe “keypair” maken en vergeet niet “whitelist IP” UIT te vinken. Anders zou je alleen met jouw huidige IP-adres de API gebruiken. Dat is natuurlijk niet handig. Geeft de nieuwe keypair een nuttige naam. Daarna verschijnt een flinke key. Bewaar deze key goed want dit is het enige moment dat je de key kan zien.

Download het PHP script en plaats het op een plek waar de webserver bij kan.
Pas het script aan:

<JOUWDOMEINNAAM> = De domeinnaam waarvan je het DNS-record wilt bijwerken
<JOUW TRANSIP USERNAME> = Jouw controlpanel account (username)
<PLAATS HIER JOWU KEYPAIR> = Plak hier de code die je in de eerdere stap hebt verkregen. Let op dat alles netjes tussen de quotes ” staan.

// Benodigde API en instellingen (graag nalopen!)
require_once(‘lib/Transip/DomainService.php’);
define(‘DOMAIN’, ‘<JOUWDOMEINNAAM>’);

 

// TRANSIP Account
define(‘USERNAME’, ‘<JOUW TRANSIP USERNAME’);
// API Key
define(‘PRIVATE_KEY’, ‘<PLAATS HIER JOUW KEYPAIR>’);

Vergeet niet om vanaf regel 60 enkele aanvullende DNS-records aan te passen:

$dnsEntries[] = new Transip_DnsEntry(‘@’, 86400, Transip_DnsEntry::TYPE_A, $ipAddress);

Het apenstaartje @ staat voor een wildcard waarmee domeinnaam.nl beschikbaar komt.
Je kan dus het beste ook “www” en andere subdomeinen toevoegen. (Hanteer hierin per DNS-record 1 nieuwe regel).

Als je alles juist hebt ingesteld, kan je een test doen door de DNS-records bij TransIP tijdelijk aan te passen naar bijv. 127.0.0.1. Roep daarna de pagina op die je inmiddels zelf hebt gehost: https://jouwdomeinnaam.nl/transip/wanupdate.php Hierdoor wordt het script geactiveerd en zal het een vergelijking doen met het WAN-ip en de DNS-record bij Trans-IP. In dit geval zullen alle records bijgewerkt worden.

Nu is het natuurlijk niet de bedoeling dat je zelf ieder uur dit scrip draait. Je kan het beste dit script ieder uur automatisch laten aftrappen. Hiervoor gebruiken we de Cronjob of de geplande taken van Synoloy.

Cronjob:

Maak een nieuwe regel aan in het /etc/crontab bestand. Voeg de volgende regel toe:

0 * * * * root curl https://jouwdomeinnaam.nl/transip/wanupdate.php

Op de Synology NAS kan je een geplande taak aanmaken. In dat geval kies je voor uitvoering “Ieder uur” en vervolgens een gescript commando:

curl https://jouwdomeinnaam.nl/transip/wanupdate.php

CURL doet eigenlijk een aanvraag op het opgegeven URL. Wat daar precies op terugkomt is niet belangrijk. Het script is immers afgetrapt en zorgt ervoor dat jouw WAN-ip aangepast wordt.

Je kan in de logging.txt (welke zich in dezelfde folder als het script bevind) controleren of de DNS-records succesvol bijgewerkt zijn.

DOWNLOAD PHP SCRIPT

7 comments

  • Beste Niek,

    heb je scripts getest en het werkt…te goed.

    Ik hoop dat je mij (en mogelijk andere kunt helpen door het script iets aan te passen.
    Het volgende gaat er mis of te goed 😉

    je maakt een array aan met de nieuwe DNS entries.
    Mogelijk door de opdracht:
    Transip_DomainService::setDnsEntries(‘kennethtan.nl’, $dnsEntries);
    worden alle gegevens gewist en alleen de nieuwe ingevoerd. (Gelukkig had ik een backup van mijn gegevens)
    Volgens mij moet je als je een Array gebruikt in dit concept, eerst de array vullen met de bestaande gegevens en dan de te wijzigen…wijzigen. Daarna de update uitvoeren.

    Verder een puntje: je hebt je eigen domein er in staan (hardcoded) ipv de domeinvariable die wordt opgegeven in het begin.

    Zou je dit voor mij kunnen aanpassen? Ik heb geen php ervaring. Kan het wel lezen, maar ken de syntax niet om het zelf te doen.

    Jouw script is het eerste dat voor mij werkt.
    Heb mijn webserver achter mijn router staan die elke dag een nieuw exptern IP adres krijgt.

    • Gert Jan says:

      Kenneth,
      Is dit ooit opgelost? Ik wil hetzelfde uitvoeren maar het is onhandig als je waardes per abuis zit te overschrijven. Ik wil enkel één waarde updaten indien nodig en anders alles bij het oude laten. Dat is wel zo netjes.
      Mvg, Gert Jan

  • Gert Jan says:

    Kennet was juist; ‘Transip_DomainService’ wist alle entries en dit is niet de bedoeling. Ik heb inmiddels de code herschreven zodat hij een enkele waarde aanpast van een subdomein zodra deze wijzigd. Dit is wel maatwerk dus ik kan het hier delen. Het komt erop neer dat je de variable ‘$dnsEntry’ doorzoekt en indien nodig aanpast en deze terug schrijft. Dus niet een nieuwe array creëren.
    De code van Niek werkt verder prima.

  • Hi Kenneth en Gert Jan,

    Ik zie de responses nu pas! #oops
    Ik heb nog geen tijd gevonden om het script verder te updaten. Mocht dat nodig zijn dan kan wellicht Gert Jan jou hierbij helpen.
    In mijn situatie voldoet het “leeghalen” en “herschrijven” van de records. (uiteraard gebruik op eigen risico).
    @Gert Jan, indien gewenst kan ik jouw aandeel hier bijvoegen! (uiteraard met jouw credits!)

  • Ik heb het ondertussen werkende. Twee domeinnamen worden zo via een Cron geupdate elke 10 minuten.

    De script checkt eerst of de update nodig is en voert hem dan uit.

    De script is de aangepaste script van een de de heren hierboven. Kudo’s aan de maker.

    Overal waar in mijn script [ ] staan je eigen gegevens invullen.
    Weet alleen niet waar ik mijn actuele IP6 WAN adres vandaan moet halen, maar heb daarvoor gewoon het laatst bekende als vast gegeven ingevuld. Ik weet hiet is niet correct, maar ik merk er niets van… Iemand kan mmischien uitleggen, waarom ik het toch nodig heb en hoe ik het IP6 adres te pakken krijg? IPECHO.net geeft het niet.

    Hier is mijn script template:

    https://kennetht.stackstorage.com/s/0iXOFFFNP2yHSr3

  • Beste Niek,

    ik zie dat je met een Synology werkt.
    Is het dan geen oplossing om een dyndns via je Synology aan te maken x.diskstation.me of iets dergelijks en bij TransIp een cname aan te maken naar dit adres?

    Grtz,
    Stefan

  • Hi Stefan!

    Jazeker dat werkt ook! Je hebt dan de DynDNS service op de NAS en bij Synology nodig. Dat is wederom een extra service/dienst.
    Synology houdt dan ook bij of jouw NAS on- of offline is.

    In mijn scenario draai ik ook een mailserver en MX records kunnen niet verwijzen naar CNAME record helaas.

Leave a Reply

Het e-mailadres wordt niet gepubliceerd. Vereiste velden zijn gemarkeerd met *