LinuxFanClub Wiki

Υπηρεσίες, Προγραμματισμός, Εκπαίδευση ..

User Tools

Site Tools


el:linux:debian:server:dns

BIND dns - Εξυπηρετητήτης ονομάτων περιοχών

Εγκατάσταση

Θα εγκαταστήσουμε την έκδοση 9 του bind dns server

aptitude install bind9

Ρύθμιση

Όλα τα αρχεία ρυθμίσεων βρίσκονται στον κατάλογο /etc/bind.

Μετά το τέλος των αλλαγών επανεκκινούμε τον εξυπηρετητή DNS με την εντολή

/etc/init.d/bind9 restart

Γενικές Επιλογές

Θα ξεκινήσουμε ρυθμίζοντας το αρχείο επιλογών named.conf.options

options {
      directory "/var/cache/bind";
      listen-on { 213.111.111.111;}; 
      listen-on port 53 { any; };
      #also-notify {213.222.222.222;};
      forwarders { 192.168.1.254; 213.142.128.1; 213.142.128.2;};
      lame-ttl 60;
      max-ncache-ttl 60;
      auth-nxdomain no;    # conform to RFC1035
      listen-on-v6 { any; };
};
  • listen-on { 213.111.111.111;}; βάζουμε την σταθερή ip του υπολογιστη μας στο internet.
  • listen-on port 53 { any; }; Ώστε να δέχεται αιτήσεις από οποιονδήποτε υπολογιστή στο internet
  • also-notify {213.222.222.222;}; Βάζουμε την ip του slave server όπως θα δούμε αργότερα. Προσωρινά σε σχόλια
  • forwarders { 192.168.1.254; ..}; Ζητάει από τους dns 192.168.1.254 .. πληροφορίες για domains που δεν γνωρίζει
  • lame-ttl 60; Σε περίπτωση που κάποιος forwarder dns δεν αποκρίνεται, μετά από 60 δευτερολευπτα θεωρεί ότι ίσως δουλεύει και τον ξαναρωτάει
  • max-ncache-ttl 60; Εάν λάβει αρνητική απάντηση για κάποιο domain, εάν ξαναερωτηθεί πάλι για το ίδιο μετά από 60 δευτερόλεπτα θα ξαναπροσπαθήσει να λάβει απάντησει από τους forwarders

Οι δύο τελευταίες επιλογές είναι μόνο για ειδικές περιπτώσεις. Π.χ. έχουμε ένας dns σε ένα Ασύρματο Μητροπολιτικό Δίκτυο, ο οποίος εξυπηρετεί domains στο εσωτερικό ασύρματο δίκτυο αλλά και στο Internet. Εάν αποτύχει λόγω κακής σύνδεσης η επίλυση ενός dns στο εσωτερικό ασύρματο δίκτυο, θέλουμε μετά από ένα μικρό χρονικό διάστημα (π.χ. 60 δευτερόλεπτα) να ξαναπροσπαθήσει να λάβει απάντησει και να διαγράψει αρνητική πληροφορία από την cache.

Ζώνες

Αρχικά θα ορίσουμε τις ζώνες μας (περιοχές domain) στο αρχείο named.conf.local. Για παράδειγμα

zone "mydomain.gr" { type master;
#      allow-transfer { key rndc-key; };
#      notify yes;
      notify no;
      file "/etc/bind/zones/mydomain.gr.hosts"; };
zone "213.in-addr.arpa" { type master;
#     allow-transfer { key rndc-key; };
#     notify yes;
      notify no;
      file "/etc/bind/zones/rev.213.in-addr.arpa"; };
#server 213.222.222.222 {
#      keys { rndc-key; };
#      };
#key rndc-key {
#      algorithm hmac-md5;
#      secret "yoursecretkey";
#      };
#controls {
#    inet 127.0.0.1 port 953 allow { 127.0.0.1; 213.222.222.222; } keys { rndc-key; };
#        };

Τα κομμάτια που είναι σε σχόλια, θα τα χρησιμοποιήσουμε στην συνέχεια όταν θα ρυθμίζουμε και έναν slave server με ip 213.222.222.222

Στο αρχείο αυτό έχουμε ορίσει μία ζώνη mydomain.gr και την reverse 213.in-addr.arpa.

Δημιουργούμε έναν φάκελο zones

mkdir /etc/bind/zones

Στην συνέχεια το αρχείο /etc/bind/zones/mydomain.gr.hosts

