Sunday, October 23, 2011

Αναβάθμιση σε FreeBSD 9.0-RC1

Σήμερα το πρωί, το 9.0-RC1 έγινε διαθέσιμο μέσω του freebsd-update. Υπάρχουν όμως συγκεκριμένες οδηγίες, καθώς το ίδιο το πρόγραμμα freebsd-update χρειάζεται αλλαγές για να λειτουργήσει με το νέο packaging του FreeBSD 9.0. Μπορείτε να διαβάσετε την πλήρη ανακοίνωση εδώ. Ξεκίνησα λοιπόν την αναβάθμιση του pegasus, ενός από τα βασικά μου desktop μηχανήματα με (ευτυχώς) επαρκή επεξεργαστική ισχύ.

Προετοιμασία


Ο pegasus χρησιμοποιούσε 8.2-RELEASE-p4 64bit. Πριν την εκκίνηση του upgrade αποφάσισα να σβήσω όλα τα πακέτα - μετά από μια αναβάθμιση σε major έκδοση συνήθως απαιτείται να γίνουν rebuild τα πάντα (το γνωστό portupgrade -af το οποίο αλλάζει το κλίμα του πλανήτη). Αντί για αυτό - και καθώς τα πακέτα ήταν ήδη παλιά - αποφάσισα να τα σβήσω όλα και να βάλω νέα μετά την αναβάθμιση.

Το σβήσιμο των πακέτων μπορεί να γίνει με pkg_delete -a αλλά αυτό αργεί. Τη στιγμή που θέλουμε να τα σβήσουμε όλα, είναι προτιμότερο να διαγράψουμε όλο το /usr/local (αφού κρατήσουμε backup το /usr/local/etc) και να διαγράψουμε επίσης τα περιεχόμενα του /var/db/pkg. Όλα (σχεδόν) τα ports εγκαθιστούνται στο /usr/local και τους υποκαταλόγους του, οπότε αυτή είναι μια γρήγορη μέθοδος να τα... ξεφορτωθούμε. Μια εξαίρεση είναι το linux_base το οποίο αν το έχετε εγκατεστημένο, καλό θα είναι να το βγάλετε με τον παραδοσιακό τρόπο (pkg_delete) πριν συνεχίσετε.

Αν χρησιμοποιείται σαν default shell το bash, μη ξεχάσετε να το αλλάξετε σε ένα από τα shell που ανήκουν στο βασικό σύστημα (π.χ. csh):

chsh -s csh
Password:


Κάντε logout - login για να ενεργοποιηθεί. Έπειτα σβήστε τα πάντα αφού κρατήσετε backup το /usr/local/etc. Εννοείται φυσικά ότι θα κλείσετε το γραφικό περιβάλλον και τα προγράμματα που χρησιμοποιείτε πριν αρχίσετε το σβήσιμο!

# cd /usr/
# mv local/etc .
# rm -rf local
# mkdir local
# mv etc local
# cd /var/db
# rm -rf pkg
# mkdir pkg


Αυτό ήταν! Εκτελώντας pkg_info θα διαπιστώσετε ότι δεν έχετε κανένα εγκατεστημένο πακέτο. Μπορείτε τώρα να συνεχίσετε με το upgrade.

Το upgrade


Κάνουμε πρώτα την ενημέρωση του freebsd-update όπως αναγράφεται στο announcement:

# sed -i '' -e 's/=_/=%@_/' /usr/sbin/freebsd-update

και έπειτα εκτελούμε:

# freebsd-update -r 9.0-RC1 upgrade

Διαβάζουμε τα μηνύματα, εκτελούμε το merge των αρχείων όπου ζητείται και εκτελούμε:

# freebsd-update install

Κάνουμε επανεκκίνηση με το νέο πυρήνα (αν χρησιμοποιούσατε custom πυρήνα, βεβαιωθείτε ότι έχετε βάλει κατάλληλα αρθρώματα στο /boot/loader.conf για να λειτουργήσετε με το GENERIC), και εκτελούμε ξανά:

# freebsd-update install

