Főoldal

2010. június 7., hétfő

DNS tutorial


Első komolyabb bejegyzésemként a DNS-ről és a Bind9-ről szeretnék egy kicsit többet beszélni. Ahogy lesz időm, kiegészítem még, jelenleg ez egy működőképes leírás
Először egy kis elméleti alapozás a programról és a DNS-ről általánosan:

DNS alapok



Amikor beírunk egy címet egy alkalmazásba (pl. internetböngésző), akkor az alkalmazás meghív egy ún. resolver() könyvtári eljárást aminek a paramétere a cím. Ezt elküldi a beállított DNS szervernek, ami a saját adatbázisából megpróbálja feloldani a név-IP hozzárendelést. Ha ez sikerül akkor visszaküldi UDP csomagban az adott névhez tartozó IP címet.Ha nem sikerül, akkor a fölötte álló DNS szervert kérdezi meg, hátha ő tudja. Ez a folyamat egészen elhaladhat a root szerverekig, amikből összesen 13 van, A-M-ig jelölve. Minden root szerver elsődleges ( ún. top level) doménekért felel és „csak” annyit tudnak, hogy a DNS faszerkezetében melyik ágon kell elindulni hogy megkapjuk az IP-címet.




A DNS szervereknek lehetnek saját körzeteik, ezeket zónáknak hívjuk. A zónák rekordokból épülnek fel, ezek közül a legfontosabbak:

SOA A hatókör kezdete, ez az első rekord
A A név-IP cím hozzárendelésekre használjuk
NS Az adott zónáért felelős DNS szerverek nevét tartalmazza
MX Az adott zónába tartozó leveleket egy számítógépre irányítja
PTR A reverz zónában IP-hez rendel nevet
CNAME Kanonikus neveket rendelhetünk egy géphez, így több néven is elérhetjük
TXT Megjegyzéseket helyezhetünk el
SRV Erőforrás rekord
HINFO Az adott gépről adhatunk leírást






A névkomponensek maximálsan 63, a teljes név pedig 253 karakternyi lehet. Az angol ABC betűin kívül még használhatjuk a „-”-et illetve a számokat. Amikor tudjuk egy számítógép IP-címét, de a nevére vagyunk kíváncsiak, akkor fordított névfeloldást végzünk. Ekkor van szükségünk a reverz zónafájlra és a PTR rekordokra. A reverz zóna neve a kiszolgált hálózat IP címének azonosítójának változatlan oktetteiből épül fel, úgy hogy az oktetteket visszafelé írjuk fel és a végéhez illesztjük az „in-addr.arpa” szabványos kifejezést.
Ahhoz hogy saját zónákat üzemeltessünk tudnunk kell néhány fontos dolgot. Törvényileg szabályozva van, hogy minden körzethez tartoznia kell másodlagos névszervernek is, ráadásul másik hálózatban, más fizikai helyen és nagyon ajánlott másik internetszolgáltatónál
elhelyezni ( a legjobb ha másik AS-ben is van). A másodlagos névszervernek nincsenek saját zónái, azokat az elsődleges szerverről másolja le. Ha véletlenül kiesik a master szerverünk, akkor a másodlagos kit tudja szolgálni a kéréseket addig míg az első helyreáll.
Az elméletről ennyit, most jöjjön egy kis gyakorlati példa:

DNS beállítása debianon



Adott egy domén, legyen root-tech.hu és hozzá egy hálózati cím pl. 192.168.56.0/24. A telepítést és konfigurálást Debianon mutatom be, a többi disztribúción is nagyon hasonlóak a lépések. DNS szerverként a Bind9-et alkalmazom, de több választásunk is lehet, pl.pl djbdns, Xyria stb..., természetesen ezeket máshogy kell konfigurálni.

Szóval kezdjük is, bind9 telepítése:
test:~# apt-get install bind9
Ezután állítsd le amíg konfigurálod:
test:~# /etc/init.d/bind9 stop