$ttl 60
mydomain.gr.        IN      SOA     ns1.mydomain.gr root.mydomain.gr. (
                      2000012619
                      60s ; ref
                      3m ; ret
                      2w ; exp
                      60s ) ; default ttl
mydomain.gr. IN  NS    ns1.mydomain.gr.
server1.mydomain.gr.   IN      A       213.111.111.111
server2.mydomain.gr.    IN      A       213.222.222.222
www.mydomain.gr.    IN      CNAME   server1
ftp.mydomain.gr.    IN      CNAME   www
ns1.mydomain.gr.    IN      CNAME   server1
ns2.mydomain.gr.    IN      CNAME   server2

Βλέπουμε εδώ ότι μπορούμε να δημιουργήσουμε συνώνυμο σε συνώνυμο (ftp → www, όταν το www → server1)

Και το αρχείο /etc/bind/zones/rev.213.in-addr.arpa

$TTL    60
@       IN      SOA     ns1.mydomain.gr root.mydomain.gr. (
                      12
                      60s ; ref
                      3m ; ret
                      2w ; exp
                      60s ) ; default ttl
NS    ns1.mydomain.gr
213.111.111.111      IN      PTR     root.mydomain.gr.
213.111.111.111      IN      PTR     server1.mydomain.gr.
213.111.111.111      IN      PTR     ns1.mydomain.gr.
213.222.222.222      IN      PTR     server2.mydomain.gr.
213.222.222.222      IN      PTR     ns2..mydomain.gr.
213.222.222.222      IN      PTR     www..mydomain.gr.
213.222.222.222      IN      PTR     ftp..mydomain.gr.

Δοκιμές

Προσοχή σε κάθε αλλαγή εγγραφής να αυξάνουμε κατά ένα το serial number στον primary dns ειδικά όταν έχουμε και slave dns, αλλιώς μπορεί να προκύψουν προβλήματα.

Πριν αποθηκεύσουμε τις αλλαγές θα πρέπει να ελέγχουμε την εγκυρότητα του αρχείο της ζώνης. Π.χ.

cd /etc/bind/
named-checkzone mydomain.gr mydomain.gr.hosts

Το ίδιο και για αλλαγές στο configuration αρχείο (με χρήση της named-checkconf)

Δυναμικές αλλαγές

Μειώνοντας τις τιμές refresh, retry και maximum/minimum expire μπορούμε να έχουμε την δυνατότητα να κάνουμε αλλαγές σε ip και σε εγγραφές και οι υπόλοιποι dns στο internet να ενημερώνονται άμεσα στον χρόνο που έχουμε ορίσει. Κάτι τέτοιο έχουν στις ρυθμίσεις τους και οι δυναμικοί dns π.χ. στο dyndns. Βέβαια όσο περισσότερες εγγραφές έχουμε και κίνηση στα domains αυτά, τόσο αυξάνεται και η κίνηση στον dns μας.

Ρυθμίσεις master/slave DNS servers

Δημιουργούμε ένα κλειδί

Στο αρχείο /etc/bind/rndc.key (και των 2 servers) εισάγουμε στο “yoursecretkey” το δικό μας κλειδί

key "rndc-key" {
      algorithm hmac-md5;
      secret "yoursecretkey";
};

Στον master server στο αρχείο /etc/bind/named.conf.local εισάγουμε στο τέλος τις γραμμές

server 213.222.222.222 {
      keys { rndc-key; };
      };
key rndc-key {
      algorithm hmac-md5;
      secret "yoursecretkey";
};
controls {
    inet 127.0.0.1 port 953 allow { 127.0.0.1; 213.222.222.222; } keys { rndc-key; };
          };

Η ip 213.222.222.222 είναι του slave server από τον οποίο ορίζουμε να επιτρέπονται συνδέσεις. Αντίστοιχα λοιπόν στο ίδιο αρχείο στον slave server θα βάλουμε την ip του master 213.111.111.111 ώστε και ο slave να επιτρέπει συνδέσεις στον master. Στο αρχείο /etc/bind/named.conf.options στον master server προσθέτουμε

also-notify {213.222.222.222;};

Στο αρχείο /etc/bind/named.conf.options στον slave server προσθέτουμε

     allow-transfer { 213.111.111.111;};
     allow-notify {213.111.111.111;};
     min-refresh-time 60;
     max-refresh-time 3600;
     min-retry-time 300;
     max-retry-time 86400;

