Vytvoření DNS serveru například v lokální síti je poměrně častý problém, který jednou musel potkat i mě. Uživatelé z nějakého důvodu nejsou schopní zapamtovat si jednoduché adresy jako http://64.233.167.99 (Google) nebo http://212.80.76.18 (Seznam) a musí si pomáhat nějakými berličkami. Na správcích sítě potom je aby jim berličky vyrobili (správcem sítě může být kdokoliv, kdo ví jaká verze Windows mu běží na PC a jestli používá Microsoft Outlook nebo Outlook Express, případně má 4 a více dioptrií).

UPDATE: Později mě napadlo, že nainstalovat a skončit s tím „ono to běží“ je skvělý způsob, jak si koledovat o problémy. Druhý krok by vždy rozhodně měl být podívat se, jestli to nemůže běžet bezpečněji. Dobře napsané programy mají možnost odhození práv roota, běhu v chrootu atd. U PowerDNS je tomu věnována krátká sekce v manuálu, kde jsou obě možnosti popsané. Prozatím jsem přidal do návodu odhození práv roota po otevření portů (porty < 1024 musí otevřít root), později si zkusím pohrát s chrootem.

Úvod

Nejdříve krátký úvod do potřeb DNS v lokální síti. Berte prosím, že vše je psané z pohledu člověka, který se s tím setkal před nedávnem a potřeboval vše zprovoznit co nejrychleji. Pravděpodobně budete potřebovat dvě věci:

  1. Aby počítače v lokální síti měly zajištěný překlad DNS pro servery v internetu.
  2. Aby v lokální síti existovaly nějaké pojmenované počítače (například „share“ pro sdílení důležitých firemních materiálů, instalačních souborů a porna).

Pokud si vystačíte pouze s první funkčností, tak nemusíte číst dále – stačí nastavit počítačům v síti jako DNS servery nějaké dostupné v internetu (například váš ISP) a máte vystaráno. V opačném případě budete potřebovat DNS server, který se bude sestávat ze dvou komponent:

  1. Cachující DNS server pro pokládání dotazů DNS serverům v internetu
  2. Autoritativní server pro lokální počítače

Možnosti na výběr

Některé DNS servery se skládají z obou komponent, některé umí jednu funkčnost. Výběr DNS serverů v Gentoo je poměrně široký, takže vybrat by si z něj měl snad opravdu každý. Třeba old school Bind, který tak nějak podvědomě řadím do stejné kateogorie dinosaurů společně se SendMailem nebo WU-FTPd a které jsou pro mě synonymem starého dobrého internetu, kde neexistoval SPAM, hackeři (oškliví lidé s notebooky z amerických filmů) a Microsoft se snažil ovládnout svět pomocí své Microsoft Network. Tedy toho internetu, kterého jsem si nestačil užít, protože jsem místo toho gamesil UFO.
Nebo DJBDBS, lightweight implementace od Daniela Bernsteina, posedlá bezpečností a jednoduchostí. Jeho příjemnou vlastností oproti Bindu je, že rozděluje svojí funkčnost mezi dnscache (cachující DNS server) a tinydns (autoritativní server). Jeho nepříjemnou vlastností je, že se mi ho ani po několika hodinách nepovedlo přesvědčet, aby spolu dnscache a tinydns korektně spolupracovaly a hodně nezvyklý způsob konfigurace, obvzláště pro příznivce bohatě okomentovaných .conf souborů.
Další možností a mým vítězem se stalo PowerDNS, které stejně jako DJBDNS od sebe odděluje obě komponenty, je velice dobře zdokumentované a pro zájemce poskytuje velké množství možností, co použít jako zdroj informací o nastavení DNS (backend), namátkou MySQL, Postgres, zónové soubory Bindu případně jakýkoliv program, který komunikuje prostřednictvím standartního vstupu a výstupu (pipe backend).

Instalace

Jako backend jsem se rozhodl použít SQLite databázi. Trochu teď přemýšlím, jestli jsem udělal dobře, protože editace zónových souborů by byla pravděpodobně pohodlnější, ale co naplat, přinejhorším vyměním. Následující postup tedy bude používat SQLite backend. Všechno, co je potřeba je v Portage obsaženo, stačí tedy jenom trocha nastavování:

USE flagy

Pro PDNS je potřeba zapnout flagy recursor a sqlite:

# echo ‘net-dns/pdns recursor sqlite’ >> /etc/portage/package.use

Recursor používá ke své funkci knihovnu Boost, což znamená poměrně velkou kompilaci navíc.

Emerge

# emerge -av pdns

Pokud jste to neudělali dříve, tak rozhodně doporučuju nainstalovat balíček bind-tools kvůli skvělému nástroji dig:

# emerge -av bind-tools

Konfigurace

Vytvoření uživatelů

Pro větší bezpečnost necháme server jako jiného uživatele než roota, PowerDNS má sice dobrou bezpečnostní historii, ale démoni běžící s právy roota jsou potenciálně hodně velké riziko.

# groupadd pdns
# useradd -s /bin/false -d /var/empty -g pdns pdns

PDNS používá dva konfigurační soubory, /etc/pdns.conf pro autoritatvní servery a /etc/recursor.conf pro rekurzivní server.

Rekurzivní server a /etc/recursor.conf