Με αυτό το δεύτερο install γίνεται η εγκατάσταση του userland. Αν σας ζητήσει να κάνετε rebuild όλα τα ports και να το ξανατρέξετε, μπορείτε να το κάνετε απευθείας. Μη ξεχνάτε, δεν έχετε ports εγκατεστημένα!

# freebsd-update install

Εγκατάσταση του Source


Λόγω της αλλαγής packaging στο FreeBSD 9.0, το freebsd-update δεν αναβαθμίζει τον πηγαίο κώδικα στο /usr/src αν τον έχετε εγκατεστημένο (και φυσικά τον έχετε, γιατί δεν νοείται FreeBSD χωρίς source). Αντίθετα, τον σβήνει! Ελέγξτε αν έχει μείνει κάτι μέσα στο /usr/src που χρειάζεστε ή έχετε αλλάξει (κάποιο ξεχασμένο kernel configuration file ίσως; Είναι κακή ιδέα να τα αποθηκεύετε εκεί). Διαγράψτε τυχόν υπολείμματα και πάμε να εγκαταστήσουμε το νέο source:

# cd /usr
# rm -rf src
# mkdir src
# cd src
# fetch ftp://ftp.otenet.gr/pub/FreeBSD/releases/amd64/amd64/9.0-RC1/src.txz
# cd /
# tar xvpzf /usr/src/src.txz
# rm /usr/src/src.txz


Αυτό ήταν. Μπορείτε τώρα να δημιουργήσετε ξανά προσαρμοσμένο πυρήνα και να αρχίσετε να εγκαθιστάτε ξανά τις εφαρμογές σας. Καλό απόγευμα (και ξενύχτι) :)

Friday, October 21, 2011

Ελληνικά στην Κονσόλα του FreeBSD 9.X

Αν δεν το καταλάβατε από το προηγούμενο post μας, θα το καταλάβετε μόλις δοκιμάσετε μια εγκατάσταση του FreeBSD 9 (RC1 αυτή τη στιγμή). Το νέο bsdinstall παραλείπει κάποια βήματα ρυθμίσεων που υπήρχαν στο sysinstall. Μια "παρενέργεια" που δημιουργείται είναι να μην μπορούμε να γράψουμε Ελληνικά στην κονσόλα μας. Να θιυμίσουμε εδώ ότι για να γράψετε Ελληνικά στην κονσόλα θα πρέπει να ρυθμίσετε την κωδικοποίηση σε ISO8859-7. Αν σκοπεύετε να χρησιμοποιήσετε το σύστημα σας μόνο μέσα από X (ή έστω μέσω ssh από xterm) δεν χρειάζεστε τίποτα από τα παρακάτω και είναι καλύτερα να ρυθμίσετε την κωδικοποίηση σε UTF-8.

Αρχικές Ρυθμίσεις


Αν κατά τη διάρκεια της εγκατάστασης επιλέξατε το Ελληνικό πληκτρολόγιο των 101 πλήκτρων, θα έχετε την παρακάτω γραμμή στο /etc/rc.conf:

keymap="gr.us101.acc"

Καθώς καταλαβαίνετε το παραπάνω από μόνο του δεν επαρκεί για να έχετε Ελληνικά. Χρειάζεστε ακόμα τα παρακάτω:
  • Fonts που να μπορούν να δείξουν Ελληνικά στην κονσόλα. Το sysinstall είχε την αντίστοιχη ερώτηση, το bsdinstall όχι.
  • Terminal type στο /etc/ttys κατάλληλο για Ελληνικά. Είναι το cons25l7. Προσέξτε, είναι το Αγγλικό γράμμα "l" και όχι ο αριθμός "1". Και εδώ, το sysinstall είχε την αντίστοιχη ερώτηση και έκανε τη ρύθμιση, το bsdinstall όχι.
  • Να θέσετε τη μεταβλητή περιβάλλοντος LANG σε el_GR.ISO8859-7. Αυτή είναι μια ρύθμιση που πρέπει να κάνετε στα αρχεία ρυθμίσεων του κελύφους σας. Το σημείο αυτό δεν αλλάζει από πριν.