Στο ίδιο αρχείο στον master server, στο κομμάτι που ορίζουμε τις ζώνες, τροποποιούμε το notify no; σε notify yes; και προσθέτουμε allow-transfer { key rndc-key; }; σε κάθε ζώνη που έχουμε master και slave εξυπηρετητές. π.χ.

zone "mydomain.gr" { type master;
      allow-transfer { key rndc-key; };
      notify yes;
      file "/etc/bind/zones/mydomain.gr.hosts"; };

Στο αρχείο αυτό στην μεριά του slave

zone "mydomain.gr" {
      type slave;
      masters {213.111.111.111; };
      file "/var/cache/bind/mydomain.gr.hosts";
      };

Το αρχείο /var/cache/bind/mydomain.gr.hosts από την μεριά του slave θα αλλάζει δυναμικά και μοιάζει κάπως έτσι

$ORIGIN .
$TTL 60 ; 1 minute
mydomain.gr         IN SOA  ns1.mydomain.gr.mydomain.gr. root.mydomain.gr. (
                              2000012619 ; serial
                      60s ; ref
                      3m ; ret
                      2w ; exp
                      60s ) ; default ttl
                      )
                      NS      ns1.mydomain.gr.
$ORIGIN mydomain.gr.
ftp                     CNAME   www
ns1                     CNAME   server1
ns2                     CNAME   server2
server1                 A       213.111.111.111
server2                 A       213.222.222.222
www                     CNAME   server1