Zde není prakticky co konfigurovat, ve výchozím nastavení server poslouchá na adrese 127.0.0.1, portu 53 a ostatní počítače se ho tedy dotazují prostřednictvím autoritativních serverů. Nezkoušel jsem to, ale pravděpodobně by nebyl problém, aby poslouchal na veřejné IP adrese. Recursor defaultně běží jako nobody:nobody, necháme ho ale běžet přímo jako nově vytvořeného uživatele. Pro to je potřeba udělat dvě změny v /etc/recursor.conf.

setuid=pdns
setgid=pdns

V souvislosti s rekurzí je dále potřeba nastavit dva parametry v druhém konfiguračním souboru /etc/pdns.conf:

# Povolit rekurzi pro localhosta a celý rozsah 192.168.0.1 – 192.168.0.255
allow-recursion=127.0.0.1,192.168.0.0/24
# Dotazy predavat na tento DNS server
recursor=195.250.128.34

To je vše, už jenom spustit a zajistit, aby se rekurzor spustil při každém bootu:

# /etc/init.d/precursor start
# rc-update add precursor default

SQLite databáze

Novou SQLIte databázi vytvoříte spuštěním příkazu sqlite s parametrem souboru:

# sqlite /etc/pdns.db

Nastavit správná práva, aby měl uživatel pdns přístup pro čtení:

# chown root:pdns /etc/pdns.db
# chmod 640 /etc/pdns.db

Jak vypadá defaultní databáze je popsáno v příloze k dokumentaci PDNS i s SQL dotazy pro vytvoření tabulek najdete na, takže jenom jak jí naplnit:

INSERT INTO domains VALUES (1, ‘foo.com’, NULL, NULL, ‘NATIVE’, NULL, NULL);
INSERT INTO records VALUES (1, 1, ‘foo.com’, ‘NS’, ‘ns.foo.com’, 300, NULL, NULL);
INSERT INTO records VALUES (2, 1, ‘foo.com’, ‘SOA’, ‘localhost user.foo.com 2006040101 86400 7200 3600000 172800′, 86400, NULL, NULL);
INSERT INTO records VALUES (3, 1, ‘www.foo.com’, ‘A’, ’192.168.0.1′, 120, NULL, NULL);

Hodnoty pro SOA záznam jsem převzal z doporučení RIPE, jenom upřesním, že user.foo.com znamena ve skutečnosti e-mailovou adresu user@foo.com.

Autoritativní server a /etc/pdns.conf

Na tenhle soubor jsme už koukali, takže upravit zbývající parametry:

# spustit s backendem SQLLite a cestou k databazi /etc/pdns.db
launch=gsqlite
gsqlite-database=/etc/pdns.db
# a poslouchat na adrese 192.168.0.1
local-address=192.168.0.1

# A nastavit odhození práv roota
setgid=pdns
setuid=pdns

To je vše a teď ho také spustit:

# /etc/init.d/pdns start
# rc-update add pdns default

Nakonec změňte nameserver v /etc/resolv.conf na právě spuštěný:

# cat /etc/resolv.conf
domain foo.com
nameserver 192.168.0.1

Troubleshooting

Pokud se něco nedaří, tak první věc je zkontrolovat jestli server vůbec běží:

# ps ax | grep pdns

Potom jestli poslouchá na správných adresách a portech:

# netstat -lut

A nakonec co služba vrací, například:

# dig google.com

položí dotaz na nameservery podle /etc/resolv.conf a

# dig @127.0.0.1 google.com

se zeptá přímo rekurzivního nameserveru. Výsledek by měl vypadat zhruba:

# dig google.com

; <<>> DiG 9.3.2 <<>> google.com
;; global options: printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 40880
;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 4, ADDITIONAL: 4

;; QUESTION SECTION:
;google.com. IN A

;; ANSWER SECTION:
google.com. 300 IN A 64.233.167.99
google.com. 300 IN A 64.233.187.99
google.com. 300 IN A 72.14.207.99

;; AUTHORITY SECTION:
google.com. 345600 IN NS ns1.google.com.
google.com. 345600 IN NS ns2.google.com.
google.com. 345600 IN NS ns3.google.com.
google.com. 345600 IN NS ns4.google.com.

;; ADDITIONAL SECTION:
ns1.google.com. 345600 IN A 216.239.32.10
ns2.google.com. 345600 IN A 216.239.34.10
ns3.google.com. 345600 IN A 216.239.36.10
ns4.google.com. 345600 IN A 216.239.38.10

;; Query time: 130 msec
;; SERVER: 192.168.0.1#53(192.168.0.1)
;; WHEN: Sun Apr 9 22:28:34 2006
;; MSG SIZE rcvd: 212

Ve třetím řádku od konce naleznete jaký server vám skutečně odpověděl.

Ještě jednodušší možnost

S příchodem rekurzoru ve verzi 3.1.1 je vytvoření jednoduchého DNS serveru už úplnou hračkou. Tato verze totiž umí „exportovat“ /etc/hosts, takže odpadá nutnost jakýchkoliv backendů a autoritativní server nemusí být nainstalován. Návod jsem tentokrát umístil přímo do mojí soukromé wiki, kam se doufám jednou přestěhuje i tento.

Zanechej komentář

K zanechání komentáře ke článku musíte být přihlášen. Přihlásit »