Hem >> Bloggar >> Teknikbloggen >> Installera en egen DNS-server i Ubuntu Linux

Installera en egen DNS-server i Ubuntu Linux

  • Posted on: 25 January 2015
  • By: Pontus

En egen DNS-server kanske låter invecklat? Grundprincipen är dock relativt enkel och du kan snabbrt ha igång din egna DNS.

Till att börja med, vad gör en DNS-server? 

Alla datorer har ett ip-nummer som är unikt för alla datorer. Så om du vill ansluta till en dator så behöver du ange den datorn IP-nummer, man kan säga att det är som ett telefonnr för datorer. Men säger du, när du ska läsa facebook så skriver du bara www.facebook.com i webbläsaren och så kommer du dit. Men utan DNS-servrarna så hade det aldrig fungerat. Det är nämligen DNS-servern som söker upp ip-nummret till www.facebook.com.

Kortfattat fungerar det så här. Din dator är inställd att använda en, eller flera DNS-servrar. Till exempel kan det vara 8.8.8.8. När du ska besöka facebook så frågar din dator DNS-servern vilket IP-nummer den adressen går till. Servern har i sin tur en lista med andra servrar, ROOT-servrar som de kallas, det är de servarna som håller ordning på alla toppdomänerna. Alltså .se, .com, .nu och så vidare. 

Din DNS-server frågar då ROOT-servrarna vilken server som ansvarar för facebook.com.  Svaret blir då att det är a.ns.facebook.com och b.ns.facebook.com som ansvarar för den domänen och deras IP-nummer är 69.171.239.12 och 69.171.255.12. Aha då frågar vi dem, din DNS-server frågar då Facebooks servrar och får då slutligen ett IP-nummer som webbläsaren kan ansluta till.

Kortfattad genomgång om hur det fungerar, dags att installera.

Installera bind9

Instruktionerna är baserade på Ubuntu 14.04 men det fungerar likadant på de mesta av Ubuntu versionerna.

Börja med att installera Bind som DNS-server programvaran heter. 

sudo apt-get install bind9

När installationen är klar går vi till katalogen som innehåller konfigurationsfilerna.

cd /etc/bind

Först lägger vi till lite inställningar för att öka säkerheten. Så öppna named.conf.options

sudo joe named.conf.options

Lägg till följande efter raden med listen-on-v6 { any; } ;

recursion no;

allow-transfer { none; };

version "no way";

Recusion no; - Spärrar så att inte servern svarar på alla DNS-anrop utan enbart på anrop gällande domänerna som vi lägger in. Det är iofs standard efter version 9.4 men aldrig fel att lägga till det ändå, för att vara på säkra sidan.

allow-transfer { none; }; - Gör så att inte vem som helst kan begära en kopia av domändatabasen från servern. Det är i och för sig ingen större risk kopplat med att låta andra kopiera databasen eftersom att DNS av naturen är väldigt öppet. Hela tanken bakom DNS är att alla ska kunna söka upp informaitonen som finns i databasen. Men en anledning till att spärra är för att minska möjligheten att göra en överbelastningsattack.

version "no way"; - Ifall någon frågar servern vilken version den kör så kommer den att svara med "no way" istället. Vi ställer in det för att vi inte vill att någon ska kunna ta reda på vilken version av Bind vi använder, av säkerhetsskäl. Om de vet versionen så vet de vilka eventuella säkerhetsbrister den har.

Stäng och spara (ctrl+k och x om du använder joe).

Nu är servern installerad men vi har fortfarande inte talat om för den vilka domäner den ska svara för. Det gör vi på nästa sida.

Skapa master-zon för domänen

Nu är det dags att skapa en master-zon för domänen.

Öppna filen som definierar zonerna.

sudo joe named.conf.local

Nu ska vi lägga till en zon som den här servern ska vara master för. Det betyder att det är den här servern som ansvarar för domänen. Vi kommer sedan att lägga till en slave-server, den servern kommer att lagra en kopia av domänen. På det sättet finns det alltid en server som kan svara om den ena går ner.

Lägg till följande i text-filen.

zone "example.com" {

        type master;

        file "/etc/bind/db.example.com";

        allow-transfer { x.x.x.x; };

};

Första raden anger vad zonen eller domänen heter, example.com. Type säger att den här servern är master för domänen. Därefter hänvisar vi till en textfil som innehåller all information om domänen och slutligen har vi allow-transfer. Den raden säger att endast servern med ip-nummer x.x.x.x får kopiera hela domändatabasen. x.x.x.x ersätter vi alltså med IP-nummret till våran slavserver.

Spara filen, i joe gör du det genom att trycka ctrl+k följt av x.

Nu ska vi skapa databasen för zonen, det gör vi genom att skapa filen som vi hänvisar till från named.conf.local.

