Θα εγκαταστήσουμε την έκδοση 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; }; };
Οι δύο τελευταίες επιλογές είναι μόνο για ειδικές περιπτώσεις. Π.χ. έχουμε ένας 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 μας.
Δημιουργούμε ένα κλειδί
Στο αρχείο /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.
Στην προσπάθεια βελτίωσης του 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 θα σταματήσουν
Είναι βασικό να εκτελούμε τον 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
Ο 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 και μετά
Με το πακέτο fail2ban μπορούμε να προλάβουμε επιθέσεις DOS στον dns server μας βλ. Ασφάλεια - fail2ban
Δοκιμές για ορθές ρυθμίσεις dns μπορούν να γίνουν εδώ :
Από τα 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 Θα πρέπει να έχουμε ανοίξει τις θύρες