Debianon a beállításokat tartalmazó könyvtár a /etc/bind. Itt több fájlt is látsz, ami db.-vel kezdődik az zónafájl, van ami kulcsokat tárol és vannak a named-del kezdődik, azok a konfig fájlok.
Ha saját zónákat szeretnél akkor a named.conf.local-t kell először szerkesztened valahogy így:

//
// Do any local configuration here
//
// Consider adding the 1918 zones here, if they are not used in your
// organization
//include "/etc/bind/zones.rfc1918";
zone "root-tech.hu" {
            type master;
            file "/var/cache/bind/db.root-tech.hu";
};


zone "0.168.192.in-addr.arpa"
           type master;
           file "/var/cache/bind/db.56.168.192.in-addr.arpa";
};



A zone tagokkal kezded dekralálni a zónák nevét. A type szóval megadhatod a zóna típusát ami elsődleges szervereknél master, másodlagosaknál slave... Ha slave zónák lennének, akkor egy master szervertől kérnéd le a zónafájlokat. Ezt másodlagos dns szervereknél szokták alkalmazni. A file paraméter a zónafájl helyét adja meg, hivatkozhatsz rá abszolútan, vagy relatívan is. Az alsó zónáról pár szót: A nevéből látszik hogy ez egy reverse zóna ( az in-addr.arpa egy szabványos név, minden reverz zóna nevéhez oda kell illeszteni), ez azért kell hogy IP alapján névre tudj keresni. Mivel ez egy C osztályú cím, ebből az első 24 bit az állandó ( mert ha egy hálózatban vannak a gépek akkor a hálózat címük nem változik csak az állomásazonosító), ezért az utolsó oktettet el kell hagyni, hogy a PTR rekordok az értékeikkel kiegészíthessék őket.Pl. 1 a zóna nevével kiegészítve ezt adja: 10.56.168.192.in-addr.arpa . Ebből már látszik a normális ip-címe ami 192.168.56.1. Bővebben erről még a zóna fájloknál írok.
Ha beállítottad a named.conf.local-t, akkor jöhetnek a másolós dolgok. A db. empty fájlt kell átmásolni az named.conf.local-ban a file paraméternél deklarált nevekkel. Itt most db.root-tech.hu és db.56.168.192.in-addr.arpa. Tehát másolod és megadod hogy ezen a néven másolja át a /var/cache/bind alá. Ha ezzel is megvagy, akkor szerkeszteni kell őket. Először a db.root-tech.hu-t nézzük:

; BIND reverse data file for empty rfc1918 zone
;
; DO NOT EDIT THIS FILE - it is used for multiple zones.
; Instead, copy it, edit named.conf, and use that copy.
;
$TTL 86400
@ IN SOA test.root-tech.hu. root.localhost. (
2010060401 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
86400 ) ; Negative Cache TTL
;
@ IN NS test.root-tech.hu.
test IN A 192.168.56.1
root-tech.hu. IN MX 10 test
www IN CNAME test

A fájlban a kukac jel a zónát jelenti. A SOA rekord tartalmaz információkat a zónáról, sorrendben a gép nevét, a szerverért felelős személy e-mail címét és a Serial, Refresh, Retry, Expire, Negative Cache TTL értékeket.
A Serial egy sorszám, amelyet módosítanunk kell ha megváltoztattuk a zónafájlt. Érdemes „emberi” számokat hazsnálni, nálam ez a mai dátum megtoldva a 01-el. Ennek akkor van fontos szerepe, ha van másodlagos névszerverünk, mert az ebből az értékből tudja hogy újra le kell-e kérnie a zónafájlt.
A Refresh egy másodpercekben megadott érték, a másodlagos névszerverek ennyi időközönként kérik le a Serial értékét. Ha nem sikerül a lekérdezés, akkor a Retry-ben szereplő idő leteltével próbálkozik újból.
Az Expire a zóna adatainak érvényességét jelenti, ennyi ideig szolgáltatja a másodlagos névszerver a zóna rekordjait.
A Negative Cache TTL a hibás lekérdezések tárolásának ideját jelenti másodpercben.

