Showing posts with label σχολικό εργαστήριο. Show all posts
Showing posts with label σχολικό εργαστήριο. Show all posts

Tuesday, May 3, 2011

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

Στο προηγούμενο άρθρο μας ρυθμίσαμε ένα FreeBSD Server στο ρόλο του DNS ενός σχολικού εργαστηρίου (αλλά και γενικότερα της σχολικής μονάδας). Επανερχόμαστε τώρα για να δούμε πως μπορούμε να χρησιμοποιήσουμε τις δυνατότητες που μας παρέχει για να "φιλτράρουμε" κάποιες διευθύνσεις.


Το φιλτράρισμα σε πολλές περιπτώσεις είναι επιβεβλημένο καθώς (δυστυχώς) η χρήση του Internet γίνεται γενικά χωρίς μέτρο στα σχολεία και το αποτέλεσμα είναι πλήρης απώλεια ελέγχου της κατάστασης. Ειδικά η χρήση site όπως το facebook είναι από μόνη της αρκετή για να διαταράξει κάθε εργαστηριακό μάθημα. Πέρα από αυτό βέβαια υπάρχουν και άλλα sites που ενδεχομένως θέλετε να φιλτράρετε, είτε γιατί το περιεχόμενο είναι ακατάλληλο, είτε γιατί περιέχουν κακόβουλα προγράμματα. Γενικά όμως αυτά αποτελούν μικρότερο πρόβλημα.

DNS Blackhole



Καθώς ετοιμαζόμουν να γράψω το πρώτο άρθρο, ο hakmem σε ένα tweet αναφέρθηκε σε άρθρο δημιουργίας DNS blackhole με χρήση του FreeBSD. To DNS blackhole χρησιμοποιεί το δικό μας DNS server για να "βραχυκυκλώσει" ουσιαστικά ένα site, κατευθύνοντας το προς μια ανύπαρκτη διεύθυνση ή σελίδα (π.χ. 127.0.0.1) ή σε μια σελίδα που έχουμε δημιουργήσει εμείς και εξηγεί γιατί δεν επιτρέπεται η πρόσβαση στο site. Το άρθρο είναι πολύ καλό και μπορείτε να το χρησιμοποιήσετε αυτούσιο αν θέλετε. Για τη δική μας περίπτωση ωστόσο, προτιμήσαμε να φτιάξουμε μια λύση που να υλοποιεί το DNS blackhole με βάση μια δική μας λίστα και μάλιστα να μπορεί να ανανεώνεται και κάτα κάποιο τρόπο αυτόματα.

DNS Blackhole - Απόπειρα 1



Προφανώς είναι αρκετά εύκολο να προσθέσουμε μια καταχώριση στο /etc/namedb/named.conf και να κλείσουμε ένα site όπως το facebook. Για παράδειγμα αυτό θα ήταν αρκετό:

zone "facebook.com" {
type master;
file "/etc/namedb/master/voidurls.db";
};


όπου φυσικά το /etc/namedb/master/voidurls.db θα είναι κάτι σαν το παρακάτω:

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

IN NS 10.14.28.10.
IN A 10.14.28.251
www IN A 10.14.28.251
localhost IN A 127.0.0.1 ; just in case


Στην περίπτωση μας, ο 10.14.28.251 είναι ο δεύτερος μας server και περιέχει επίσης μια σελίδα που απλά εξηγεί ότι απαγορεύεται η πρόσβαση. Το σύστημα αυτό λειτουργεί μια χαρά - φυσικά μέχρι όλοι οι μαθητές να ανακαλύψουν ότι υπάρχουν χιλιάδες site που αναλαμβάνουν να κάνουν unlock / unblock το facebook. Και είναι απλά αδύνατον να τα προσθέσουμε με το χέρι ένα-ένα. Μπορούμε όμως να χρησιμοποιήσουμε ένα απλό script το οποίο να διαβάζει το query-log του DNS, να βρίσκει τις ανεπιθύμητες διευθύνσεις και να τις προσθέτει αυτόματα. Μπορείτε να το κατεβάσετε από εδώ. Ακολουθεί μια μικρή ανάλυση.

Ένα Script για την... Μαύρη Τρύπα



Η παρακάτω γραμμή ορίζει το αρχείο καταγραφής του DNS που θα αναλύει το script:

INFILES="/etc/namedb/logs/query-log"


Αν θέλουμε περισσότερα από ένα αρχεία, μπορούμε να βάλουμε όλα τα ονόματα σε αυτή τη γραμμή, χωρισμένα με κενά. Την πρώτη φορά που θα το τρέξουμε πιθανόν έχει νόημα να αναλύσουμε όλα τα query-log που υπάρχουν ήδη.

Τα πρώτα αποτελέσματα που βγάζει το script αποθηκεύονται σε αυτό το αρχείο:

OUTFILE=/etc/namedb/logs/outfile.log


Ενώ το ταξινομημένο αρχείο εξόδου και backup:

SORTFILE=/etc/namedb/logs/sorted.log
SORTFILEBAK=/etc/namedb/logs/sorted.log.bak


Το τελικό αρχείο που παράγεται για το BIND:

ADDBLOCKFILE=/etc/namedb/addblock.conf
ADDBLOCKFILEBAK=/etc/namedb/addblock.conf.bak


To αρχείο που περιέχει τις "απαγορευμένες" λέξεις:

WORDLISTFILE=/home/sonic/blockwords


το οποίο σε μας περιέχει:

unblock
unlock
facebook
googleearth
miniclip
minigames.com


Αν θέλουμε κάποια domains να αγνοούνται ακόμα και αν περιέχουν μέσα τους τις απαγορευμένες λέξεις, τα βάζουμε εδώ και χωρίζονται με "|":

IGNORELIST="lab1.local|chan.sch.gr|.newlab|.lan"


Το αρχείο addblock.conf παράγεται μόνο αν η νέα εκτέλεση του script δημιούργησε νέα αποτελέσματα σε σχέση με την προηγούμενη. Στην περίπτωση αυτή γίνεται και η απαραίτητη επαναφόρτωση της ζώνης με την εντολή:

rndc reload


Σε κάθε περίπτωση, υπάρχει πάντα backup του προηγούμενου addblock.conf ώστε αν η ζώνη αποτύχει να φορτωθεί για κάποιο λόγο, χρησιμοποιείται το backup. Αυτό εξασφαλίζει ότι δεν θα μείνουμε χωρίς DNS.

Για να λειτουργήσει, θα βάλουμε την παρακάτω γραμμή στο τέλος του /etc/namedb/named.conf:

include "/etc/namedb/addblock.conf";


Λογικά, θα πρέπει να δημιουργήσετε μια καταχώριση στο /etc/crontab ώστε το script να εκτελείται αυτόματα σε τακτά διαστήματα (π.χ. ανά πέντε λεπτά). Αυτό δεν δημιουργεί πρόβλημα, καθώς δεν γίνεται επαναφόρτωση της ζώνης αν δεν υπάρχουν νέες καταχωρίσεις και έτσι ο DNS server λειτουργεί απρόσκοπτα. Φυσικά μπορείτε να βελτιώσετε και να τροποποιήσετε το script κατά τις ανάγκες σας.

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 για φιλτράρισμα ανεπιθύμητων διευθύνσεων.