====== 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 μας βλ. [[el:linux:debian:server:security#pg | Ασφάλεια - fail2ban]] ===== Δοκιμές ===== Δοκιμές για ορθές ρυθμίσεις dns μπορούν να γίνουν εδώ : * http://www.squish.net/dnscheck/ * dyndns: http://dnscog.com/ ===== 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 ===== Πηγές ===== * howtos * http://www.langfeldt.net/DNS-HOWTO/BIND-9/DNS-HOWTO-3.html#ss3.1 * Έλεγχος : * https://intodns.com/weballdesign.gr * http://dnsviz.net * http://www.squish.net/dnscheck/ * dyndns: http://dnscog.com * robtex : http://www.robtex.com/dns/weballdesign.gr.html#analysis * http://www.dnsvalidation.com/ * dns propagation : * https://dnschecker.org/#A/www.weballdesign.gr * https://www.whatsmydns.net/#NS/weballdesign.gr * Various checks * https://check-host.net/ip-info?host=www.weballdesign.gr * Ασφάλεια : * http://www.howtoforge.com/perfect_setup_debian_etch_p4 * dns poisoning : http://www.scmagazineus.com/The-importance-of-recursive-DNS/article/109219/ * allow query : http://support.menandmice.com/jforum/posts/list/25.page * dnssec : http://wiki.debian.org/DNSSEC * Overview, terminology, tools, troobleshooting * http://www.more.net/technical/dns/dns2.html * Ρύθμιση : http://www.linux-noob.com/forums/lofiversion/index.php/t2872.html * Ρύθμισεις slave, ddns : http://www.howtoforge.com/debian_dns * Επιλογές : * http://www.isc.org/sw/bind/arm94/Bv9ARM.ch06.html * http://www.zytrax.com/books/dns/ch8/soa.html * Alias zone : http://www.experts-exchange.com/Networking/Linux_Networking/Q_22101790.html * DNS Proper setup for email : http://bind8nt.meiway.com/itsaDNSmess.cfm * Load balancing * with rrset order : http://felipecruz.com/blog_load-balance-round-robin-dns.php * with srv records : http://www.zytrax.com/books/dns/ch8/srv.html * dynamic dns - dns update * http://andrwe.org/linux/own-ddns * http://linux.yyz.us/nsupdate/ * http://linux.yyz.us/dns/ddns-server.html * Port Name Resolution * http://zytrax.com/books/dns/ch8/srv.html