[[oktatas:linux:dns szerver|< DNS szerver]] ====== BIND9 ====== * **Szerző:** Sallai András * Copyright (c) 2011, Sallai András * Szerkesztve: 2011, 2013, 2017, 2018, 2019 * Licenc: [[https://creativecommons.org/licenses/by-sa/4.0/|CC BY-SA 4.0]] * Web: https://szit.hu ===== Előfeltevések ===== Feltételezzük, hogy van egy futó működő szerver, jól beállított fix IP címmel. Az IP címet ellenőrizzük az "ip a s" paranccsal. Erre az IP címre kell beállítanunk tartománynevünket. ===== BIND - Berkeley Internet Name Domain ===== ==== Telepítés ==== Rendelkezésre álló verzió: * BIND9 # apt install bind9 Szükség lesz még a dig parancsra. Ez két csomagban is benne van: # apt install knot-dnsutils vagy # apt install dnsutils ==== Ellenőrzés ==== rndc status systemctl status bind9 systemctl start bind9 rndc reload systemctl status bind9 ===== BIND9 konfig fájlok I. ===== /etc/bind/ Minden zónát fel kell vennünk a /etc/bind/named.conf.local fájlban. A gyökér szerverek elérhetősége alapból konfigurálva van a db.root fájlban. A /etc/bind/named.conf.options fájl globális az bind egészére vonatkozó beállításokat tartalmazza. ==== directory opció ==== * Egy könyvtárra mutat * A zónafájlok helye ehhez a könyvtárhoz képest ralatívan értendők. * Esetünkben ezért így helyes: * /var/cache/bind ==== forwarders opció ==== Ha TOP level domainek lekérdezése helyett az ISP szervereitől akarunk lekérdezni DNS-t a gyorsabb elérés érdekében (mivel azok a névszerverek közelebb vannak), akkor ide írjuk azok IP címét. ==== Query-source ==== Query-source address * port 53; A 8.3 bindtól tetszőleges port megadható amelyen a bind figyeli a kéréseket. ==== Zónafájlok ==== Minden zónának kell külön ún. zónafájlt készíteni, melyek szokásos helye /var/cache/bind, bár ezt megváltoztathatjuk. Itt két újabb könyvtár létrehozása szokásos. A master és a slave. A master könyvtárban tároljuk azokat a zónákat amelyeknek "master" szervere vagyunk, és értelemszerűen a slave könyvtárban azoknak a zónáknak a fájljait tesszük amelyeknek "slave" vagyunk. ==== Rekord ==== Minden zónafájl rekordokból áll. Egy rekord a következő részekből áll. Általánosan: | név | TTL | osztály | típus | adat | Részletek: | név | TTL | osztály | típus | adat | | amit be akarunk állítani | meddig tárolhatják \\ a rekord adatait \\ (nem kötelező) | IN | SOA \\ A \\ PTR \\ NS \\ CNAME \\ MX | adatok | Példa: | név | TTL | osztály | típus | adat | | zold.and. | 3D | IN | A | 192.168.5.4 | ==== Zónafájlok helye ==== mkdir /var/cache/bind/master mkdir /var/cache/bind/slave A bind a zónaátvitelhez használhat kulcsokat a párbeszédhez. Ezeket egy managed-keys.bind fájlba szokás menteni. A Bind e nélkül is elindul, azonban annak hiánya a naplófájlokban hibaüzenetet generál. Hozzunk létre a kulcsok számára is egy állományt: touch /var/cache/bind/managed-keys.bind chown bind:bind /var/cache/bind/managed-keys.bind Utóbbi, hogy a bind tudja is írni. ==== Egy zónabejegyzés ==== A példában olyan top level domaint választottam, amely nem létezik: "and". A zold.and zóna bejegyzése: mcedit /etc/bind/named.conf.local zone "zold.and" in { type master; notify yes; file "master/zold.and.zone"; }; Részletek | zone "zold.and" in { | A zóna neve | | type master; | Mester típusú zóna | | notify yes; | A Slave szervernek nem kell a \\ refresh lejáratára figyelni, maga \\ kezdeményezheti a frissítést | | file "master/zold.and.zone"; | A zónafájl helye | Ellenőrizzük, a konfiguráció helyességét a named-checkconf paranccsal: named-checkconf /etc/bind/named.conf.local A zónafájloknak szokásos kiterjesztése .zone Szokás szerint a fájl neve a zóna nevével megegyezik, amelynek adunk egy .zone kiterjesztést. (Ettől eltérhetünk, de így találjuk meg könnyen zónafájljainkat. touch /var/cache/bind/master/zold.and.zone Minimális zóna: $TTL 3D zold.and. SOA ns.zold.and. hostmaster.zold.and. ( 2012012401 8H 2H 4W 1D) zold.and. NS ns.zold.and. zold.and. A 192.168.5.4 ns.zold.and. A 192.168.5.4 * SOA rekord * zold.and. - a domain, amiről szó van * SOA - a rekord neve * zold.and. - névszerver - ez most önmagára mutat * hostmaster.zold.and. - e-mail cím * szériaszám * slave frissítési idő * slave mennyi idő múlva próbálkozzon újra, ha sikertelen volt a frissítés * a zóna lejár ekkor * egy feloldó (rezolver) mennyi ideig tartsa elérhetetlennek, ha elérhetetlen volt Az A rekord neve előtt a zóna neve helyett megadható @ karakter is: zold.and. De akár el is hagyhatjuk. $TTL 3D zold.and. SOA ns.zold.and. hostmaster.zold.and. ( 2012012401 8H 2H 4W 1D) NS ns.zold.and. A 192.168.5.4 ns A 192.168.5.4 Szintaktikai ellenőrzés: named-checkzone zold.and /var/cache/bind/master/zold.and.zone Újraindítjuk a szervert: invoke-rc.d bind9 restart Ellenőrizzük, van-e hibaüzenetünk a syslog állományban: tail /var/log/syslog Ellenőrizzük, hogy névszerverünk szolgáltatja-e a domaint: dig @localhost zold.and ; <<>> DiG 9.7.3 <<>> @localhost zold.and ; (1 server found) ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 41154 ;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0 ;; QUESTION SECTION: ;zold.and. IN A ;; ANSWER SECTION: zold.and. 86400 IN A 192.168.5.4 ;; AUTHORITY SECTION: zold.and. 86400 IN NS zold.and. ;; Query time: 0 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) ;; WHEN: Tue Jan 24 20:44:21 2012 ;; MSG SIZE rcvd: 56 A kimenetben keressük az "ANSWER SECTION" sorokat, amit követ a helyes név domainnév és IP cím összerendelés: zold.and. 86400 IN A 192.168.5.4 Most ellenőrizzük, hogy az alkalmazásaink is képesek-e használni. A zold.and zónát egyelőre csak saját szerverünk ismeri, ezért állítsuk be azt DNS szervernek. Ezek után állítsuk be a /etc/resolv.conf fájlban a DNS szervernek a saját DNS szerverünk címét, majd ellenőrizzük a host paranccsal is: host zold.and nslookup zold.and ==== Zóna újra ==== Állítsunk be aldomaineket, aliasokat. Az NS rekordnak és az első A rekordnak (amely nem tartalmazza a host nevet sem), rögtön a SOA rekord után kell megadni. Csak ezek után jöhet a többi! $TTL 3D @ SOA ns.zold.and hostmaster.zold.and. ( 2012012401 8H 2H 4W 1D) NS ns.zold.and. NS ns2.zold.and. A 192.168.5.4 ns A 192.168.5.4 ns2 A 192.168.5.4 iskolazo A 192.168.5.4 mail A 192.168.5.4 www CNAME iskolazo === postmaster@zold.and === DNS szerverünkön működnie kell a postmaster@zold.and e-mail címnek. E nélkül a regirsztrátorok nem fogadják el kérelmünket. ==== Technikai ellenőrzés ==== * http://www.domain.hu/domain/regcheck Technikai ellenőrzés * .hu domain esetén 2 hét várakozási idő * A regisztrátor csak akkor delegálja a toplevel szervereken a domainünket, ha lefut a regchek, azaz a technikai ellenőrzés sikeres ==== BIND újraindítása ==== Új zóna esetén: /etc/init.d/bind9 reload Ha változtatunk egy zónán: rndc reload ==== MX rekord a BIND-ban ==== Amire ügyelni kell a sorrend. Az MX rekordot az NS rekord után helyezzük el. A másik, hogy a mail.zold.and. ne alias legyen, helyette "A" rekord. @ SOA ns.zold.and hostmaster.zold.and ( 2012012401 8H 2H 4W 1D) NS ns.zold.and. NS ns2.zold.and. MX 10 zold.and. A 192.168.5.4 ns A 192.168.5.4 ns2 A 192.168.5.4 iskolazo A 192.168.5.4 mail A 192.168.5.4 www CNAME iskolazo ===== Ellenőrző eszközök ===== * **host** kiszolgáló lekérdezése (bind9-host csomag része) * **dig** kiszolgáló tesztelése (dnsutils csomag része) * **dlint** hiba ellenőrző * **nslookup** kiszolgáló interaktív lekérdezése (dnsutils csomag része) * **rblcheck** a domainünk rbl listán van-e? ===== dig ===== ==== Kiszolgáló tesztelése ==== Megadjuk neki melyik névszerver beállításaira vagyunk kíváncsiak, és melyik domain-re. dig @localhost zold.and A példában a localhost-on futó DNS szerverre vagyok kíváncsi, és szeretném tudni mit mond a zold.and domaintről. Ha csak az "A" rekordot szeretnénk látni, lebeszélhetjük a dig parancsot a többi sor kiírásáról: dig +nocomments +nostats +nocmd +noquestion szit.hu Ha az MX rekordra vagyunk kíváncsiak: dig +nocomments +nostats +nocmd +noquestion MX szit.hu Ha még kevesebb szükséges: dig +short szit.hu dig +short MX szit.hu ===== Postmaster ellenőrzése ===== telnet localhost 25 vagy telnet 127.0.0.1 25 Megnézzük a postaládát Ha távolról lépünk be, akkor nem kell megnézni, ha nincs ilyen e-mail cím akkor nem fogadja el, hacsak nem vagyunk OpenRelay ===== Inverz zóna ===== ==== Konfigurációs állomány ==== mcedit /etc/bind/named.conf.local zone "8.22.165.195.in-addr.arpa" in { type master; notify yes; file "master/159.166.22.8.zone"; }; Ellenőrizzük: named-checkconf /etc/bind/named.conf.local ==== Zóna fájl ==== mcedit /var/cache/bind/master/195.166.22.8.zone $TTL 3D @ SOA ns1.zold.and hostmaster.zold.and ( 2006092401 8H 2H 4W 1D) NS ns1.zold.and. PTR zold.and. A zónafájl szintaktikai ellenőrzése: named-checkzone 8.22.166.195.in-addr.arpa /var/cache/bind/master/195.166.22.8.zone ==== Újraindítás ==== invokde-rc.d bind9 restart ==== PTR ellenőrzése ==== Elkészültünk a beállításokkal. Ellenőrizzük, hogy a DNS szerverünk szolgáltatja-e a bejegyzést. === dig === dig -t ptr @localhost 4.5.168.192.in-addr.arpa Helyes válasz esetén: ;; ANSWER SECTION: 4.5.168.192.in-addr.arpa. 259200 IN PTR zold.and. === host === A host paranccsal: A vizsgálathoz legyen beállítva a /etc/resolv.conf fájlban a DNS szervernek a localhost. host 195.166.22.8 Az iskolapéldánk: host 192.168.5.4 Ha rendben van a futtatás eredménye: 4.5.168.192.in-addr.arpa domain name pointer zold.and. ===== Módosítás ===== Ha egy meglévő zónát módosítunk, kezdjük a sorozatszám növelésével! ===== Másodlagos szerver ===== Másodlagos illetékes szerver. Egy másik szerveren beállítom zold.and zónát: zone "zold.and" { type slave; masters { 192.168.5.4; }; }; zone "4.5.168.192.in.addr.arpa" { type slave; masters { 192.168.5.4; }; }; Ha szeretnénk, hogy az adatokat el is mentse a bind, akkor állítsunk be file sort is. A bind számára adjunk írási jogot. zone "zold.and" { type slave; masters { 192.168.5.4; }; file "/var/cache/bind/slave/zold.and.zone"; }; chown bind.bind /var/cache/bind/slave invoke-rc.d bind9 restart Újraindítás után nézzük meg: cat /var/cache/bind/slave/zold.and.zone Lehetséges eredmény: $ORIGIN . $TTL 80 ; 1 minute 20 seconds zold.and IN SOA ns1.zold.and. hostmaster.zold.and. ( 2012032301 ; serial 60 ; refresh (1 minute) 20 ; retry (20 seconds) 120 ; expire (2 minutes) 90 ; minimum (1 minute 30 seconds) ) NS ns1.zold.and. NS ns2.zold.and. A 192.168.5.100 $ORIGIN zold.and. iskolazo A 192.168.5.100 ns1 A 192.168.5.100 ns2 A 192.168.5.100 www CNAME iskolazo A tesztelés érdekében nagyon kis TTL értékeket állítottam be a master zónafájlban. ===== Biztonság ===== ==== Zónaátvitelek korlátozása ==== Zónaátvitelt ne engedélyezzük mindenhonnan. A példában csak a 192.168.5.8-as másodlagos szervernek és localhoston engedélyezzük: zone "zold.and" { allow-transfer { 192.168.5.8; localhost; }; }; ==== Lekérdezések korlátozása ==== Ha valaki nem a mi tartományunkból kérdez le, akkor azt ne engedjük. options { allow-query { 192.168.5.0/24; localhost; }; }; zone "zold.and" { allow-query { any; }; }; zone "5.168.192.in-addr.arpa" { allow-query { any; }; }; Rekurzív lekérdezéseket is csak a saját tartományból engedélyezzük. options { allow-recursion { 192.168.5.0/24; localhost; }; }; ==== Futtatás nem root felhasználóként ==== Alapvetően Debian rendszerben dolgozunk és itt alapból nem rootként fut a bind. Ha forrásból telepítettük vagy más rendszeren dolgozunk, ahol nem így van, akkor használjuk a -u kapcsolót a felhasználó megadásához. Keressük meg az indító scriptet, amely lehet például a következő: /etc/init.d/bind9 A -u kapcsolót illesszük a kapcsolók közzé. Például: start-stop-daemon --start --oknodo --quiet --exec /usr/sbin/named -u bind ===== Dokumentáció ===== apt-get install bind9-doc ls /usr/share/doc/bind9-doc ===== Függelék ===== ==== Tartománynév ==== Gyakorláshoz használható toplevel domainek: * .suli * .isi * .and Ezek sehol nem szerepelnek a világhálón. Ezek után ilyen domaineket hozhatunk létre: * toretlen.suli * toretlen.isi * toretlen.and * kezes.suli * kezes.isi * kezes.and * stb. ==== Zónaminták ==== === Minimális zóna === $TTL 3D zold.and. SOA zold.and. hostmaster.zold.and. ( 2012032301 8H 2H 3W 1D) NS zold.and. A 192.168.5.4 === NS rekorddal === $TTL 3D @ SOA ns1.zold.and. hostmaster.zold.and. ( 2012032301 8H 2H 3W 1D) NS ns1.zold.and. A 192.168.5.4 ns1 A 192.168.5.4 === A hostnév felvétele === $TTL 3D @ SOA ns1.zold.and. hostmaster.zold.and. ( 2012032301 8H 2H 3W 1D) NS ns1.zold.and. A 192.168.5.4 ns1 A 192.168.5.4 iskolazo A 192.168.5.4 === Becenevek (aliasok) megadása === $TTL 3D @ SOA ns1.zold.and. hostmaster.zold.and. ( 2012032301 8H 2H 3W 1D) NS ns1.zold.and. A 192.168.5.4 ns1 A 192.168.5.4 iskolazo A 192.168.5.4 www CNAME iskolazo ftp CNAME iskolazo irc CNAME iskolazo === Levelezés === $TTL 3D @ SOA ns1.zold.and. hostmaster.zold.and. ( 2012032301 8H 2H 3W 1D) NS ns1.zold.and. MX 10 mail.zold.and. A 192.168.5.4 ns1 A 192.168.5.4 iskolazo A 192.168.5.4 mail A 192.168.5.4 www CNAME iskolazo ftp CNAME iskolazo irc CNAME iskolazo * Az MX rekordot az NS után vegyük fel! * A mail.zold.and. ne alias legyen! === Inverz feloldás === $TTL 3D @ SOA ns1.zold.and. hostmaster.zold.and. ( 2012032301 8H 2H 3W 1D) NS ns1.zold.and. PTR zold.and. A zóna neve: 4.5.168.192.in-addr.arpa === Inverz feloldás több IP esetén === Ha mi vagyunk az illetékesek a 192.168.5.0 hálózatban: $TTL 3D @ SOA ns1.zold.and. hostmaster.zold.and. ( 2012032301 8H 2H 3W 1D) NS ns1.zold.and. 4 PTR elso.zold.and. 5 PTR masodik.zold.and. A zóna neve: 5.168.192.in-addr.arpa === IN osztály === $TTL 3D @ IN SOA ns1.zold.and. hostmaster.zold.and. ( 2012032301 8H 2H 3W 1D) IN NS ns1.zold.and. IN MX 10 mail.zold.and. IN A 192.168.5.4 ns1 IN A 192.168.5.4 iskolazo IN A 192.168.5.4 mail IN A 192.168.5.4 www IN CNAME iskolazo ftp IN CNAME iskolazo irc IN CNAME iskolazo ==== Illetékesség, rekurzív feloldás ==== Ha szerverünk illetékes domainek számára, de rekurzív feloldást nem szeretnénk, akkor a következő beállítások kellenek: allow-query { any; }; recursion no; Ha a rekurzió engedni kell valahol, akkor ezekhez hasonlóan tehetjük meg: allow-recursion { 192.168.5/24; }; allow-recursion { 10.0/16; }; allow-recursion-on { 192.168.2.3; }; ==== Dinamikus DNS frissítés ==== Lehetővé teszi, egy névszerveren rekordok hozzáadását, elvételét a zónafájl frissítése közben. Például dinamikus IP esetén jól jöhet. Erre való az nsupdate parancs: nsupdate Az nsupdate a dnsutils csomagban található. ==== DNS hierarchia a gyökértől ==== A következő példában egy .and toplevel domainnek nézzük meg egy domain hierarchia kialakítását. === ns.root szerver -- 10.30.20.1 === options { directory "/etc/bind/zones"; }; zone "." { type master; file "root.zone"; allow-transfer { none; }; }; $TTL 2d . IN SOA ns.root. hostmaster.ns.root. ( 2 ; Serial 604800 ; Refresh 86400 ; Retry 2419200 ; Expire 604800 ) ; Nagative Cache TTL . NS ns.root. ns.root. A 10.30.20.1 $ORIGIN and. @ NS a.and. a.and. A 10.30.20.2 === a.and szerver 10.30.20.2 === options { directory "/etc/bind/zones"; recursion yes; allow-query { any; }; version "not currently available"; }; zone "and" { type master; file "and.zone"; allow-transfer { none; }; }; zone "10.in-addr.arpa" { type master; file "10.rev"; }; $TTL 2d @ IN SOA a.and. hostmaster.a.and. ( 2 ; Serial 604800 ; Refresh 86400 ; Retry 2419200 ; Expire 604800 ) ; Negative Cache TTL and. NS a.and. a.and. A 10.30.20.2 $ORIGIN piros.and. @ NS ns.zold.and. ns.zold.and. A 10.30.20.3 $ORIGIN zold.and. @ NS ns ns A 10.30.20.3 $ORIGIN 10.in-addr.arpa. $TTL 2d @ SOA ns.zold.and. hostmaster.zold.and. ( 20170106 3h 15m 1w 2d ) @ NS ns.zold.and. 3 PTR ns.zold.and. === zold.and szerver -- 10.30.20.3 === options { directory "/etc/bind/zones"; recursion yes; allow-query { any; }; }; zone "piros.and" { type master; file "piros.and.zone"; allow-transfer { none; }; }; zone "zold.and" { type master; file "zold.and.zone"; allow-transfer { none; }; }; zone "10.in-addr.arpa" { type master; file "10.rev"; allow-transfer { none; }; }; zone "30.10.in-addr.arpa" { type master; file "10.30.rev"; allow-transfer { none; }; }; zone "20.30.10.in-addr.arpa" { type master; file "10.30.20.rev"; allow-transfer { none; }; }; zone "in-addr.arpa" { type master; file "root.rev"; allow-transfer { none; }; }; $ORIGIN 20.30.10.in-addr.arpa. $TTL 2d @ SOA ns.zold.and. hostmaster.zold.and. ( 2017010600 3h 15m 1w 2d ) @ NS ns.zold.and. @ PTR ns.zold.and. 3 PTR ns.zold.and. 4 PTR ns.zold.and. $ORIGIN 30.10.in-addr.arpa. $TTL 2d @ SOA ns.zold.and. hostmaster.zold.and. ( 2017010600 3h 15m 1w 2d ) @ NS ns.zold.and. @ PTR ns.zold.and. $ORIGIN 10.in-addr.arpa. $TTL 2d @ SOA ns.zold.and. hostmaster.zold.and. ( 2017010600 3h 15m 1w 2d ) @ NS ns.zold.and. 30 NS ns.zold.and. @ PTR ns.zold.and. $TTL 2d @ SOA ns.zold.and. hostmaster.zold.and. ( 2017010600 3h 15m 1w 2d ) piros.and. NS ns.zold.and. piros.and. A 10.30.20.4 $ORIGIN in-addr.arpa $TTL 2d @ SOA ns.root. hostmaster.ns.root. ( 2017010600 3h 15m 1w 2d ) @ NS ns.root. $ORIGIN 10.in-addr.arpa @ NS ns.zold.and. . 3600 NS ns.root. ns.root. 3600 A 10.30.20.1 $ORIGIN zold.and. $TTL 2d @ SOA ns.zold.and. hostmaster.zold.and. ( 2017010600 3h 15m 1w 2d ) zold.and. NS ns.zold.and. zold.and. A 10.30.20.3 ns.zold.and. A 10.30.20.3 www CNAME zold.and. === isp.and szerver -- 10.30.20.5 === options { directory "/etc/bind/zones"; }; zone "." { type hint; file "root.zone"; }; . 3600 NS ns.root. ns.root. 3600 A 10.30.20.1