Dynamické DNS na VPS od WEDOSu

Posted on in category «Tech» by fnv with tags , ,

Úvod

WEDOS je poměrně známá firma v oblasti domén, hostingu, provozování VPS atd. Pro automatické ovládání poskytovaných služeb poskytují WAPI - Wedos API. API dá využít pro mnoho účelů, v mém případě k automatické aktualizaci IP adresy domácí sítě umístěné za ADSL/VDSL u registrované domény.

Co je potřeba: + připojení s dynamickou IP adresou + aktivovat WAPI v administraci WEDOSu + mít nastavený DNS A záznam pro danou doménu + v domácí síť s počítačem/routerem s nainstalovaným linuxem

Aktivace WAPI

Aktivace WAPI je detailně popsaná na stránkách Wedosu http://kb.wedos.com/wapi/aktivace-nastaveni.html
Přístup k WAPI mají pouze IP adresy povolené v administraci WAPI, proto je nutný vlastní server/počítač se statickou IP adresou.
Po registraci WAPI máme k dispozici login (stejný jako do administrace), heslo k wapi (je jiné než heslo do administračního rozhraní).

Nastavení DNS záznamu

Skript předpokládá existenci A záznamu v DNS, takže je nutné jej ručně předem vytvořit přes administrační rozhraní.

Domácí počítač s linuxem

  • ytvoříme uživatele ''dyndns''
  • Uložíme následující skript do souboru dyndns.sh
#!/bin/bash
FILE="/tmp/dyndns-ip.cfg"
DYNDNS_HOST="moje.domena.cz"

wget -q -O - checkip.dyndns.org|sed -e 's/.*Current IP Address: //' -e 's/<.*$//' >$FILE

IP=`cat $FILE`
IP_DNS=`host $DYNDNS_HOST |cut -d " " -f 4`

if [ "${IP}" == "${IP_DNS}" ]; then
        rm -rf $FILE
        exit 1;
fi

/usr/bin/php5 /home/dyndns/dyndns.php
  • Nastavíme crontab
*/5 * * * * /home/dyndns/dyndns.sh
  • Uložíme následující skript do souboru dyndns.php a změníme $login, $wpass, $domain, $dyndns_domain
#!/usr/bin/php5 -dmemory_limit=8M -dsafe_mode=Off
<?php
//
// DynDNS function script
// Server update local file with IP address
// and when IP address is different then IP address in DNS
// we change it.
//

// Constants
$login = 'LOGIN_TO_WEDOS';
$wpass = 'PASS_TO WAPI';
// If your DYNDNS host is moje.domena.cz, then $domain = domena.cz and $dyndns_domain = moje
$domain = 'DOMAIN';
$dyndns_domain = 'HOST';
$url = 'https://api.wedos.com/wapi/xml';
$ip = '/tmp/dyndns-ip.cfg';
$timezone = 'Europe/Prague';

// Check if update from dyndns client exists
$fh = fopen($ip,'r') or die();
if (!$fh or filesize($ip) < 1) {
    echo 'Cannot read file $ip !\n';
    die();
}

$rmt_ip = trim(fread($fh, filesize($ip)));
fclose($fh);

// Check if provided IP is ok
if(!filter_var($rmt_ip, FILTER_VALIDATE_IP)) {
    echo 'Not a valid IP address in file $ip !';
    die();
}

// auth string
date_default_timezone_set($timezone);
$auth = sha1($login.sha1($wpass).date('H', time()));

// request for domain list
$request = '<?xml version="1.0" encoding="UTF-8"?>
<request>
 <user>'.$login.'</user>
 <auth>'.$auth.'</auth>
 <command>dns-rows-list</command>
 <data>
  <domain>'.$domain.'</domain>
 </data>
</request>';
$post = 'request='.urlencode($request);

// curl initialization
$ch = curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_POST,true);
curl_setopt($ch,CURLOPT_POSTFIELDS,$post);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch,CURLOPT_TIMEOUT,100);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
$res = curl_exec($ch);

// xml parsing
$ip_addr = '';
$row_id = -1;
$ttl = -1;

$xml = simplexml_load_string(print_r($res, true));

foreach($xml->data->row as $node) {
    if ($node->name != "apps")
        continue;
    $ip_addr = $node->rdata;
    $ttl = $node->ttl;
    $row_id = $node->ID;
}

if ($rmt_ip == $ip_addr) {
    echo 'IPs are same! Nothing to do.';
    unlink($ip);
    die();
}

if ($row_id < 0 || $ttl < 0) {
    echo 'Wrong ID of DNS record or TTL!';
    die();
}
// request for change IP address
$request = '<?xml version="1.0" encoding="UTF-8"?>
<request>
 <user>'.$login.'</user>
 <auth>'.$auth.'</auth>
 <command>dns-row-update</command>
 <data>
  <domain>'.$domain.'</domain>
  <row_id>'.$row_id.'</row_id>
  <ttl>'.$ttl.'</ttl>
  <rdata>'.$rmt_ip.'</rdata>
 </data>
 <test>1</test>
</request>';

$post = 'request='.urlencode($request);

curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_POSTFIELDS,$post);

$res = curl_exec($ch);

unlink($ip);
?>
  • A samozřejmně to celé otestujeme, že to dělá to co má:)