sudo joe db.example.com

Kopiera in följande för att skapa SOA, Start Of Authority, det är den absolut viktigaste delen av domänen. Här ställer vi in den grundläggande informationen. Symbolen ; betyder att texten efter är en kommentar och bind igorerar således allting efter ;.

;

; BIND data file for example.com interface

$TTL    604800

@       IN      SOA     ns.example.com. webmaster.example.com. (

                                1          ; Serial

                        86000         ; Refresh

                          7200         ; Retry

                       2419200         ; Expire

                         604800 )       ; Negative Cache TTL

$TTL 604800 - anger Time To Live, hur länge kan andra cacha informationen innan de behöver fråga den här servern igen. 

IN SOA - Vilken typ av värde är det vi anger, IN står för internet och är det enda som används idag. Andra värden är historia. SOA anger att det är Start Of Authority,altså informaitonen om domänen. 

ns.example.com - anger adressen till dns-servern.

webmaster.example.com - Mailadressen till den som ansvarar för domänen. @ ersätts med . alltså utläses den här mail-adressen som webmaster@example.com.

Därefter följer lite olika värden i en följd, för att man ska komma ihåg vad som är vad så lägger vi till ; och en förklaring. Allting som kommer efter ; behandlas ju som en kommentar och Bind bryr sig således inte om det.

Serial - Ett slags revisionssystem, värdet ökar för varje ändring som görs för att andra servrar ska kunna hålla kolla på vilken version det är som gäller. Värdet måste ändras manuellt vilket betyder att det ofta glöms. Största orsaken till att ändringarna inte fungerar är att man har glömt att ändra det här värdet.

Refresh - Hur ofta slavservrarna ska kolla med mastern om serienummret har ändrats.

Retry - Ifall slavservern misslyckades med att hämta information från mastern så väntar den så här många sekunder innan den försöker igen.

Expire - Så här länge håller slav-servern zonen som giltlig ifall den inte lyckas kontakta master-servern. Anges i sekunder och rekommenderad tid är mellan 2 till 4 veckor.

Negative Cache TTL - Standard värdet för hur länge andra servrar ska cacha zonen innan de frågar igen. Håll värdet lågt om du ändrar ofta, om du inte ändrar ofta i dns-zonen så ska du hålla det mellan 1-5 dagar för att snabba upp tiden för domänuppslagningar.

Efter vårat SOA så ställer vi in värdarna som finns.  

@                IN      NS              ns

@                IN      NS              ns2

@                IN      MX      10      mail

@                IN      MX      20      mail2

@                 IN      A               x.x.x.x

ns                 IN      A               x.x.x.x

ns2               IN      A               x.x.x.x

www             IN      A               x.x.x.x

IN NS - anger våra dns-servrar. Här måste du ange samma namn och IP-nummer som du anger hos din registrar. Det kan fungera även om du inte anger samma men risken finns att dns-sökningarna tar längre tid eftersom att klienterna måste kolla upp servern dubbelt.

IN MX XX - vilka är våra mailservrar och i vilken ordning ska de kontaktas. När andra värdar på internet ska skicka mail till så frågar de efter våra MX värden. Därefter kontaktar de först servern med lägst värde, här 10. Om den servern ligger nere så frågar de resterande i turordning efter deras MX värde. 

IN A - Här anger vi själva servarna. Alltså namnet ns står för ns.example.com och här översätter vi den till ett IP-nummer. 

@ - står för domänen, alltså i det här fallet example.com. Så om någon frågar efter IP-nummret till example.com så får de det IP-nummret som följer på den här raden.

Observa att du kan ange värdarna på två olika sätt. Antingen hela domännamnet eller som här bara med värdnamnet. Anger du hela domänen så måste den avslutas med en punkt, annars kommer domänen att läggas till efter. Vi tar ett exempel.

www.example.com             IN      A               x.x.x.x

www.example.com.             IN      A               x.x.x.x

Den första raden www.example.com saknar en punkt och således kommer Bind att lägga till domänen efter. Alltså kommer den raden att ange ett ip-nummer till adressen www.example.com.example.com.

Medans rad två har en punkt, Bind kommer då inte att lägga till domänen efter och raden anger därmed ett ip-nummer till adressen www.example.com, förmodligen det vi vill.

När vi har lagt in alla adresser i zonen så startar vi om bind.

sudo service bind9 restart

Förhoppningsvis fick du inga felmeddelanden, nu lägger vi till slav-servern och kontrollerar att det fungerar.

Slav server för domänen

Alla domäner måste ha minst två olika dns-servrar för att ha en viss redundans ifall den ena slutar att fungera av någon anledning. Därför kräver (nästan) alla registrarer på internet att du har två olika dns-servar. Det blir rätt jobbigt om vi skulle behöva registrera alla adresserna på båda servrarna därför lägger man till något som kallas för en slav-server.

