Managed ad

Administrera DNS med Puppet

Av Pontus, 28 augusti, 2015

Här kommer vi nu att installera och administrera en master- och en slavserver för mitt lokala nätverk, fast principen är densamma för publika dns-servrar. 

Först måste vi ha en server som är installerad och konfigurerad som Puppetmaster, samt två servrar som ska agera DNS-server. Så om du inte har två servrar tillgängliga så är det dags att varva upp två (virtuella) maskiner.

På puppetmastern installerar vi modulen för att administrera Bind. Problemet med den här modulen är att den inte är anpassad till Ubuntu utan utgår ifrån Redhat. Jag har därför gjort en fork av den som jag ska försöka publicera en dag. Så tills dess så fungerar den här guiden bara för mig själv :S

$ sudo puppet module install thias-bind
Notice: Preparing to install into /etc/puppet/modules ...
Notice: Downloading from https://forgeapi.puppetlabs.com ...
Notice: Installing -- do not interrupt ...
/etc/puppet/modules
└── thias-bind (v0.5.1)

För att föra över zonerna till noderna så måste vi se till så att filservern i Puppet mastern är rätt konfigurerad. Först ser vi till att katalogen files är definierad i /etc/puppet/fileserver.com

$sudo joe /etc/puppet/fileserver.conf

I den filen ser vi till att följande text finns med.

[files]
 path /etc/puppet/files
 allow *

Då kommer katalogen files att delas så att alla kommer åt den. Vi kommer dock att begränsa tillgången i och med ändringarna i auth.conf

$ sudo joe /etc/auth.conf

Här lägger vi till följande.


path ~ ^/file_(metadata|content)/files/
auth yes
allow /^(.+\.)?example.com$/
allow_ip 192.168.1.0/24
 

Bakgrunden är någon bugg som det går att läsa mer om här

Modulen installerad så är det dags att lägga in classen på noden för den första servern som ska bli mastern. Det här gör vi alltså i vår manifest.

$ sudo joe /etc/puppet/environments/production/manifest/ns01.pp

I manifesten skriver vi 

        include  bind

       bind::server::conf { '/etc/bind/named.conf':
               directory           => '/etc/bind',
               listen_on_addr    => [ 'any' ],
               listen_on_v6_addr => [ 'any' ],
               allow_query       => [ 'localnets' ],
               recursion           => 'yes',    
               allow_recursion   => [ '192.168.1.0/24', '192.168.2.0/24', ],
               zones             => {   
                       'example.com' =>
                       [
                               'type master',
                               'file "db.example.com"',  
                       ],
                       '1.168.192.in-addr.arpa' =>
                       [
                               'type master',
                               'file "db.1.168.192.in-addr.arpa"',
                       ],
               },
       }

Inga större konstigheter med den inställningarna, om man kan Bind så förstår man vad de mesta inställningarna gör.

Under zones ställer man inte vilka zoner som serverna ansvarar för, vi har dock inte lagt in några filer som innehåller datan än, de kommer här.

        bind::server::file { 'db.zones.rfc1918':
               source => 'puppet:///files/dns/db.zones.rfc1918',
               zonedir => '/etc/bind/',
       }

        bind::server::file { 'db.empty':         
               source => 'puppet:///files/dns/db.empty',         
               zonedir => '/etc/bind/',
       }

       bind::server::file { 'db.root':
               source => 'puppet:///files/dns/db.root',
               zonedir => '/etc/bind/',
       }

       bind::server::file { 'db.example.com':
               source => 'puppet:///files/dns/db.example.com',
               zonedir => '/etc/bind/',
       }

       bind::server::file { 'db.1.168.192.in-addr.arpa':
               source => 'puppet:///files/dns/db.1.168.192.in-addr.arpa',
               zonedir => '/etc/bind/',
       }

VI anger altså här var någonstans på puppet mastern som noden kan hämta filerna som vi definierade i bind::server::config. Förutom de tre första filerna som kan behöva en liten förklaring.

db.zones.rfc1918 är definitonen av tomma zoner för de privata ip-nummerna. Modulen som jag utgick ifrån la automatisk till den definitionen, jag fick dock ändra sökvägarna för filerna, när man aktiverade recursion. Det anses nämligen som god praxis att ha de zonerna definierade med tomma filer för att inte skicka vidare frågor om ip-nummer som inte skall finnas på internet. Sedan definierar vi zonerna för de ip-områdena som vi anvädner och de ska då ta över.

Db.empty är den tomma zonfilen som db.zones.rfc1918 hänvisar till. 

db.root är filen som innehåller root-servarna på internet.

De här tre filerna kopierar du sedan till /etc/puppet/files/ från en Ubuntu maskin med Bind installerat.

Två sista filerna är helt vanliga zon-filer från Bind. När det ska göras några ändringar i domänen i framtiden så är det alltså de här filerna som ändras och som automatiskt kommer att skickas ut till servern.

 

 

Managed ad