Dynamické DNS na VPS od WEDOSu
Ú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á:)