Tuesday, April 26, 2011

Ένας DNS Server για Σχολικά Εργαστήρια - Μέρος Ι

Στη δική μου περίπτωση βέβαια, πρόκειται για δύο DNS servers. Καλό είναι να υπάρχει και ένα backup DNS, ειδικά όταν στηρίζει όλο το δίκτυο του σχολείου και όχι μόνο ένα σχολικό εργαστήριο. Αλλά ας πάρουμε τα πράγματα από την αρχή.



Σε τι χρησιμεύει ένας DNS Server; Αν ρωτήσετε ένα μαθητή της Γ' Τάξης του τομέα Πληροφορικής ΕΠΑΛ (και είστε τυχερός) θα σας πει ότι ο DNS απαντάει σε ερωτήματα του τύπου "Ποιο είναι το IP του www.freebsd.org" και "ποιος υπολογιστής έχει την διεύθυνση 10.14.28.10". Καθώς καταλαβαίνετε βέβαια δεν είναι δυνατόν ένα μηχάνημα να γνωρίζει τις διευθύνσεις όλου του διαδικτύου - αν και φυσιολογικά θα ξέρει και θα ανταποκρίνεται αυτόνομα στα ερωτήματα που αφορούν το εσωτερικό μας δίκτυο. Σε κάθε άλλη περίπτωση θα επικοινωνεί με άλλους DNS server για να ανακτήσει την απάντηση.



Σε ένα απλό οικιακό δίκτυο - και όταν δεν μας ενδιαφέρει το DNS για εσωτερικές διευθύνσεις - αρκούμαστε στο DNS Server του παροχέα. Αυτός αναλαμβάνει να επιλύσει τις ερωτήσεις μας για τα site του Internet που θα επισκεπτούμε (ρωτώντας αν χρειάζεται και άλλους DNS servers, αλλά αυτή η διαδικασία είναι διάφανη για εμάς και δεν μας αφορά). Από τη στιγμή που θα επιλέξουμε να εκτελούμε δικό μας DNS Server έχουμε άλλα πλεονεκτήματα:




  • Μπορούμε να τον χρησιμοποιήσουμε για τα μηχανήματα του εσωτερικού μας δικτύου

  • Μπορούμε να είμαστε ανεξάρτητοι από την υπηρεσία DNS του παροχέα

  • Μπορούμε να τον χρησιμοποιήσουμε για να φιλτράρουμε διευθύνσεις που είναι κακόβουλες ή απλά που δεν θέλουμε να επισκέπτονται οι χρήστες του δικτύου μας.



Ειδικά αυτή η τελευταία δυνατότητα είναι πολύ σημαντική για ένα σχολικό δίκτυο! Ας δούμε πως μπορεί να ρυθμίσουμε τον πλέον δημοφιλή DNS server, το BIND χρησιμοποιώντας το λειτουργικό σύστημα FreeBSD!

Ρύθμιση του BIND



Το BIND έρχεται ως μέρος του base system στο FreeBSD. Η ενεργοποίηση του είναι απλή υπόθεση. Στο /etc/rc.conf προσθέστε τις γραμμές:

named_enable="YES"

Το βασικό αρχείο ρυθμίσεων του BIND είναι το /etc/namedb/named.conf. Ας δούμε τι προσθήκες έχουμε κάνει σε σχέση με το αρχικό που έρχεται με το FreeBSD 8.2-RELEASE:

logging {
channel query-log {
file "/etc/namedb/logs/query-log" versions 3 size 1m;
};
category queries { query-log; };
};


Εδώ ενεργοποιούμε το logging. Έτσι γίνεται καταγραφή των διευθύνσεων που ζητούνται από τον BIND. Θα το χρειαστούμε αυτό για το φιλτράρισμα.

Αλλάζουμε τη γραμμή listen για να περιέχει και την IP διεύθυνση του server που εκτελεί το BIND (εκτός από το local loopback). O δικός μας έχει την διεύθυνση 10.14.28.10:

listen-on { 10.14.28.10; 127.0.0.1; };


Δηλώνουμε τα αρχεία που αφορούν τις ζώνες του τοπικού μας δικτύου:


zone "lab1.local" {
type master;
file "/etc/namedb/master/lab1.db";
also-notify { 10.14.28.251; };
};

zone "newlab" {
type slave;
file "/etc/namedb/slave/newlab.db";
masters {
10.14.28.251;
};
};


