Regisztráció és bejelentkezés

Többszálú, hatékony DNS64 szerver implementációja és teljesítőképességének vizsgálata

A kiosztható globális IPv4 címek kifogyásával és az IPv6 fokozatos térnyerésével szükségessé vált a különböző áttérési megoldások kidolgozása és implementálása. A NAT64 arra a problémára nyújt megoldást, mikor a felhasználók már csak IPv6 címet kapnak a szolgáltatójuktól, viszont a szolgáltatások jelentős része még csak IPv4-en érhető el. A DNS64 a NAT64 kiegészítő szolgáltatása, amelynek segítségével a felhasználó a megszokott domain neveken tud hivatkozni a szolgáltatásokra, a csak IPv4-en elérhető szolgáltatás IPv4 címének ún. IPv4 címet beágyazó IPv6 címre (IPv4-Embedded IPv6 Address) történő leképzését pedig a DNS64 szerver transzparensen elvégzi.

Az új implementáció kiindulási alapját egy korábbi, hasonlóan többszálúságra és hatékonyságra törekvő implementáció adta. Ez az implementáció C nyelven készült, aminek következtében bár hatékony volt, de az olvashatósága nem volt megfelelő, és a tesztelés során súlyos memóriaszivárgás lépett fel. A szerver emellett nem limitálta a kérések kiszolgálására indított szálak számát, ami DoS (Denial of Service) támadásra nézve sérülékennyé tette.

A cél az volt, hogy a C++11 új nyelvi elemeinek és a RAII (Resource Acquisition Is Initialization) idióma felhasználásával olyan implementációt hozzak létre, ami nem kevésbé hatékony, mint a C nyelvű implementáció, de sokkal jobban bővíthető, olvasható, és eredendően biztonságosan kezeli az érzékeny erőforrásokat (pl.: memória, socketek, mutexek).

A beérkező kérések feldolgozásához thread poolt implementáltam, hogy a többszálú terhelés megfelelően skálázható legyen, és a szoftver ellenállóbb legyen túlterheléses támadásokkal szemben.

A szoftver a RAII idiómát követi. Ez azt jelenti, hogy amint megszerzünk egy érzékeny erőforrást, azt azonnal becsomagoljuk egy olyan objektumba, aminek a destruktora a megfelelő módon felszabadítja. Ezáltal nem kell külön figyelnünk arra, hogy minden esetben kézzel felszabadítsuk a memóriát, bezárjuk a socketet vagy feloldjuk a mutex zárolását, hanem a megfelelő helyen ez automatikusan megtörténik. Ha ezt az idiómát mindenhol követjük, akkor a szoftver eredendően védett lesz az érzékeny erőforrások szivárgása ellen, anélkül, hogy bármilyen jelentős teljesítményveszteséget okozna.

A szoftvert végül terhelési tesztnek vetettem alá. Ehhez az RFC 8219-nek megfelelő mérőszoftvert készítettem, ami meghatározott számú DNS kérést tud másodpercenként a DNS64 szervernek kiküldeni, majd méri a meghatározott időn belül érkezett válaszok számát és a kérések egyenkénti válaszidejét. A cache-elés hatásainak elkerülése érdekében minden kérés egy új, egyedi DNS rekordra vonatkozik.

Az RFC 8219 mérési eljárását követve, először megmértem az autoritatív névszerver önálló teljesítményét, hogy megbizonyosodjak róla, hogy a DNS64 szerverek teljesítményét nem korlátozza. Ezek után megmértem az új implementáció és az elterjedt DNS64 funkcionalitást nyújtó névszerverek (BIND, PowerDNS, Unbound) teljesítményét, majd az eredményeket összehasonlító elemzésnek vetettem alá.

szerző

  • Bakai Dániel
    Mérnök informatikus szak, alapképzés
    alapképzés (BA/BSc)

konzulens

  • Dr. Lencse Gábor
    tudományos főmunkatárs, Hálózati Rendszerek és Szolgáltatások Tanszék