A következő fontos dolog az a rekordok általános felépítése és típusa.

Név Élettartam Osztály Típus Érték
Az élettartam mező elhagyható.

Az IN az osztályt jelenti, szinte mindig ezt használjuk. Ha a név után nem írunk pontot, akkor a bind hozzáilleszti a névhez a zóna nevét, ezért nem írtam oda a www-hez és az ftp-hez sem. Ha pontot teszek a végére, akkor nem illeszti mögé, ilyenkor ki kell írni az FQDN nevét! (FQDN- Teljesen minősített körzetnév: a gép teljes neve, a végére pontot szokás írni)
Nézzük a reverse fájlt:



; BIND reverse data file for empty rfc1918 zone
;
; DO NOT EDIT THIS FILE - it is used for multiple zones.
; Instead, copy it, edit named.conf, and use that copy.
;
$TTL 86400
@ IN SOA test.root-tech.hu. root.localhost. (
2010060401 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
86400 ) ; Negative Cache TTL
;
@ IN NS test.root-tech.hu.
1 IN PTR test.root-tech.hu.



Ebbe már nem túrtam bele annyira, csak a PTR rekordot vettem fel ami az test.root-tech.hu gépre mutat( az IP címe ebből adódik hogy 192.168.56.1 ) és átírtam a localhostot . Itt vigyázz hogy ha nevet írsz akkor írd ki az FQDN nevét és zárd le ponttal, különben valami ilyesmit kapnál : test.56.168.192.in-addr.arpa :D

Most jöhet a named.conf.option-s szerkesztése, az ebben a fájlban tárolt beállítások minden zónára érvényesek amit kezelsz ( ha finomítani akarsz akkor a named.conf.local-ban az adott zónánál kell beszúrni a beállítást)!



A legfelső nameserver kifejezés után a loopback címed szerepeljen!
Most indítsd el a Bind9 et:
/etc/init.d/bind9 start
Ha hiba nélkül indult akkor jó, különben a syslog-ba írná be hogy mi a baja. Szintaktikai hibák szoktak lenni, figyelj oda hogy a tagokat pontosvesszővel kell lezárni ( kivéve ha a tagot kapcsoszárójel követi). És a kapcsoszárójel bezáró tagját is ;-el zárjuk. Ha olyan hibaüzenetet kapnál hogy a fájlnak nincs vége, akkor valószínűleg lemaradt egy aposztróf lezárása.
Ezután ellenőrizd hogy feloldja-e a neveket a bind. 3 féle dologgal szoktuk teszteni, a dig-gel, nslookup-al és a host-tal.
Próbáld a dig et először:
test:~# dig www.root-tech.hu

; <<>> DiG 9.5.1-P3 <<>> www.root-tech.hu ;; global options: printcmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 16922 ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 1, ADDITIONAL: 0 ;; QUESTION SECTION: ;www.root-tech.hu. IN A ;; ANSWER SECTION: www.root-tech.hu. 86400 IN CNAME test.root-tech.hu. test.root-tech.hu. 86400 IN A 192.168.56.1 ;; AUTHORITY SECTION: root-tech.hu. 86400 IN NS test.root-tech.hu. ;; Query time: 2 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) ;; WHEN: Fri Jun 4 20:25:25 2010 ;; MSG SIZE rcvd: 83 <
A válasznál figyelni kell hogy kitől jön a válasz, ha a loopback címről akkor jó, és ha visszaadta az IP-t akkor működik (figyeld majd az ANSWER részt is, ha 0 akkorvalami gond van, ha legalább 1 akkor viszont jó :) )
Üdv. Tibi

1 megjegyzés:

  1. Hasznos parancs lehet még a témakörben a "host".
    Manapság nem árt esetleg az ipv6-ra is kitérni a dolgokban. pl A rekord helyett ott AAAA rekordnak hívják.

    VálaszTörlés