Όπως ανέφερα παραπάνω, διαθέτουμε δύο DNS servers και τυπικά καθένας εξυπηρετεί ένα εργαστήριο (ο πρώτος εξυπηρετεί και το υπόλοιπο σχολείο). Ο δεύτερος DNS είναι στη διεύθυνση 10.14.28.251. Για backup, καθένας από τους δύο διαθέτει και την ζώνη του άλλου. Πιστεύω ότι είναι αρκετά κατανοητός ο τρόπος που επιτυγχάνεται αυτό (hint: master, slave, masters, also-notify). Για ένα μόνο DNS server και ένα εσωτερικό domain θα αρκούσε αυτό:


zone "lab1.local" {
type master;
file "/etc/namedb/master/lab1.db";
};


Η υπόθεση μας είναι ότι το εσωτερικό μας domain ονομάζεται lab1.local και φυσικά θα χρειαστεί να φτιάξουμε το αρχείο /etc/namedb/master/lab1.db. Mοιάζει με το παρακάτω:


$TTL 3h
@ IN SOA aquarius64.lab1.local. sonicy.otenet.gr. (
2008081511 ; Serial - increment everytime something changes
1d ; Refresh
2h ; Retry
1000h ; Expire
2d ) ; Minimum

IN NS 10.14.28.10.
aquarius64 IN A 10.14.28.10
localhost IN A 127.0.0.1 ; just in case
PC1 IN A 10.14.28.11
PC2 IN A 10.14.28.12
PC3 IN A 10.14.28.13


Προσθέτουμε σε αυτό όλα τα μηχανήματα του εργαστηρίου μας. Στη συγκεκριμένη περίπτωση βέβαια έχουμε στατικές διευθύνσεις οπότε ξέρουμε ότι δεν θα γίνει κάποια αλλαγή (Ο DHCP server που επίσης εκτελείται δίνει άλλες περιοχές διευθύνσεων).

Ενεργοποίηση και Δοκιμή



Έχοντας κάνει όλα τα παραπάνω, ενεργοποιούμε το BIND:



# service named start
Starting named.


Για να χρησιμοποιεί ο server μας τον... εαυτό του ως DNS για τα δικά του ερωτήματα, βεβαιωνόμαστε ότι το /etc/resolv.conf περιέχει κάτι σαν αυτό:



domain lab1.local
nameserver 10.14.28.10
#Μπορεί να χρησιμοποιηθεί και το local loopback
#nameserver 127.0.0.1
#Αν έχουμε και άλλο DNS
#nameserver 10.14.28.251


To domain είναι προαιρετικό (αλλά χρήσιμο). Μπορείτε να δείτε περισσότερες λεπτομέρειες στο man resolv.conf. H δοκιμή είναι απλή:



$ nslookup
> www.freebsd.org
Server: 10.14.28.10
Address: 10.14.28.10#53

Non-authoritative answer:
www.freebsd.org canonical name = red.freebsd.org.
Name: red.freebsd.org
Address: 69.147.83.34
> PC1.lab1.local
Server: 10.14.28.10
Address: 10.14.28.10#53

Name: PC1.lab1.local
Address: 10.14.28.11
> exit


Το μόνο που μένει είναι να δηλώσετε το 10.14.28.10 ως DNS server σε όλα τα μηχανήματα του δικτύου σας (ή να το στείλετε μέσω DHCP αν έχετε δυναμικές διευθύνσεις). Φαντάζομαι ξέρετε πως να βάλετε DNS στα Windows ;) Για τα UNIXοειδή μηχανήματα ρυθμίστε απλώς το /etc/resolv.conf όπως παραπάνω ή χρησιμοποιήστε τον (brrrrr....) Network Manager.



Στο επόμενο άρθρο θα δούμε πως να χρησιμοποιήσουμε το DNS για φιλτράρισμα ανεπιθύμητων διευθύνσεων.



Friday, April 15, 2011

DHCP και άλλες ιστορίες!

Πριν λίγες μέρες και χωρίς καμιά προειδοποίηση, το Cisco router του σχολείου μας άφησε χρόνους. Για την ακρίβεια, έκανε το πιο εκνευριστικό πράγμα που μπορεί να κάνει μια συσκευή: άρχισε να δουλεύει εντελώς αναξιόπιστα. Και φυσικά χάλασε στη χειρότερη χρονική στιγμή, καθώς το σχολείο πλησιάζει στις εξετάσεις και διακινούνται πολλά υπηρεσιακά έγγραφα.