Η εντολή ανανέωσης, ( που εκτελείται τακτικά αλλά και κατά την εκκίνηση του slave server είναι

rndc reload mydomain.gr.

mx records

Στην προσπάθεια βελτίωσης του dns server για χρήση mail server και μετά από έλεγχο mail.mydomain.gr τύπου mx στο http://www.squish.net/dnscheck/ εμφανίστηκε πρόβλημα ότι το cname server1 και server2 του myserver.gr στα οποία καταλήγουν τα mail.mydomain.gr δεν έχουν mx records.

Μετά από αυτό πρόσθεσα τις παρακάτω γραμμές στην βασική ζώνη του dns server (π.χ. myserver.gr)

server2                      MX      10 213.111.111.111
server2                      MX      20 213.222.222.222
server1                      MX      10 213.222.222.222
server1                      MX      20 213.111.111.111

Ο έλεγχος στο http://www.squish.net/dnscheck πέρασε με επιτυχία. Μένει να δούμε εάν τα προσωρινά mail refferals προς π.χ. yahoo θα σταματήσουν

Ασφάλεια

chrooted εκτέλεση

Είναι βασικό να εκτελούμε τον DNS εξυπηρετητή μας με ασφάλεια καθώς είναι από τους πρώτους στόχους επίδοξων εισβολέων όταν εμφανίζονται κενά ασφαλείας. Για το λόγο αυτό θα τον εκτελέσουμε με την τεχνική chrooted με την οποία εκτελείται μέσα στον υποφάκελο /var/lib/named χωρίς να έχει την δυνατότητα πρόσβασης σε άλλους φακέλους.

Σταματάμε λοιπόν τον εξυπηρετητή

/etc/init.d/bind9 stop

Τροποποιούμε το αρχείο /etc/default/bind9 ώστε να γίνει

OPTIONS="-u bind -t /var/lib/named"
# Set RESOLVCONF=no to not run resolvconf
RESOLVCONF=yes

Δημιουργούμε τους κατάλληλους φακέλους κάτω από τον φάκελο /var/lib:

mkdir -p /var/lib/named/etc
mkdir /var/lib/named/dev
mkdir -p /var/lib/named/var/cache/bind
mkdir -p /var/lib/named/var/run/bind/run

Στην συνέχεια μεταφέρουμε τον φάκελο ρυθμίσεων από /etc σε /var/lib/named/etc:

mv /etc/bind /var/lib/named/etc

Δημιουργούμε έναν συμβολικό σύνδεσμο από τον νέο φάκελο ρυθμίσεων στην παλιά τοποθεσία ώστε να βρει το σύστημα κανονικά τον φάκελο /etc/bind όταν χρειαστεί να γίνει αναβάθμιση, αλλά και γενικότερα:

ln -s /var/lib/named/etc/bind /etc/bind

Δημιουργούμε null και random συσκευές, και τροποποιούμε τα δικαιώματα :

mknod /var/lib/named/dev/null c 1 3
mknod /var/lib/named/dev/random c 1 8
chmod 666 /var/lib/named/dev/null /var/lib/named/dev/random
chown -R bind:bind /var/lib/named/var/*
chown -R bind:bind /var/lib/named/etc/bind

Τέλος τροποποιούμε το /etc/default/syslogd ώστε να μπορούμε ακόμα να λαμβάνουμε τα συμαντικά μηνύματα που καταγράφονται εκεί. Τροποποιούμε την γραμμή : SYSLOGD=“” ώστε να διαβάζει : SYSLOGD=“-a /var/lib/named/dev/log”:

#
# Top configuration file for syslogd
# For remote UDP logging use SYSLOGD="-r"
#
SYSLOGD="-a /var/lib/named/dev/log"

Επανεκκινούμε τον δαίμονα καταγραφής:

/etc/init.d/sysklogd restart

Τέλος εκκινούμε πάλι τον DNS εξυπηρετητή

/etc/init.d/bind9 start

Ελέγχουμε το αρχείο /var/log/syslog για τυχόν λάθη εάν κάτι δεν πήγε καλά

tail -f /var/log/syslog

allow query

Ο dns εξυπηρετητής μας δεν θα πρέπει να δέχεται αιτήσεις από άγνωστους υπολογιστές για domains που δεν εξυπηρετεί. Για να το ρυθμίσουμε αυτό τροποποιούμε το αρχείο /etc/bind/named.conf.option, προσθέτωντας τα εξής στην αρχή του:

acl "trusted" {
      192.168.0.0/16;
      62.33.44.55; //a trusted static ip
      localhost;
      localnets;                                                                                            };
}

Στην συνέχεια στο αρχείο /etc/bind/named.conf.options προσθέτουμε

allow-query { any; };
allow-recursion { trusted; };
allow-query-cache { trusted; };

Προσοχή η τελευταία γραμμή υποστηρίζεται από την έκδοση 9.4 και μετά

Πρόληψη επιθέσεων DOS

Με το πακέτο fail2ban μπορούμε να προλάβουμε επιθέσεις DOS στον dns server μας βλ. Ασφάλεια - fail2ban

Δοκιμές

Δοκιμές για ορθές ρυθμίσεις dns μπορούν να γίνουν εδώ :

logs

Από τα logs βρέθηκαν προσπάθειες zone transfer (όπως θα έκανε ο client dns) από την διεύθυνση 193.0.0.63

whois 193.0.0.63
% Information related to '193.0.0.63 - 193.0.0.63'
inetnum:        193.0.0.63 - 193.0.0.63
netname:        RIPE-NCC
descr:          RIPE Network Coordination Centre
descr:          Amsterdam, Netherlands
remarks:        ======================================================
remarks:        from the hostcount FAQ on http://www.ripe.net/info/stats/hostcount/faq.html
remarks:	3. Why are you trying to do a zone transfer from my domain?
remarks:
remarks:	The zone transfer is an integral part of performing
remarks:	the RIPE NCC Region Hostcount. It is performed once at
remarks:	the end of each month for the purpose of generating
remarks:	summary statistics about the growth of the Internet.
remarks:
remarks:	The RIPE NCC apologises for any concern that may have
remarks:	been caused by an unexpected attempt at a zone
remarks:	transfer. We would be extremely grateful if you would
remarks:	enable zone transfers for requests originating from
remarks:	the address range 193.0.0.0/22.
remarks:
remarks:	If you have further questions or concerns, please
remarks:	contact: hostcount@ripe.net
remarks:        ======================================================

Απ ότι φαίνεται δεν υπάρχει κάτι ύποπτο. Πάντως τα zone transfers για master zones μεταφέρθηκαν χωρίς πρόβλημα, ενώ οι μεταφορές slave zones απέτυχαν. (Ίσως θα πρέπει να ελεγχθεί η ασφάλεια ώστε να μην μεταφέρεται καμία..)

Θύρες

Εάν είμαστε πίσω από κάποιον router/firewall Θα πρέπει να έχουμε ανοίξει τις θύρες

  • 53/TCP και UDP για τον dns server
  • 953/TCP και UDP για την χρήση rndc μεταξύ του primary και του secondary server

Πηγές

el/linux/debian/server/dns.txt · Last modified: Y/m/d H:i by vagk