Dynamic DNS na MyDevil.net

Kiedyś przedstawiałem prosty sposób na przekierowywanie ruchu HTTP na adres IP, który jest zmienny. Jednak gdy hosting umożliwia zmianę rekordów DNS z poziomu shella, poszerza to znacznie możliwości. Można to zrobić na MyDevil.net
Powód do zmiany? Dorobiłem się w końcu routera, który ma trochę szersze możliwości konfiguracji (o czym jeszcze napiszę). Chodzi oczywiście o sprzęt kompatybilny z openwrt, czyli dystrybucją Linuxa na routery. Do tego cuda można doinstalować paczkę ddns-scripts i mieć wsparcie dla wielu serwisów Dynamic DNS, na przykład dla swojego 🙂

Działa to w ten sposób, że skrypt na routerze sprawdza swoje IP i porównuje go z rekordem A w zapisanej domenie. Jeśli się zgadza, to usypia się na parę minut. Jeśli nie, to wysyła Request HTTP z odpowiednimi parametrami.
Oczywiście nie jesteśmy ograniczeni tylko do routera, podobny skrypt możemy uklecić z pomocą curl i cron.

Przechodząc do szczegółów. Potrzebujemy czegoś po stronie klienta (routera), co wyśle nowy adres IP, oraz coś po stronie serwera, co przyjmie, zweryfikuje i zapisze nowy rekord w domenie.

Po stronie routera konfiguracja to dodanie paczki ddns-scripts i poniższy plik

cat /etc/config/ddns
config ddns 'global'
	option date_format '%F %R'
	option log_lines '250'
	option allow_local_ip '0'

config service 'mydevil'
	option enabled '1'
	option username 'none'
	option password 'hasło'
	option ip_source 'network'
	option interface 'wan'
	option ip_network 'wan'
	option dns_server 'dns1.mydevil.net' //dns, na którym sprawdzamy poprawność rekordu.
	option use_syslog '2'
	option use_logfile '1'
	option domain 'dynamiczna.nazwadomeny.com' //domena, którą aktualizujemy
	option update_url 'http://switchdomain.nazwadomeny.com/?pass=[PASSWORD]&ip=[IP]&domain=[DOMAIN]'
	option force_interval '24'
	option force_unit 'hours'

Jak widać, potrzebujemy wygenerować hasło i skonfigurować właściwie domeny. Doradzam stworzenie nowej strefy DNS dla dynamicznej domeny, mniej można sobie naszkodzić w razie pomyłki. Potrzebujemy też jakiegoś adresu, pod który podepniemy skrypt po stronie serwera. Tutaj jest to switchdomain.nazwadomeny.com. Lepiej, by był to adres ze strefy, która nakierowuje na hosting, nie na dynamiczny adres.

Po stronie serwera skrypt wygląda tak. Jest napisany w NodeJS, ale może być w czymkolwiek innym. W MyDevil tworzy się nową stronę o typie NodeJS, wrzuca się skrypt do switchdomain.nazwadomeny.com/public_nodejs/app.js.

var pass = 'hasło';
var http = require('http');
var server = http.createServer(function(req, res) {

	var url = require('url');
	var url_parts = url.parse(req.url, true);
	var query = url_parts.query;
	var check = 'ip' in query && validIP(query.ip);
	check = check && 'pass' in query && pass === query.pass;
	check = check && 'domain' in query && validHostname(query.domain);
	if (check) {
		var exec = require('child_process').exec;
		var cmd = '/usr/home/globalbus/dns_change ' + query.domain + ' ' + query.ip;
		exec(cmd, function(error, stdout, stderr) {});
		res.writeHead(200, {
			'Content-Type' : 'text/plain'
		});
		res.end("OK");
	} else {
		res.writeHead(400, {
			'Content-Type' : 'text/plain'
		});
		res.end("FAIL");
	}
});
server.listen(3000);
function validIP(ipaddress) {
	if (/^(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)\.(25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?)$/
			.test(ipaddress)) {
		return (true);
	}
	return (false);
}
function validHostname(hostname) {
	if (/^(([a-zA-Z0-9]|[a-zA-Z0-9][a-zA-Z0-9\-]*[a-zA-Z0-9])\.)*([A-Za-z0-9]|[A-Za-z0-9][A-Za-z0-9\-]*[A-Za-z0-9])$/
			.test(hostname)) {
		return (true);
	}
	return (false);
}

Jego działanie to sprawdzenie hasła (hardcoded), tego czy parametry IP i domain mają sens. Oraz oczywiście wywołanie prawdziwego skryptu, który zmienia rekord w domenie (dns_change). Tutaj już klasycznie bash.
#!/bin/bash
if [ -z "$2" ]
then
IP=$(echo $SSH_CLIENT | awk '{ print $1}')
echo $IP
else
IP=$2
fi
DEVIL="/usr/local/bin/python /usr/local/devil/devil/bin/devil.pyc"
DOMAIN=$1
DOMAIN_IDS=($($DEVIL dns list $DOMAIN | perl -ne '$test = /(\d+).*?\sA\s.*?/; print $1." " if $test'))
for item in ${DOMAIN_IDS[*]}
do
    echo $item
    $DEVIL dns del $DOMAIN $item
done
$DEVIL dns add $DOMAIN $DOMAIN A $IP 60

Pierwszy parametr, to nazwa domeny, drugi to IP (opcjonalny). Skrypt zakłada, że nazwa strefy jest tożsama z nazwą domeny, choć tak być nie musi.

Na MyDevil.net mamy dostępny program o nazwie devil, którym możemy zmieniać parametry domeny. W tym przypadku są pobierane rekordy typu A (jednolinijkowiec Perl), a następnie kasowane. Na końcu dodawany jest nowy rekord z nowym adresem IP. Czas jego trwania to minuta (TTL 60). Jaki jest optymalny? Niezbyt długi, by skrócić czas propagacji do minimum.


 

Na koniec, dodatek reklamowy. MyDevil jest na tyle ciekawym hostingiem, że z czystym sumieniem mogę go polecać. W przypadku opłacania tam konta, można podać czyjś kod referencyjny, na przykład mój 🙂 Obniża to cenę kupującemu (o 10%), a mi daje parę groszy na przedłużanie usług.

Kod: BOMSZMOAID

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *