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: (waarbij 192.168.178.250 het ipadres is van jouw NAS)

0 * * * * root curl http://192.168.178.254/jouwdomeinnaam.nl/transip/checkwan.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: (waarbij 192.168.178.250 het ipadres is van jouw NAS)

curl http://192.168.178.254/jouwdomeinnaam.nl/transip/checkwan.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

28 antwoorden op “Dynamic DNS met TransIP via de API”

  1. 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.

    1. 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

  2. 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.

  3. 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!)

  4. 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

  5. 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

  6. 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.

  7. Hi Martin!

    In de root van de site dien je “log.txt” aan te maken.
    Die moet je CHMODD 777 rechten geven (schrijven).

    Als het script iedere 30 minuten start, zal je de logging zien vullen met de volgende regel:
    27/08/2018 01:00:04 pm Geen update nodig, huidig IP: xxx.xxx.xxx.xxx is onveranderd.

    In dit geval is jouw WAN-ip ongewijzigd gebleven.
    Op de pagina zelf zie je ook:
    current ip: 145.130.132.20 Geen update nodig, huidig IP: xxx.xxx.xxx.xxx is onveranderd.

    Waarbij xxx.xxx.xxx.xxx jouw WAN-ip is die je van de provider hebt gekregen.

  8. En hoe gaat dit werken wanneer het ip niet klopt en mijn webserver (synology) dus niet meer bi mijn website komt waar deze php op staan. Beetje dubbel dit.
    Je kunt eerder ipv curl gewoon php zelf aanroepen met de php locatie en dan maakt het niet uit aangezien hij het lokaal ophaalt en uitvoert.

  9. Hi Niek,

    Bedankt voor het script. Ik ben geen ervaren gebruiker in Linux of Synology, maar heb het voor het grootste gedeelte aan het werk gekregen op mijn DiskStation. Ik gebruik echter geen curl maar roep het script mbv php aan. Ik gebruik PHP 5.6. Ik zie dat het script werkt. Hij geeft mijn huidige IP-adres. Daarna volgt echter de foutmelding “The PHP SOAP extension doesn’t seem to be installed. You need to install the PHP SOAP extension. (See: http://www.php.net/manual/en/book.soap.php)”.

    Ik heb binnen Web Station bij de PHP-Instellingen de SOAP extension aangevinkt. Ik heb alles geherstart wat geherstart kan worden, maar ik krijg de SOAP niet aan de praat. Ik heb zoveel mogelijk forums op internet afgezocht, maar ik kan niet vinden wat er fout gaat.

    Weet jij wellicht wat hier voor nodig is?

  10. Bedankt voor het script, werkt inderdaad prima. Ook ik had het probleem dat dus alle andere records nu zoek zijn. Helaas geen goede backup gemaakt of eerst de comments gelezen…. oops

    Aangezien ik nog wel eens een record toevoeg of verwijder (CNAME) zou ik graag alleen het hoofd ip updaten. MX records verwijzen sowieso naar een naam.

    Ik heb nog niet ontdekt hoe dit gaat via de API.

    Hulp is welkom

  11. Mooi scrip Niek, dank voor ’t delen!

    Ik vond nog een klein onvolkomenheid:

    deze regel:
    Transip_DomainService::setDnsEntries(‘jachimowski.nl’, $dnsEntries);

    zou je kunnen aanpassen naar:
    Transip_DomainService::setDnsEntries(DOMAIN, $dnsEntries);

    Dat scheelt wat zoekwerk voor de volgende gebruiker ;).

  12. Naar aanleiding van de comment van Jacco heb ik het script nog wat doorontwikkeld.
    Deze versie gaat uit van de bestaande DNS-instellingen en, alleen als het a-record van @ een ander ip-adres heeft dan jouw huidige externe ip-adres, zal deze aangepast worden. De rest van de instellingen blijven ongewijzigd.

    Als je vervolgens de rest van de dns-records middels een CNAME refereert naar dat specifieke record, dan zullen deze records na de update ook netjes naar het correcte IP wijzen.

    Voor het script zie: https://godje.nl/code/transip

    1. Hi Olivier, jouw aanpassingen zien er goed uit! Bedankt voor de aanvullende aanpassingen.
      Ik heb het script zelf niet meer ingebruik. Verdere ontwikkelingen aan dit script staan bij mij nu stil 😉

    2. Beste Olivier,

      alvast bedankt voor het werk maar ik zie hier waarschijnlijk iets over het hoofd.

      Heb mijn CheckWan.php vervangen door jouw code. (en er nog even achter gezet.

      Echter als ik het run werkt het niet. Is dit onderdeel van een groter geheel?

      1. Dit script maakt gebruik van de transit API. Voor de rest zijn er geen afhankelijkheden. Geeft het script een foutmelding? Met iets meer informatie valt de oorzaak wel te achterhalen vermoed ik.

        1. Allereerst, het is een nieuwe server (install) en heb gebruik gemaakt van de composer install methode van transip

          $composer require transip/transip-api-php

          Daarna het script op toegangkelijke plek gezet. Als ik ernaar toe ga geen foutmelding, maar gewoon een lege pagina (uiteraard even php tags om het script geplakt).

          Bij voorgaande php script van Niek stond de eerste functie er niet in. Heb het gevoel of het script wordt overgeslagen.

          1. En als ik dan het script uit de functie haal mis ik schijnbaar de libraries. (Neem aan verkeerd pad, maar waar heeft composer die gelaten)

          2. Ik heb het script inderdaad in een functie gezet aangezien dat makkelijker is binnen het framework dat ik gebruik.
            Als je de function-definitie weghaalt, zou hij gewoon moeten werken.

            Waar composer die bestanden neerzet weet ik niet, zoals ik heb beschreven op https://godje.nl/code/transip kun je de api-bestanden ook rechtstreeks bij TransIp ophalen. Dan kun je zelf bepalen waar die bestanden komen.

        2. Wat puzzelwerk later ben ik er bijna uit. Allereerst is de api (v6 nu) iets veranderd en moet dus beginnen met:
          use Transip\Api\Library\TransipAPI;
          require_once(__DIR__ . ‘/vendor/autoload.php’); //niet meer DomainService.php

          Ten tweede had composer de bestanden op de verkeerde plaats gezet (easy cp actie).

          Transip is weggestapt van het SOAP protocal en gebruikt nu REST. Dus zal nog wat meer aan moeten passen voordat dit weer werkt.

  13. Dank voor dit voorbeeld, ik zat te zoeken naar een domain registrar waar zoiets mogelijk is.

    Eén vraagje annex tip. Waarom start je je script niet op vanuit de dhcp-client op je pfSense router? Dan heb je je DNS-update direct nadat je IP-adres veranderd is.

  14. Na wat puzzelen heb ik Olivier’s z’n script nog iets verder aangepast voor mijn eigen behoeftes. Aangezien ik meerdere domeinnamen heb bij transip had ik voorheen meerdere script: CheckWAN1.php enz.

    Nu via een array en een foreach loop nog maar 1 script:

    $domainName []= ‘example.com’;
    $domainName []= ‘example.net’;
    $domainName []= ‘example.nl’;

    $username = ‘gebruikersnaam’;

    $timezone = ‘Europe/Amsterdam’;

    $privatekey = ‘
    —–BEGIN PRIVATE KEY—–
    jsdhgfjshgf
    —–END PRIVATE KEY—–
    ‘;
    // Locatie TransIP API
    require_once(__DIR__ . ‘/lib/Transip/DomainService.php’);

    // DO NOT EDIT BELOW THIS LINE!!

    // Benodigde Instellingen
    define(‘USERNAME’, $username); // TRANSIP Account
    // API Key
    define(‘PRIVATE_KEY’, $privatekey); // API Key

    // Haalt het externe adres op…
    $ipAddress = file_get_contents(‘http://ipecho.net/plain’);

    // Verbinden met de TransIP API
    Transip_ApiSettings::$login=USERNAME;
    Transip_ApiSettings::$privateKey= PRIVATE_KEY;

    foreach ($domainName as $domain) {
    // Huidge DNS records controleren
    $dnsEntries = Transip_DomainService::getInfo($domain)->dnsEntries;
    date_default_timezone_set($timezone);
    $update = false;
    $newDnsEntries = array();

    // Nieuwe array opbouwen op basis van oude data
    foreach($dnsEntries as $dnsEntry){
    array_push($newDnsEntries, $dnsEntry);
    // @ Wildcard controleren. Als deze verschilt, moeten DNS-instellingen geupdated worden
    if (($dnsEntry->type == Transip_DnsEntry::TYPE_A) && ($dnsEntry->name == ‘@’) && $dnsEntry->content != $ipAddress){
    $dnsEntry->content = $ipAddress;
    $update=true;
    }
    }

    // Als het IP-adres geupdated moet worden
    if ($update == true ){
    try{
    // Voer de update uit…
    Transip_DomainService::setDnsEntries($domain, $newDnsEntries);
    // Test in browser printout
    // echo ‘DNS ‘.$domain.’ aangepast naar ‘.$ipAddress.”;

    }
    catch(SoapFault $f){
    // Fout?
    echo “Er is iets fout gegaan, DNS is niet geupdated… ” . $f->getMessage();
    }
    }
    }

Geef een reactie

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

Deze website gebruikt Akismet om spam te verminderen. Bekijk hoe je reactie-gegevens worden verwerkt.