Ρυθμίσεις Fonts


Το sysinstall υπάρχει ακόμα στο βασικό σύστημα! Αν θέλετε μπορείτε να το εκτελέσετε ως root και να επιλέξετε configure - console - font και ISO8859-7. Αλλά δεν χρειάζεται να το κάνετε στα αλήθεια. Απλά προσθέστε τις παρακάτω γραμμές στο /etc/rc.conf:

font8x8="iso07-8x8"
font8x14="iso07-8x14"
font8x16="iso07-8x16"


Terminal Type


Ίσως σκεφτείτε να εκτελέσετε το sysinstall και να επιλέξετε το terminal type. Μην το κάνετε, γιατί αν και το sysinstall δεν θα διαμαρτυρηθεί, δεν πρόκειται να αλλάξει το /etc/ttys. Θα πρέπει να το επεξεργαστείτε χειροκίνητα και να αλλάξετε το xterm με cons25l7. Θα πρέπει να κάνετε την αλλαγή στο ttyv0 και σε οποιαδήποτε άλλο virtual terminal θέλετε. Παρακάτω βλέπετε ένα παράδειγμα για ttyv0:

ttyv0 "/usr/libexec/getty Pc" cons25l7 on secure


Ρύθμιση Environment Variable


Αυτό είναι εύκολο και είναι το ίδιο με τις προηγούμενες εκδόσεις του FreeBSD. Ανάλογα με το κέλυφος σας, θα χρειαστεί να προσθέσετε την γραμμή:

export LANG=el_GR.ISO8859-7

για κελύφη όπως το bash ή

setenv LANG el_GR.ISO8859-7

για κελύφη όπως το csh. Η γραμμή θα πρέπει να μπει στο κατάλληλο αρχείο ρυθμίσεων του κελύφους σας (π.χ. το .profile).

Έλεγχος Λειτουργίας


Αφού κάνετε τα παραπάνω, μπορείτε να δοκιμάσετε τα Ελληνικά στην κονσόλα. Είτε επανεκκνίνηστε το μηχάνημα σας, είτε την υπηρεσία syscons:

# service syscons restart

Μη ξεχάσετε να κάνετε logout-login (η ενδεχομένως source το .profile) για να ενεργοποιηθεί η μεταβλητή περιβάλλοντος. Τα Ελληνικά στην κονσόλα αλλάζουν με ALT+SPACE. Καλή τύχη!

Sunday, October 16, 2011

bsdinstall: τα καλά, τα κακά, τα άσχημα

Όχι το FreeBSD 9.0 δεν έχει κυκλοφορήσει ακόμα. Γι'αυτό και δεν γράφει 9.0-RELEASE o τίτλος. Ωστόσο είμαστε στο BETA3 (και σύντομα στο RC1) και νομίζω είναι ευκαιρία να δούμε λίγο το νέο installer που αντικαθιστά το "αγαπημένο μας" sysinstall και μερικές ακόμα διαφορές που υπάρχουν στην εγκατάσταση. Στο FreeBSD 9, το νέο πρόγραμμα εγκατάστασης λέγεται bsdinstall. Στην πραγματικότητα το bsdinstall είναι μια σειρά από scripts και δεν έχει εξαρτήσεις πέρα από το βασικό σύστημα. Μπορείτε να διαβάσετε το πλήρες κεφάλαιο εγκατάστασης του FreeBSD 9 στο Ελληνικό Εγχειρίδιο του FreeBSD. Δεν θα μιλήσουμε εδώ για τη διαδικασία της εγκατάστασης - αφού το Εγχειρίδιο την περιγράφει μια χαρά. Θα δούμε όμως τι μας αρέσει (και τι όχι) στο νέο installer.

Tα Kαλά

