Pseudo dynamic DNS

Myślę, że większość kojarzy temat tego, czym jest Dynamic DNS. Mamy łącze na świat z dynamicznie przydzielanym zewnętrznym adresem IP i chcemy, by domena wskazywała na niego przez cały czas.

Są oczywiście dostępne komercyjne usługi, które zapewniają tą możliwość. Niestety w wersji bezpłatnej są one w chwili obecnej dość niefajne w obsłudze. Ich zaletą jest bezpośrednie wsparcie w większości domowych routerów. Rejestrujemy się, wpisujemy dane do routera i „działa”. Niestety nie jest to już to samo co kiedyś, bo np serwis DynDNS wymaga od nas okresowego logowania przez serwis WWW, inaczej domena wygasa.

Mając wykupiony gdzieś serwer WWW i przypisaną do niego domenę (to mam, między innymi na potrzeby tego bloga), możemy dynamicznie przekierowywać ruch na aktualny adres IP swojego łącza ze światem.

Pomysł jest banalnie prosty w realizacji. Potrzebujemy jakiejś domeny, na moim przykładzie jest to home.globalbus.info. Dla uproszczenia niech  będzie to czysty katalog na serwerze webowym.

Pierwszy krok, musimy znać swoje zewnętrzne IP. Da się to robić na wiele sposobów, ale nie chcąc sobie utrudniać zadania, zostawiłem na serwerze taki oto kawałek kodu w php

<?php echo $_SERVER['REMOTE_ADDR'];?>

Ot, dostajemy w zwrotce adres, z którego poszło zapytanie.

Krok drugi to publikacja swojego adresu, używam do tego shella.

#!/bin/bash
#load credentials
. credentials
#getIP
IP=$(curl $DOMAIN"/getip.php");
echo $IP | grep -E -o "(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]?)";
if [ $? -ne 0 ]; then
    IP=''
fi
#make address.html with pointer to 
echo $IP > address.html;
echo "Options -Indexes" > .htaccess;
echo "RewriteEngine On" >> .htaccess;
echo "RewriteBase /" >> .htaccess;
echo "RewriteCond %{REQUEST_URI} !^(/getip\.php|/address\.html)$ [NC]">> .htaccess;
echo "RewriteRule ^(.*)$ http://"$IP"/$1 [L,R=301]">> .htaccess;

curl -u $USER:$PASSWORD $HOST$DIR -T address.html 
curl -u $USER:$PASSWORD $HOST$DIR -T .htaccess;

Pobieram swoje IP za pomocą curl’a (przy użyciu jednolinijkowca powyżej). Tworzę statyczny plik z adresem oraz plik .htaccess z odpowiednią regułką mod_rewrite, a potem wypycham oba pliki na serwer www, również curl’em (przez ftp). Istotne jest, by nie przekierowywać sobie odwołań do skryptu, którym pobieramy swój adres 🙂 Jeśli serwer nie wspiera .htaccess, trzeba trochę pokombinować w inny sposób.

credentials wygląda tak

#!/bin/sh
HOST='';
DIR='/public_html/'
USER='';
PASSWORD='';
DOMAIN='http://home.globalbus.info'

Oczywiście należy wypełnić swoimi danymi 🙂

Chwilowo wpiąłem skrypt do crona, ale jest to dość naiwne. Połączenie z dynamicznym adresem IP potrafi być co jakiś czas resetowane, a adres przypisywany na nowo. Najlepiej mieć router z shellem (np dd-wrt) i przy podnoszeniu połączenia odpalać ten skrypt (zmieniając curl’a na coś lżejszego).

Oczywiście działa to tylko na potrzeby ruchu HTTP, ale z drobną upierdliwością można przekierować wszystko inne (np pobierając sobie ręcznie curlem address.html i robiąc wpis w hosts).

One thought on “Pseudo dynamic DNS”

Dodaj komentarz

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