Μια γρήγορη κλήση στο ΠΛΗΝΕΤ προκειμένου να δούμε πόσο γρήγορα μπορούμε να κάνουμε κάτι για αυτό χωρίς να χρειαστεί να αγοράσουμε router. Ευτυχώς, μάθαμε ότι μπορούμε να χρησιμοποιήσουμε ένα κοινό router και το λογαριασμό του σχολείου για username/pass (τα Cisco προγραμματίζονται από την υπηρεσία υποστήριξης του ΠΣΔ και έχουν άλλους, άγνωστους σε μας κωδικούς). Γρήγορα εντόπισα το μικρό speedtouch που μας είχε αφήσει ο ΟΤΕ και οι ρυθμίσεις έγιναν, ουσιαστικά όμοιες με το Cisco.

Τα σχολικά routers έχουν τυπικά ενεργοποιημένο DHCP server και ορισμένες φορές αυτό δημιουργεί πρόβλημα σε μας που θέλουμε να... σκαλίσουμε το δίκτυο μας! Από την άλλη βέβαια είναι εύχρηστο να μπορεί καθένας να συνδέει ένα μηχάνημα και να μη μπλέκει με άλλες ρυθμίσεις. Το θέμα λοιπόν δεν είναι να απενεργοποιήσουμε το DHCP, αλλά να το φέρουμε στα μέτρα μας.

Ενας DHCP Server, αλλά ποιος;



Οι DHCP servers που ενσωματώνονται στα routers είναι υπερβολικά απλοί και με λίγες επιλογές. Μετά τη γρήγορη δοκιμή, αποφάσισα ότι μπορεί αυτή η λειτουργία να μεταφερθεί στο FreeBSD server μας. Έτσι θα έχουμε τα εξής πλεονεκτήματα:


  • Πολύ περισσότερες επιλογές ρυθμίσεων

  • Δυνατότητα να στείλουμε και άλλες χρήσιμες προσαρμοσμένες ρυθμίσεις (DNS, gateway κλπ)

  • Δυνατότητα αποστολή συγκεκριμένων ρυθμίσεων σε ειδικά μηχανήματα με βάση το MAC address



Τα παραπάνω είναι αρκετά εύκολα:

- Εγκαθιστούμε το port net/isc-dhcp41-server

- Χρησιμοποιούμε ένα αρχείο ρυθμίσεων όπως το παρακάτω:

option domain-name "lab1.local";
option domain-name-servers 10.14.28.10, 10.14.28.251;

default-lease-time 3600;
max-lease-time 86400;

authoritative;

ddns-update-style none;

subnet 10.14.28.0 netmask 255.255.255.0 {
range 10.14.28.129 10.14.28.250;
option routers 10.14.28.1;
}

host debian12 {
hardware ethernet 00:0e:a6:0a:d3:87;
fixed-address 10.14.28.128;
option routers 10.14.28.1;
}


To debian12 είναι σημαντικό να έχει πάντοτε την ίδια διεύθυνση. Αυτό επιτυγχάνεται με την οδηγία fixed-address και η αναγνώριση του μηχανήματος μέσω του MAC address, μέσω της oδηγίας hardware ethernet.

Το αρχείο ρυθμίσεων ορίζει δύο DNS servers, τον 10.14.28.10 και τον 10.14.28.251. Πρόκειται φυσικά για τους δύο FreeBSD servers του σχολείου που μεταξύ άλλων εκτελούν και το BIND.

Το αρχείο ρυθμίσεων αποθηκεύεται στη θέση:

/usr/local/etc/dhcpd.conf

Τα leases που παρέχει ο DHCP server μπορούμε να τα δούμε στον κατάλογο:

/var/db/dhcpd/

Το μόνο που χρειάζεται για να ενεργοποιήσουμε τον DHCP server είναι να προσθέσουμε τις παρακάτω γραμμές στο /etc/rc.conf:

dhcpd_enable="YES"
dhcpd_conf="/usr/local/etc/dhcpd.conf"
dhcpd_ifaces="ale0"


Χρησιμοποιώντας φυσικά το σωστό για την περίπτωση μας όνομα interface (εδώ βέβαια το ale0). Τέλος ενεργοποιούμε την υπηρεσία:


# service isc-dhcpd start


και συνεχίζουμε να ψάχνουμε για άλλα ενδιαφέροντα πράγματα για τα επόμενα απογεύματα μας!