Új Dinamikus DNS szolgáltatás

By | 2016. március 18.

A Villanykarosok számára készült szolgáltatás a NETeam egyik vállalása keretében készült, célja, hogy a VIK-es hallgatók képesek legyenek szolgáltatásokat működtetni olyan helyeken, ahol az egyszerű DNS szolgáltatás nem használható megoldás.

Mi az a DNS?

A DNS az a szolgáltatás, ami lehetővé teszi, hogy az interneten elérhető szerverekre ne saját IP címükkel, hanem egy emberileg könnyebben megjegyezhető formában, domain névvel tudjunk hivatkozni. Ennek általában egyik feltétele, hogy az adott szerver egy fix IP címmel rendelkezzen, amit egyértelmű módon párosítani lehet a kívánt domain névvel. Az egyetem IP címeinek száma miatt mindenkinek aki például a Schönherzben csinál hálóreget, egy fix IP cím, és mellé egy domain név jár.
Otthoni körülmények között viszont ennek a feltételnek a teljesülése koránt sem triviális. A lakossági internetszolgáltatók ugyanis az otthoni előfizetőknek alapértelmezetten dinamikusan változó (ha nem privát) IP címet osztanak, így az egyszerű DNS nem megoldás, ha az otthoni gépen akarunk valamilyen szolgáltatást távolról is jól elérhetővé tenni.
Erre kínál megoldást a dinamikus DNS. Ez azzal bővíti ki az eredeti szolgáltatást, hogy lehetővé teszi a kliensnek, hogy dinamikus módon frissítse a domain nevéhez tartozó IP címet. Több kvázi-ingyenes illetve fizetős szolgáltató is létezik, aki ilyen szolgáltatást kínál, és némelyik használatát bizonyos router gyártók integráltan biztosítják is firmware-eikben, de ezek kidolgozása során nem jött létre széles körben elfogadott és elterjedt módszer a címfrissítés megvalósítására, így saját módszert kellett kidolgozni.
A módszer részeként a következő dolgokat kellett kidolgozni:

  • A környezet minimális átalakítását
  • Egy weboldalt a tartományok adminisztrációjához
  • Egy szervert, ami kezeli a frissítési kéréseket
  • Egy API-t, amit a kliens használhat
  • Egy kliens, ami a frissítési kéréseket elküldi a szervernek

A környezet

A házban jelenleg két DNS szerver, egy elsődleges és egy másodlagos működik, amiken PowerDNS szolgálja ki a névfordítási kéréseket a házon belül, illetve az általunk adminisztrált domaineknek (már az i42.hu-nak is) ők az autoritatív névszerverei. A PowerDNS képes adatbázisból dolgozni, ezért nálunk a postgresql adatbázismotorhoz csatlakoztatva dolgozik. A két szerver között natív postgresql streaming replikáció van beállítva, így a másodlagos bármikor viszonylag kevés ráfordítással képes átvenni az elsődleges helyét. Itt a DNS működéséhez szükséges adatokat tartalmazó adatbázisban létrehoztuk a DDNS működéséhez szükséges táblákat, és integráltuk a jelenlegi rendszerbe. Ez azért rendkívül előnyös, mert így magával a névfeloldással nekünk szinte semmi dolgunk nincs (ellentétben néhány GitHub-os példával, amiket önmagukban való működésre terveztek).

A weboldal

Egy PHP-ban írt oldal, ami adminisztrációs felületet biztosít a felhasználóknak tartományaik kezelésére. A beléptető AuthSCH-t használ, ezzel biztosítva, hogy csak a VIK-esek férjenek hozzá a szolgáltatáshoz SCH Account segítségével.

A frissítő szerver

Egy Python3 nyelven írt többszálú IPv4-en és IPv6-on 10053-mas porton hallgató HTTPS szerver, amihez az SSL certet a StartSSL ingyenes CA biztosította. Mivel a kérésben szereplő IP címből detektáljuk a protokoll verzióját, így szükség volt ezek egyértelmű elkülönítésére. A probléma megoldása nem triviális, ugyanis amennyiben egy hálózatra csatlakozó eszköz rendelkezik IPv6-os címmel (és persze képes is ezt kezelni), akkor azt is fogja használni. Ilyen módon ha mindkét frissítéshez ugyanúgy küldenénk kérést, akkor adott esetben az operációs rendszer dönthetne úgy, hogy mindkét alkalommal IPv6 felett kommunikál, így ellehetetlenítve az IPv4-es társítást tartalmazó A rekord frissítését.
Ezért azt a megoldást választottuk, hogy felvettünk két rekordot (updaterv4.i42.hu/updaterv6.i42.hu), amikhez fejenként csak a saját verziójú címet tartalmazó A illetve AAAA típust rendeltük ezzel kijátszva az operációs rendszereknek ezt a szokását. Természetesen a két cím egyazon gépre mutat, de a az operációs rendszer már csak egyféleképpen tudja a címeket feloldani, így azt fogja hinni, hogy csak azon keresztül tud a géppel kommunikálni.

Az API

Az API meghatározásánál a következő tényezőket kellett figyelembe venni.
Természetesen meg kell adnunk, hogy milyen domain nevet akarunk frissíteni. Mivel a szolgáltatást az i42.hu tartomány alatt biztosítjuk, így biztosan minden domain név erre fog végződni, fölösleges lenne az egészet elküldeni a frissítési kérésben. Így csak a prefixet, vagyis a .i42.hu előtti részt kell elküldeni.
El kell tudni dönteni, hogy a kérés küldője jogosult-e az adott domain frissítésére. Ehhez szükség van valamilyen fajta autentikációra, esetünkben egy tokenre, amit a felhasználó a webes felületen generál, és ami egyértelműen utal arra, hogy ki ő. Természetesen ezt egyfajta jelszóként kell kezelni, ha illetéktelen kézbe kerül, akkor mások is tudják majd frissíteni rekordjainkat, ezzel nem kívánt eredményeket okozva.
Még egy adat van, amit a sikeres frissítéshez szükséges elküldeni. Szükség van az IP címre, ami újonnan a domain névhez fog párosulni. Ezt detektálhatnánk kliens oldalon, de mivel az otthoni gépek többnyire egy NAT-oló router mögött ülnek, így általában jobb megoldás, hogy szerver oldalon a feladó IP címét tekintjük irányadónak, ezzel megkapva annak a legtávolabbi publikus pontnak az IP címét, ami a felhasználó gépéhez vezet. A további átjáró megfelelő konfigurálása ettől a ponttól felhasználó felelőssége. Ennek ellenére lehetőség van az IP cím megadására is, de ez opcionális, és nem ajánlott.
Az API részletes leírása itt olvasható.

A frissítő kliens

A frissítéshez készítettünk egy általános klienst, de az API ismeretében ennek használata nem kötelező.
Az kliens Python3-ban íródott, egyszerű HTTPS kérést indít megfelelő adatokkal, amelyek parancssori argumentumként és konfigurációs fájlban is megadhatók. Egyetlen kérést hajt végre, a kérések ütemezését nem valósítja meg, azt a felhasználóra vagy az operációs rendszerre bízza. Ez a hozzáállás közelebb áll a UNIXos világhoz, de windowsos segédlet is van hozzá, azzal is tökéletesen használható.
A közel jövőben egy windowsos kliens kiadása is kilátásban van, ez természetesen a windows világhoz áll közelebb, .NET keretrendszert használ, grafikus felülettel rendelkezik, és az ütemezéshez windows service-ként fut.

A szolgáltatás adminisztrációs felülete elérhető a https://i42.hu címen, a kliens és az API részlete leírása pedig az alábbi linken található.