This is an old revision of bind from 07/29/2019 21:04 edited by EvaggelosBalaskas.

View source for bind

{{anchor href="top"}}
Hits :  **{{hits}}**

== Bind - Dns :: Mini How To ==

{{ToC from="h2" to="h3"}}

=== Latest stable version 9.4.2 ===

http://www.isc.org/

http://ftp.isc.org/isc/bind9/9.4.2-P1/bind-9.4.2-P1.tar.gz

https://www.isc.org/bind/

Για chroot bind ρίξτε μια ματιά εδώ: 
https://balaskas.gr/wiki/chroot/bind

((#top))
-----------

=== Δημιουργία Χρήστη & Αρχείων ===

Δημιουργία χρήστη named
Δημιουργία group named
Δημιουργία αρχείου /etc/named.conf
Δημιουργία αρχείου /etc/rndc.conf
Δημιουργία καταλόγου /var/namedb/
Αλλαγή δικαιοδοσίας στα 
  /etc/named.conf
  /etc/rndc.conf
  /etc/namedb/
  /var/namedb/
  /var/log/bind

%%(html)
touch /etc/named.conf
touch /etc/rndc.conf
mkdir -pv /var/namedb /var/log/bind
groupadd named
useradd named -g named -d /var/namedb
chown -R named.named /etc/named.conf /etc/rndc.conf /var/namedb/ /var/log/bind
%%

==== Εγκατάσταση ====

%%(html)
$ wget -c http://ftp.isc.org/isc/bind9/9.4.2-P1/bind-9.4.2-P1.tar.gz
$ tar zxvf bind-9.4.2-P1.tar.gz
$ cd bind-9.4.2-P1
$ ./configure
$ make
$ make install (as root user)
%%

((#top))
-----------

=== rndc ===

Για να εκτελούμε διάφορα controls στην υπηρεσία named χρησιμοποιούμε το 
**rndc** 

Για να μπορούμε να εκτελούμε διαφορα controls στο bind 
μπορούμε να χρησιμοποιούμε το rndc . Για να μπορούμε να 
χρησιμοποιούμε το rndc χρειάζεται πρώτα να παράγουμε ένα κλειδί
καθώς και τις απαραίτητες ρυθμίσεις στο /etc/named.conf 


((#top))
-----------

=== rndc-confgen ===

Κατά την εγκατάσταση του named γίνεται και η εγκατάσταση του
rndcμ προγράμματος το οποίο χρησιμοποιείται για την διαχείριση
του named (και κατά συνέπεια του bind). Το λογισμικό αυτό 
χρησιμοποιώντας ένα κλειδί μπορεί και περνάει εντολές στο
named.

Για να μπορούμε να χρησιμοποιήσουμε το rndc πρέπει πρώτα να 
δημιουργήσουμε το αντίστοιχο κλειδί καθώς και να περάσουμε 
στο αρχείο conf που χρησιμοποιεί το named την απαραίτητη 
εγγραφή που δηλώνει την ύπαρξη του κλειδιού αυτού.

Η εντολή με την οποία δημιουργούμε το κλειδί αλλά και τις
ρυθμίσεις για το named είναι η εξής:

**rndc-confgen**

Ελέγχουμε τους διακόπτες για να περάσουμε παραμέτρους.

rndc-confgen --help

π.χ.
%%(html)
rndc-confgen -b 512 
%%

((#top))
-----------

=== named.conf ===

Το σημαντικότερο αρχείο στο λογισμικό dns bind είναι το αρχείο 
**/etc/named.conf**

Σε αυτό το αρχείο περιέχεται η πληροφορία μας σχετικά με τις ρυθμίσεις του bind.

Παρακάτω θα δούμε βασικές ρυθμίσεις, καθώς και πως φορτώνουμε τις νέες μας ρυθμίσεις.

** ΠΡΟΣΟΧΗ **: Μετά από κάθε αλλαγή πρέπει να τρέχουμε την παρακάτω εντολή:
%%(html)
named-checkconf
%%

((#top))
-----------

=== named ===

Πως ξεκινάμε τον dns server που έχουμε ρυθμίσει:

%%(html)
named
%%

Εάν θέλουμε να δούμε όλα τα λάθη στην οθόνη μας :
%%(html)
named -g 
%%

Εάν θέλουμε να τρέξει ο δαίμονάς μας με έναν συγκεκριμένο χρήστη,
ώστε να μεταβιβάσει τα δικαιώματα σε αυτόν π.χ. username : named

%%(html)
named -u named
%%

Εάν θέλουμε να διαβάσει με συγκεκριμένο αρχείο ρυθμίσεων :

%%(html)
named -c /etc/named.conf.new
%%

**ΠΡΟΣΟΧΗ** :  Μετά από κάθε εκτέλεση named πληκτρολογούμε:
%%(html)
rndc status
%%

ή 

%%(html)
ps -auxwww | grep named
%%

((#top))
-----------

=== Signals ==

#|

|| **Signal** | **Action** | **rndc** | **example** ||
|| HUP | Reload | rndc reload | kill -HUP `cat /var/run/named.pid` ||
|| INT | Stop | rndc dumpdb | kill -INT `cat /var/run/named.pid` ||
|| TERM | Stop | rndc stop | kill -TERM `cat /var/run/named.pid` ||

|#

((#top))
-----------

=== db.cache ===

Για να ξεκινήσουμε χρειάζεται να έχουμε κατεβάσει το αρχείο **db.cache**
στο οποίο αναφέρονται ΟΛΟΙ οι ROOT-SERVERS.

Root Dns Servers ονομάζονται γιατί αυτοί αποτελούν την ρίζα (root) ή αλλιώς "τελεία" ( . ) 
ενός domain ονόματος. Από εκεί ξεκινάμε την αναζήτηση ενός domain. Οι servers αυτοί
ορίζονται από A.ROOT-SERVERS.NET. έως Μ.ROOT-SERVERS.NET.

 Η δήλωση στο **named.conf** αρχείο γίνεται ως εξής:

%%(html)

zone "." IN {
        type hint;
        file "/var/namedb/db.cache";
};

%%

Το αρχείο **db.cache** ή αλλιώς **named.cache** ή αλλιώς **named.root** το κατεβάζουμε από το παρακάτω url:

ftp://ftp.internic.net

ή εκτελούμε την παρακάτω εντολή:

%%(html)
dig @a.root-servers.net . ns > db.cache
%%

ή το αντιγράφουμε από εδω:

%%(html)
;       This file holds the information on root name servers needed to
;       initialize cache of Internet domain name servers
;       (e.g. reference this file in the "cache  .  <file>"
;       configuration file of BIND domain name servers).
;
;       This file is made available by InterNIC 
;       under anonymous FTP as
;           file                /domain/db.cache
;           on server           FTP.INTERNIC.NET
;       -OR-                    RS.INTERNIC.NET
;
;       last update:    Dec 12, 2008
;       related version of root zone:   2008121200
;
; formerly NS.INTERNIC.NET
;
.                        3600000  IN  NS    A.ROOT-SERVERS.NET.
A.ROOT-SERVERS.NET.      3600000      A     198.41.0.4
A.ROOT-SERVERS.NET.      3600000      AAAA  2001:503:BA3E::2:30
;
; FORMERLY NS1.ISI.EDU
;
.                        3600000      NS    B.ROOT-SERVERS.NET.
B.ROOT-SERVERS.NET.      3600000      A     192.228.79.201
;
; FORMERLY C.PSI.NET
;
.                        3600000      NS    C.ROOT-SERVERS.NET.
C.ROOT-SERVERS.NET.      3600000      A     192.33.4.12
;
; FORMERLY TERP.UMD.EDU
;
.                        3600000      NS    D.ROOT-SERVERS.NET.
D.ROOT-SERVERS.NET.      3600000      A     128.8.10.90
;
; FORMERLY NS.NASA.GOV
;
.                        3600000      NS    E.ROOT-SERVERS.NET.
E.ROOT-SERVERS.NET.      3600000      A     192.203.230.10
;
; FORMERLY NS.ISC.ORG
;
.                        3600000      NS    F.ROOT-SERVERS.NET.
F.ROOT-SERVERS.NET.      3600000      A     192.5.5.241
F.ROOT-SERVERS.NET.      3600000      AAAA  2001:500:2F::F
;
; FORMERLY NS.NIC.DDN.MIL
;
.                        3600000      NS    G.ROOT-SERVERS.NET.
G.ROOT-SERVERS.NET.      3600000      A     192.112.36.4
;
; FORMERLY AOS.ARL.ARMY.MIL
;
.                        3600000      NS    H.ROOT-SERVERS.NET.
H.ROOT-SERVERS.NET.      3600000      A     128.63.2.53
H.ROOT-SERVERS.NET.      3600000      AAAA  2001:500:1::803F:235
;
; FORMERLY NIC.NORDU.NET
;
.                        3600000      NS    I.ROOT-SERVERS.NET.
I.ROOT-SERVERS.NET.      3600000      A     192.36.148.17
;
; OPERATED BY VERISIGN, INC.
;
.                        3600000      NS    J.ROOT-SERVERS.NET.
J.ROOT-SERVERS.NET.      3600000      A     192.58.128.30
J.ROOT-SERVERS.NET.      3600000      AAAA  2001:503:C27::2:30
;
; OPERATED BY RIPE NCC
;
.                        3600000      NS    K.ROOT-SERVERS.NET.
K.ROOT-SERVERS.NET.      3600000      A     193.0.14.129 
K.ROOT-SERVERS.NET.      3600000      AAAA  2001:7FD::1
;
; OPERATED BY ICANN
;
.                        3600000      NS    L.ROOT-SERVERS.NET.
L.ROOT-SERVERS.NET.      3600000      A     199.7.83.42
L.ROOT-SERVERS.NET.      3600000      AAAA  2001:500:3::42   
;
; OPERATED BY WIDE
;
.                        3600000      NS    M.ROOT-SERVERS.NET.
M.ROOT-SERVERS.NET.      3600000      A     202.12.27.33
M.ROOT-SERVERS.NET.      3600000      AAAA  2001:DC3::35
; End of File

%%

((#top))
-----------

=== Τα αρχεία μετά την εγκατάστασή μας ===

%%(html)
bind-9.4.2-P1
bind-9.4.2-P1:

/usr/local/bin/dig
/usr/local/bin/host
/usr/local/bin/isc-config.sh
/usr/local/bin/nslookup
/usr/local/bin/nsupdate
/usr/local/include/bind9/check.h
/usr/local/include/bind9/getaddresses.h
...
/usr/local/lib/libbind9.a
/usr/local/lib/libdns.a
/usr/local/lib/libisc.a
/usr/local/lib/libisccc.a
/usr/local/lib/libisccfg.a
/usr/local/lib/liblwres.a
/usr/local/sbin/dnssec-keygen
/usr/local/sbin/dnssec-signzone
/usr/local/sbin/lwresd
/usr/local/sbin/named
/usr/local/sbin/named-checkconf
/usr/local/sbin/named-checkzone
/usr/local/sbin/named-compilezone
/usr/local/sbin/rndc
/usr/local/sbin/rndc-confgen
/usr/share/man/man1/dig.1
/usr/share/man/man1/host.1
/usr/share/man/man1/nslookup.1
/usr/share/man/man3/lwres.3
/usr/share/man/man3/lwres_addr_parse.3
...
/usr/share/man/man8/named.8
/usr/share/man/man8/nsupdate.8
/usr/share/man/man8/rndc-confgen.8
/usr/share/man/man8/rndc.8

%%

((#top))
-----------

=== Example named.conf ===

%%(code)
key "rndc-key" {
        algorithm hmac-md5;
        secret "************************";
};
controls {
        inet 127.0.0.1 port 953
        allow { 127.0.0.1; } keys { "rndc-key"; };
};

zone "." IN {
        type hint;
        file "/var/named/db.cache";
};

zone "0.0.127.in-addr.arpa" IN {
        type master;
        file "/var/named/db.127.0.0";
};
%%

((#top))
-----------

=== Logging ===

Από τα σημαντικότερα πράγματα που οφείλουμε να κάνουμε σε κάθε είδος υπηρεσίας είναι η 
καταγραφή μηνυμάτων - **logging**. Αυτό μας δίνει την δυνατότητα να εξετάσουμε την λειτουργία
της υπηρεσίας μας ανά πάσα στιγμή και εάν χρειάστεί να διορθώσουμε μέρος ή ακόμα και το σύνολο
των ρυθμίσεών μας.

Το λογισμικό bind έχει έναν αρκετά καλό μηχανισμό καταγραφής μηνυμάτων. Ορίζει ως κανάλια - **channels**
τις πηγές στις οποίες θα καταλήξουν τα διάφορα μηνύματα της υπηρεσίας. Στην συνέχεια μπορούμε να 
ορίσουμε για κάθε κανάλι ξεχωριστά το είδος των μηνυμάτων καθώς και την τελική πηγή καταγραφής των
μηνυμάτων αυτών. Κανάλι μπορεί να οριστεί ένας syslog server ή ακόμα και ένα αρχείο κειμένου. Αφού 
ορίσουμε και το είδος των μηνυμάτων μπορούμε να ορίσουμε πλέον τις κατηγορίες των μηνυμάτων που θέλουμε
να καταγράφουμε και σε πιο κανάλι θέλουμε να καταγράφουμε ποια κατηγορία. Με αυτόν τον τρόπο μπορούμε
να έχουμε χωρίσει σε διαφορετικά κανάλια τα διάφορα μηνύματα που παίρνουμε από την υπηρεσία μας.

Τα είδη των μηνυμάτων ονομάζονται **severities** και ορίζονται ως εξής;

  * critical
  * error
  * warning
  * notice
  * info
  * debug [level]
  * dynamic

Τα παραπάνω severities είναι ταξινομήμένα ανάλογα με το είδος των μηνυμάτων καταγραφής, με λίγα λόγια το 
severity dynamic καταγράφει όλα των ειδών τα μηνύματα για ένα κανάλι, ενώ το severity critical μόνο τα
μηνύματα εκείνα που κάνουν την υπηρεσία του dns να λειτουργεί ή όχι.

Ένα παράδειγμα είναι το παρακάτω:

%%(code)
logging{
  channel my_log {
    file "/var/log/bind/named.log";
    severity dynamic;
    print-time yes;
    print-severity yes;
    print-category yes;
  };
%%

Στο παραπάνω παράδειγμα δηλώνουμε ότι για το κανάλι my_log θέλουμε η πηγή καταγραφής μηνυμάτων να είναι
το αρχείο /var/log/bind/named.log και να καταγράφει το είδος των μηνυμάτων με severity dynamic.
Επίσης δηλώσαμε για κάθε μήνυμα που καταγράφεται ότι θέλουμε να καταγράφεται και η ώρα, σε πιο είδος ανήκει και σε ποια κατηγορία.

Σημείωση: Χρειάζεται να προσέξουμε τι δικαιώματα έχουμε δώσει στο παραπάνω αρχείο.

Αλλά για να λειτουργήσει το παραπάνω παράδειγμα χρειάζεται και κάτι ακόμα. Πρέπει να δηλώσουμε για ποια κατηγορία μηνυμάτων θέλουμε
να γίνεται καταγραφή στο κανάλι my_log. Αυτό γίνεται με την προσθήκη της κατηγορίας. Οι **κατηγορίες** καταγραφής είναι οι εξής:

  * default
  * general
  * client
  * config
  * database
  * dnssec
  * lame-servers
  * network
  * notify
  * queries
  * resolver
  * secutiry
  * update
  * update-security
  * xfer-in
  * xfre-out

Έαν παράδειγμα είναι το εξής:

%%(code)
  category default{
    my_log;
  };
};
%%

Έτσι λοιπόν με τα παραπάνω θα καταγράφουμε για το severity dynamic και την κατηγορία default τα μηνύματα στο κανάλι my_log
το οποίο είναι το αρχείο **/var/log/bind/named.log**

((#top))
-----------

=== Forward ===

Όταν θέλουμε να κάνουμε forword τα dns queries από τον δικό μας dns server σε κάποιον άλλο τότε πολύ απλά
πρέπει να δηλώσουμε για την ζώνη αυτή σε ποιον dns server πρέπει να "αποστέλονται" τα ερωτήματα. Το παρακάτω
παράδειγμα στέλνει στον ns1.otenet.gr και ns2.otenet.gr όλα τα ερωτήματα της ζώνης otenet.gr

%%(code)
zone "otenet.gr" {
        type forward;
        forwarders { 195.170.0.1;  };
};
%%

Εάν θέλουμε να γίνεται ΜΟΝΟ forward της ζώνης τότε η παραπάνω ζώνη γράφεται ως εξής:

%%(code)
zone "otenet.gr" {
        type forward;
        forwarders { 195.170.0.1;  };
        forward only;
};
%%

((#top))
-----------

=== Stats ===

Μία από τις πιο χρήσιμες εντολές του rndc είναι η εντολή **stats**, με την οποία μπορούμε να παράγουμε
στατιστικά. Η σύνταξή της είναι αρκετά απλή:

%%(code)
# rndc stats
%%(code)

και παράγει τα στατιστικά στοιχεία στο αρχείο που έχουμε δηλώσει μέσω του named.conf αλλιώς στο αρχείο 
named.stats κάτω από τον κατάλογο που έχουμε τις ζώνες μας. Στο δικό μας παράδειγμα είναι το 
**/var/named/named.stats**

Αλλίως με την δική μας δήλωση

%%(code)
statistics-file "/var/log/bind/named.stats";
%%

μπορούμε να τροποποιήσουμε το αρχείο στο οποίο θα καταγράφονται τα στατιστικά.

((#top))
-----------

=== allow-query ===

Ο dns server που έχουμε ΔΕΝ θέλουμε να εξυπηρετεί όλον τον κόσμο. Θέλουμε να εξυπηρετεί μόνο εμάς.
Οπότε η δήλωση που πρέπει να βάλουμε στο αρχείο ρυθμίσεων /etc/named.conf είναι το **allow-query**

Η δήλωση allow-query παίρνει ως όρισμα μία ip ή ακόμα και ένα class και αποτελεί μία από τις καλύτερες λύσεις
για να "κόψουμε" κάποιον εκτός του δίκτυου μας. Η δήλωση αυτή μπορεί να μπει και να έχει καθολική σημασία
στην directive options ή σε μία συγκεκριμένη ζώνη ή ακόμα σε ένα view.

Παραδείγματα χρήσης είναι τα παρακάτω:

%%(code)
allow-query { 192.168.1.1; };
%%

ή 

%%(code)
allow-query { 192.168.1/24; };
%%

Ένα τυπικό μήνυμα λάθους είναι το εξής:
> host 127.0.0.13 192.168.1.1
Host 13.0.0.127.in-addr.arpa not found: 5(REFUSED)

Ενώ στον server μας :
># 29-May-2007 22:08:58.711 security: info: client 192.168.1.2#33111: query '13.0.0.127.in-addr.arpa/PTR/IN' denied

((#top))
-----------

=== urls ===

Ίσως το καλύτερο site για dns

http://www.zytrax.com/books/dns/

Bind 9.4 Manual

http://www.isc.org/sw/bind/arm94/index.php

((#top))
-----------

==== Troubleshooting ====

This section contains commands for simple troubleshooting for dns.

%%(bash)
dig any +short ebalaskas.gr
dig any +trace ebalaskas.gr
host -t ns ebalaskas.gr
host -t mx ebalaskas.gr
host -t soa ebalaskas.gr
%%

((#top))
-----------