A dinamikus DNS szolgáltatások nagyon népszerűek. Főleg azok az emberek használják ezeket, akik távolról szeretnék elérni az informatikai rendszerüket valamilyen névvel, ám a szolgáltatójuk nem biztosít a számukra fix (azaz állandó) IP címet.

Ilyenkor dinamikus DNS szolgáltatást veszünk igénybe. Régen nagyon sok szolgáltató volt, aki több címet is biztosított ingyen, csak egy regisztrációra volt szükség.

Ma már ez nincs így, jó, ha egy címet kapunk ingyen, azt is havonta újítgatni kell. Az ingyenes szolgáltatások ritkák, mint a fehér holló.

Figyelem, a cikk kifejezetten szakmai jellegű.

Hozzávalók

Ha házilag akarunk csinálni magunknak dinamikus DNS-t mindenképpen szükségünk van legalább egy olyan hostra, ami fix IP címen, DNS szerverként működik - ha csak használni akarjuk a dinamikus DNS-t, akkor nem kell fix IP, de ahhoz, hogy szolgáltassuk, kell.

Ha csak egy szerverünk van, akkor szükségünk lesz egy másodlagos DNS szerverre is, ezt a szolgáltatónk tudja nekünk biztosítani - ha nem, akkor értelem szerűen két külön gép kell, amelyek IP címei nincsenek azonos subnetben.

A DNS szervereket konfiguráljuk be, hozzuk létre a zónát, és győződjünk meg arról, hogy a szerverek (az elsődleges és a másodlagos) konzisztensek egymással, és a zónafrissítés is megfelelően működik.

Pl. dnsteszt.hu

Kell még egy HTTP szerver, ami lehet Apache, Lighttpd, Nginx, vagy más. A lényeg, hogy legyen képes CGI scriptek futtatására azon a nyelven, amelsben a kezelőt megírjuk (Perl, PHP, Python, vagy más, ami kézre áll). Lehetőleg titkosított csatornát használjunk (HTTPS).

Állítsuk be a scriptet tartalmazó mappát úgy, hogy HTTP authentikációval lehessen csak hozzáférni, és csináljunk egy felhasználót és egy jelszót a htpasswd segítségével.

Pl. bela/testP6ss

A script - a szolgáltatás alapja

A scriptet úgy készítsük el, hogy a meghívásakor a egy adott könyvtárában hozzon létre egy fájlt a bejelentkezett felhasználó nevében, és írja bele a távoli kliens IP címét (REMOTE_ADDR).

pl. /var/www/zones/bela.ip

Hogy a túloldal ellenőrizhesse a szerver elérhetőségét, a HTTP kimenetre is visszajelezhetjük az IP-t.

Alapvetően a script nem is kell, hogy más legyen. Ezt távolról akár egy wget vagy lynx paranccsal is meghívhatjuk, és ennek hatására a DNS szerveren a felhasználónevünk és az IP-nk már ismeretes, csak azt kell megoldani, hogy bekerüljön a zónába.

pl.
wget --http-user=bela --http-password=testP6ss\
https://dinamic.testdns.hu/

vagy
lynx -auth=bela:testP6ss https://dinamic.testdns.hu/ -dump

A zóna frissítése

A zónát frissíthetjük többféleképpen. Vagy időzítve (pl. percenként) vagy azonnal, ha az adott könyvtárban valamelyik fájl írás után bezárul - pl. incron használatával.

Fontos, hogy ne frissítsük a zónát fölöslegesen, csak akkor, ha az adott mappában lévő összes fájl MD5 hash-se változott. Az MD5 hash kiszámolható pl. a

cat /var/www/zones/* | md5sum

paranccsal. Ha ezt összevetjük az eggyel korábbi állapottal, és van változás, akkor frissítsük a zónát, ha nincs változás, akkor ne frissítsük, mert fölösleges.

Célszerű a mappában elhelyezni egy

A zóna frissítése

A zóna frissítésénél ügyeljünk arra, hogy először is növeljük meg a serial értékét eggyel. Ezt követően vegyük sorba a könyvtárban lévő .ip kiterjesztésű fájlokat. A fájl neve a .ip nélkül legyen az A rekord, a fájlban lévő IP cím pedig a pointer.

Pl:
for i in /var/www/zones/*.ip; do
   user=$(basename $i .ip)
   ip=$(cat $i)
  echo -e "$user\t60\tIN A\t$ip"
done

A rekord 60-as TTL-t kap, tehát legfeljebb egy percen belül frissülni fog a DNS-ben az adott rekord, ha változás van.

Ha mindent jól csináltunk, a zónafrissítés végén a bela.dnsteszt.hu cím arra az IP-re mutat, amiről a weboldalt meghívták.

Amikre figyelnünk kell

Az egyik legfontosabb, hogy elkerüljük annak a lehetőségét, hogy a zónát frissítő script futása közben ismét elinduljon a script - ha nem időzítve hívjuk meg, akkor ennek a veszélye fokozottan fennáll, ha a nem időzítve hívjuk meg a scriptet, hanem incronból fut, eseményvezérelten.

Ezt legegyszerűbben szemaforokkal (pl. lock fájlokkal) tudjuk megoldani, azonban arra is kell figyelnünk, hogy mi van, ha a folyamat nem fut, de a locjk fájl jelen van. De ezt már mindenkinek a fantáziájára bízom.

Óvatosan bánjunk a serial-lal, nem mindegy, hogy hogyan, és mennyivel növeljük. Ha túl gyakori a frissítés, vagy a scriptünk megszalad a próbálkozások során, könnyen túlpörgethetjük a számlálót.

Természetesen ügyeljünk arra is, amire mindig: elérési utak, környezeti változók, karakterkódolás, jogosultságok - és ami a legfontosabb - hibakezelés.

Felelősség kizárás

Figyelem: a fenti írás csak tipp egy lehetséges megoldásra, természetesen meg lehet oldani szebben és jobban is, ez csak amolyan boszorkánykonyha jellegű megoldás, amelynek az esetleges hibás működéséért a felelősség azt terheli, aki implementálja - tehát legyünk nagyon körültekintőek, és ügyeljünk a szabályok és szabványok betartására.