Όχι δεν είναι κάποιος fancy installer, μη φαντάζεστε. Το bsdinstall εξακολουθεί να είναι text mode με τους γνωστούς διαλόγους από το libdialog. Τι καλό όμως έχει σε σχέση με το sysinstall;

  • Η διαδικασία προχωράει σειριακά: Δεν υπάρχει το γνωστό πρόβλημα του αρχάριου χρήστη που εγκλωβίστηκε να κάνει κύκλους στο sysinstall.
  • Υπάρχει η δυνατότητα χρήσης του μέσου εγκατάστασης ως Live CD. Μη φανταστείτε γραφικό περιβάλλον βέβαια αλλά Live console με πλήρεις δυνατότητες (full multiuser σύστημα με πλήρες base).
  • Το bsdinstall μπορεί να δημιουργήσει και να χρησιμοποιήσει κατατμήσεις gpart και όχι μόνο το παλιό κακό MBR. Επίσης το προεπιλεγμένο σύστημα αρχείων είναι το UFS2 με SoftUpdates Journaling. (SU-J). To SU-J είναι ένα νέο χαρακτηριστικό στο FreeBSD 9. Να θυμίσουμε ότι το journaling υπάρχει ήδη στο FreeBSD, αλλά μέχρι και τη σειρά 8 που έχουμε τώρα, δεν περιορίζεται στα SoftUpdates αλλά ενεργεί σε όλα τα δεδομένα. Αυτό το κάνει αισθητά πιο αργό από το νέο SU+J - και χρειάζονταν και αρκετά βήματα για τη χρήση του. Φαίνεται επίσης ότι το bsdinstall θα μπορεί να κάνει εγκατάσταση και σε ZFS (yes!)
  • Το bsdinstall δίνει δυνατότητα ρύθμισης και ασύρματου δικτύου με τη βοήθεια απλών διαλόγων.
  • Το bsdinstall είναι modular και scriptable.

Tα κακά

Καθώς το bsdinstall είναι ακόμα στην αρχή του, αναμένεται να έχει διάφορα bugs. Το βασικότερο πρόβλημα που βλέπω αυτή τη στιγμή είναι η έλλειψη βοήθειας και προεπιλογών στους διαλόγους. Για παράδειγμα στην επιλογή συστήματος αρχείων, φαίνεται ο παρακάτω διάλογος:

Τώρα, αν θέλαμε να είμαστε φιλικοί προς το χρήστη θα έπρεπε για παράδειγμα να υπάρχει drop-down επιλογή για τα filesystems. Πως μπορώ εγώ να μαντέψω τι filesystems είναι δεκτά σε αυτό το ωραίο πεδίο "Type:"; Βέβαια υπάρχει μια γραμμή βοήθειας με την προτροπή e.g freebsd-ufs, freebsd-swap. Αλλά αυτό υπονοεί ότι μάλλον υπάρχουν και άλλα δεκτά filesystems. Π.χ. freebsd-zfs. Η μόνη λύση είναι το trial and error.

Κάποιοι άλλοι διάλογοι, είναι λιγότερο φιλικοί και από το αρχικό sysinstall. Για παράδειγμα, αν απαντήσετε yes στο παρακάτω:

θα βρεθείτε να εκτελείτε το adduser script από την κονσόλα. Όχι ότι δεν μας αρέσει το adduser αλλά θα φαίνεται σαν κινέζικα στον αρχάριο εγκαταστάτη (αν και εξηγείται μια χαρά στο FreeBSD Handbook). Επίσης δεν παρέχεται πλέον η δυνατότητα να προσθέσουμε ομάδες (groups) αν και αυτό μάλλον δεν είναι πολύ σημαντικό.

Τη δεδομένη στιγμή δεν γνωρίζω αν το bsdinstall θα αποκτήσει και κάποια διαχείριση πακέτων όπως το sysinstall. Καθώς ξέρετε τα BETA μέσα εγκατάστασης δεν έχουν έτσι και αλλιώς έτοιμα πακέτα. Δεν φαίνεται πάντως να υπάρχει κάποια τέτοια δυνατότητα στο παρόν bsdinstall.

Τα Άσχημα


Το να βλέπω διαλόγους φτιαγμένους με συν (+) πλην (-) και κάθετες μπάρες (|) το 2011, μου φαίνεται κάπως. Maybe it's just me :)

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



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


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