När vi uppdaterar databasen för domänen, lägger till en adress eller tar bort, så kommer master-server att säga till slaven att det har skett en ändring. Slav-servern  kommer då att ansluta och kopiera dns-databasen. På det här sättet räcker det med att uppdatera dns-posterna på ett ställe.

Börja med att installera Bind9 på den andra servern, om det inte redan är gjort.  

När dns-servern är installerad definierar vi slav-zonen på samma sätt som vi la till master-zonen på den första servern, alltså genom att lägga till den i named.conf.local. 

sudo joe named.conf.local

För att definiera slav-zonen så lägger vi till följande.

zone "example.com" {

        type slave;

        file "/var/lib/bind/db.example.com.slave";

        masters { x.x.x.x; };

};

Som du ser så påminner det rätt mycket om när vi definierade en master-zon. Vi börjar med att ange vad domänen eller zonen ska heta. Därefter säger vi att den här servern ska vara slav-server. File anger vilken fil som zonen ska sparas i. Här har vi lite skillnad från mastern, på master sparade vi filen under /etc/bind/, medans vi nu sparar den under /var/lib/bind/.

Anledningen till det är för att AppArmor stoppar Bind från att skriva till /etc/bind. När Bind kopierar domänen från mastern så kommer informationen att sparas i den här filen. Alltså måste Bind kunna skriva till den. Ett sätt att undgå det är att lägga in ett undantag i AppArmor, jag anser att det sänker säkerheten. Rent teoretiskt så kan det finnas en möjlighet att någon kan få Bind att skriva över konfigurationsfilerna då och således ta kontroll över din server. 

Sista raden, master, anger ip-nummret till master servern som vi ska hämta zonen ifrån. 

Därefter startar vi om bind för att se så att det fungerar. 

sudo service bind9 restart

Om det inte kommer några felmeddelanden så ska det nu finnas en fil i /var/lib/bind/ som heter db.example.com.slave. Den filen sparas i binärt-format vilket betyder att vi inte bara kan skriva cat och se om informationen i det stämmer. På äldre versioner av bind så sparades filen i vanligt textformat men i senare versioner är den istället binär för att öka prestandan. 

Om vi skulle testa att försöka läsa filen så skulle det se ut ungefär så här.

user@server02:~$ cat /var/lib/bind/db.example.com.slave 

examplecomnsexamplecomns2examplecom*mple:�nsexamplecom�<�+'     :�ns2examplecom�<�0  :server01examplecom�<�0  :server02examplecom�<�+ :�wwwexamplecom�<�user@server02:~$ 

För att kontrollera så att domänen fungerar kan vi antingen säga till bind att vi ska spara filen i textformat eller konvertera filen. För att få bind att spara den i textformat så lägger man till följande till konfigurationen för zonen, du kan till exempelt lägga den här raden efter type slave; raden. Därefter måste du starta om bind.

masterfile-format text;

För att kuna ha filen i binärformat men ändå kunna kontrollera så att zonen stämmer så kan vi istället konvertera filen till textformat. Då slipper vi starta om bind för att ändra inställningen.

Skriv följande i en terminal för att konvertera, observera att det är ett kommando som ska skrivas på en rad.

named-compilezone -f raw -F text -o -  example.com /var/lib/bind/db.example.com.slave

-f raw  anger att zon-filen är i raw format.

-F text  anger att vi vill få ut filen i texte-format.

-o - utdata ska skickas till terminalen, alltså du ser texten direkt. För att sparar det till en fil byter man ut - mot ett fil namn. 

Slutligen anger vi vad zonen heter och var filen finns.

Om vi har gjort allt rätt så ska du se alla adresserna som är inlagda i domänen.

user@server02:~$ named-compilezone -f raw -F text -o -  example.com /var/lib/bind/db.example.com.slave

zone example.com/IN: loaded serial 1

example.com.                                  604800 IN SOA     ns.example.com. webmaster.example.com. 1 86000 7200 2419200 604800

example.com.                                  604800 IN NS      ns.example.com.

example.com.                                  604800 IN NS      ns2.example.com.

example.com.                                  604800 IN A       192.168.60.150

ns.example.com.                               604800 IN A       192.168.60.150

ns2.example.com.                              604800 IN A       192.168.60.151

server01.example.com.                         604800 IN A       192.168.60.150

server02.example.com.                         604800 IN A       192.168.60.151

www.example.com.                              604800 IN A       192.168.60.150

OK

user@server02:~$ 

Det ser ju helt ok ut. Nu när allt fungerar så är det dags att ändra domänservrar hos din registrar så att dina egna servrar kan börja svara på anropen. Hur man gör det beror på vem du har som registrar, därför gör du bäst i att kolla med dem.