Ο inetd(8) συχνά αναφέρεται και ως «Υπερ-Εξυπηρετητής Διαδικτύου» γιατί χειρίζεται αρκετές συνδέσεις για διαφορετικές υπηρεσίες. Όταν ο inetd λαμβάνει μία σύνδεση προσδιορίζει για ποιο πρόγραμμα προορίζεται, δημιουργεί την κατάλληλη διεργασία και εξουσιοδοτεί τον υποδοχέα (socket) (το πρόγραμμα τίθεται σε λειτουργία με τον υποδοχέα υπηρεσίας να παίζει τον ρόλο του standard input, του standard output και του ελεγκτή σφαλμάτων). Η λειτουργία του inetd σε διακομιστές που δεν χρησιμοποιούνται σε μεγάλο βαθμό μπορεί να μειώσει δραστικά το συνολικό φόρτο του συστήματος, συγκρίνοντας το με το σύνολο των μεμονωμένων λειτουργιών αν εκτελέσουμε κάθε δαίμονα ξεχωριστά.
Αρχικά, ο inetd χρησιμοποιήθηκε για να δημιουργεί άλλους δαίμονες, όμως πολλά συνηθισμένα πρωτόκολλα μπορούν να λειτουργήσουν άμεσα, όπως τα chargen, auth, και daytime.
Σε αυτή την ενότητα θα καλύψουμε τις βασικές έννοιες για την ρύθμιση του inetd χρησιμοποιώντας τις επιλογές γραμμής εντολών και του αρχείου ρυθμίσεων /etc/inetd.conf.
Η αρχικοποίηση του inetd γίνεται διαμέσου του συστήματος rc(8) . Η επιλογή inetd_enable είναι προεπιλεγμένα NO , αλλά μπορεί να έχει ενεργοποιηθεί κατά την εγκατάσταση από το sysinstall, επομένως εξαρτάται από τις ρυθμίσεις που έχει επιλέξει ο χρήστης. Τοποθετώντας:
inetd_enable="YES"ή
inetd_enable="NO"στο /etc/rc.conf θα ενεργοποιηθεί ή θα απενεργοποιηθεί αντίστοιχα το inetd κατά τη διάρκεια εκκίνησης του συστήματος. Με την εκτέλεση της εντολής:
/etc/rc.d/inetd rcvarμπορείτε να εμφανίσετε τις τρέχουσες ρυθμίσεις.
Πρόσθετα, μπορείτε να εισάγετε στο inetd διάφορες επιλογές γραμμής εντολών με τη χρήση των επιλογών inetd_flags .
Όπως συμβαίνει και με τους περισσότερους δαίμονες, το inetd έχει μια σειρά από επιλογές που μπορούν να συμπληρωθούν ώστε να αλλάξει η συμπεριφορά του. Η πλήρης λίστα επιλογών είναι:
inetd [-d] [-l] [-w] [-W] [-c maximum]
[-C rate] [-a address | hostname] [-p filename] [-R rate] [-s maximum] [configuration
file]
Οι επιλογές μπορούν να περαστούν στο inetd χρησιμοποιώντας την επιλογή inetd_flags στο /etc/rc.conf. Προεπιλεγμένα, το inetd_flags είναι ρυθμισμένο στην τιμή -wW -C 60, η οποία επιτρέπει την αναδίπλωση TCP για τις υπηρεσίες του inetd, και εμποδίζει για κάθε ξεχωριστή διεύθυνση IP να αιτείται οποιαδήποτε υπηρεσία πάνω πάνω από 60 φορές το λεπτό.
Οι νέοι χρήστες μπορούν να χαίρονται αφού θα παρατηρήσουν πως συνήθως αυτοί οι παράμετροι δεν χρειάζονται αλλαγές, αν και στη συνέχεια θα περιγράψουμε τις επιλογές rate-limiting οι οποίες μπορεί να σας φανούν χρήσιμες αν παρατηρείτε πολύ μεγάλο νούμερο συνδέσεων. Μπορείτε να βρείτε μια πλήρη λίστα επιλογών στο εγχειρίδιο του inetd(8) manual.
Ορίζει την προεπιλεγμένη τιμή του μέγιστου αριθμού ταυτόχρονων κλήσεων για κάθε
υπηρεσία. Η προεπιλεγμένη τιμή είναι unlimited. Μπορείτε να μεταβάλλετε τη τιμή ξεχωριστά
για κάθε υπηρεσία με τη παράμετρο max-child.
Ορίζει την προεπιλεγμένη τιμή του μέγιστου αριθμού κλήσεων που δύναται να δεχθεί μία
υπηρεσία σε ένα λεπτό από μία συγκεκριμένη IP. Η προεπιλεγμένη τιμή είναι unlimited.
Μπορείτε να μεταβάλλετε τη τιμή ξεχωριστά για κάθε υπηρεσία με τη παράμετρο max-connections-per-ip-per-minute.
Ορίζει το μέγιστο αριθμό κλήσεων μιας υπηρεσίας το λεπτό. Η προεπιλεγμένη τιμή είναι 256. Με την τιμή rate 0 επιτρέπεται απεριόριστος αριθμός κλήσεων.
Ορίζει το στιγμιαίο μέγιστο αριθμό κλήσεων μιας υπηρεσίας από μια συγκεκριμένη
διεύθυνση IP. Η προεπιλεγμένη τιμή είναι απεριόριστα. Μπορείτε να αλλάξετε τη
συγκεκριμένη τιμή για κάθε υπηρεσία ορίζοντας την παράμετρο max-child-per-ip.
Η παραμετροποίηση του inetd γίνεται μέσω του αρχείου /etc/inetd.conf.
Όταν γίνεται μια μετατροπή στο /etc/inetd.conf, τότε μπορείτε να εξαναγκάσετε το inetd να ξαναδιαβάσει το αρχείο ρυθμίσεων του εκτελώντας την εντολή:
Κάθε γραμμή του αρχείου ρυθμίσεων ορίζει μια συγκεκριμένη διεργασία. Οι γραμμές που ξεκινούν με «#» είναι σχόλια. Η διάταξη κάθε καταχώρισης στο /etc/inetd.conf έχει την ακόλουθη φόρμα:
service-name
socket-type
protocol
{wait|nowait}[/max-child[/max-connections-per-ip-per-minute[/max-child-per-ip]]]
user[:group][/login-class]
server-program
server-program-arguments
Για παράδειγμα η καταχώριση για το δαίμονα ftpd(8) με IPv4 διαβάζεται ως εξής:
ftp stream tcp nowait root /usr/libexec/ftpd ftpd -l
Είναι το όνομα της υπηρεσίας του συγκεκριμένου δαίμονα. Αυτή θα πρέπει να αναφέρεται στη λίστα υπηρεσιών /etc/services, όπου ορίζεται η πόρτα στην οποία θα εξυπηρετεί ο inetd τη συγκεκριμένη υπηρεσία. Εάν προσθέσετε μια νέα υπηρεσία, τότε θα πρέπει πρώτα να συμπεριληφθεί στη λίστα inetd /etc/services.
stream, dgram, raw, ή seqpacket. Το stream είναι για δαίμονες που χρησιμοποιούν συνδέσεις TCP, ενώ το dgram χρησιμοποιείται από δαίμονες που κάνουν χρήση του πρωτοκόλλου μεταφοράς UDP.
Κάποιο από τα ακόλουθα πρωτόκολλα:
Η επιλογή wait|nowaitπροσδιορίζει αν ο δαίμονας που έχει
κληθεί από το inetd μπορεί να χειριστεί τον υποδοχέα (socket)
του ή όχι. Οι υποδοχείς τύπου dgram πρέπει να χρησιμοποιούν
την επιλογή wait, ενώ οι δαίμονες με υποδοχείς stream, οι
οποίοι συνήθως έχουν δυνατότητες πολλαπλής αλληλουχίας (multi-threaded), θα έπρεπε να
χρησιμοποιούν nowait. Η επιλογή wait τροφοδοτεί ένα δαίμονα με πολλούς υποδοχείς, ενώ η επιλογή
nowait γεννά ένα τέκνο δαίμονα (child) για κάθε νέο
υποδοχέα.
Ο μέγιστος αριθμός τέκνων δαιμόνων που μπορεί να δημιουργήσει το inetd μπορεί να οριστεί με τη χρήση της επιλογής max-child. Αν χρειάζεται να θέσουμε ένα όριο δέκα στιγμιοτύπων, θα
πρέπει να τοποθετηθεί μετά την επιλογή nowait /10. Θέτοντας /0 θα επιτρέπεται
απεριόριστος αριθμός τέκνων.
Επιπρόσθετα στην επιλογή max-child, υπάρχουν δύο ακόμη
επιλογές που οριοθετούν το μέγιστο αριθμό συνδέσεων που μπορούν να ενεργοποιηθούν από μία
τοποθεσία για ένα συγκεκριμένο δαίμονα. Η επιλογή max-connections-per-ip-per-minute οριοθετεί τον αριθμό των
συνδέσεων ανά λεπτό από μια συγκεκριμένη διεύθυνση IP, π.χ. εάν η τιμή είναι δέκα τότε
για κάθε συγκεκριμένη υπηρεσία θα υπάρχει μέγιστο όριο δέκα προσπαθειών σύνδεσης το λεπτό
από κάθε διεύθυνση IP. Η επιλογή max-child-per-ip οριοθετεί
τον αριθμό τέκνων που μπορούν να δημιουργηθούν από κάθε διεύθυνση IP οποιαδήποτε στιγμή.
Οι επιλογές αυτές είναι χρήσιμες για να προλαμβάνουν το σύστημα από υπερβολική κατανάλωση
των πόρων του καθώς και από κακόβουλες επιθέσεις Denial of Service (DoS).
Σε αυτό το πεδίο, μία τιμή εκ των δύο είναι υποχρεωτική wait ή nowait. Αντιθέτως οι max-child, max-connections-per-ip-per-minute και η max-child-per-ip είναι προαιρετικές.
Ένας δαίμονας streaming πολλαπλής αλληλουχίας για τον οποίο δεν έχουν τεθεί οι
περιορισμοί max-child, max-connections-per-ip-per-minute ή max-child-per-ip θα ήταν απλά: nowait.
Ο ίδιος δαίμονας με περιορισμό μέγιστου ορίου δέκα δαιμόνων θα γραφόταν: nowait/10.
Στημένο με τον ίδιο τρόπο και επιπλέον με περιορισμό μέγιστου ορίου είκοσι συνδέσεων το λεπτό ανά διεύθυνση IP και μέγιστου ολικού ορίου δέκα τέκνων δαιμόνων τότε θα διαβάζαμε: nowait/10/20.
Αυτές οι επιλογές χρησιμοποιούνται από τις προεπιλεγμένες ρυθμίσεις του δαίμονα fingerd(8) όπως μπορείτε να παρατηρήσετε εδώ:
finger stream tcp nowait/3/10 nobody /usr/libexec/fingerd fingerd -s
Ένα τελευταίο παράδειγμα, για αυτό το πεδίο, με ολικό μέγιστο όριο 100 τέκνων και με 5 ως μέγιστο αριθμό συνδέσεων ανά IP τότε θα γραφόταν ως: nowait/100/0/5.
Αυτό είναι το όνομα χρήστη (username) με το οποίο θα πρέπει να εκτελεστεί ο δαίμονας. Η πιο συνήθης κατάσταση είναι οι δαίμονες να τρέχουν από τον χρήστη root. Για περισσότερη ασφάλεια προτιμήστε διακομιστές που τρέχουν από τον χρήστη daemon , ή καλύτερα από τον nobody που έχει ακόμη λιγότερα προνόμια.
Είναι η πλήρης διαδρομή τοποθεσίας του δαίμονα που πρέπει να εκτελεστεί όταν
λαμβάνεται μια σύνδεση. Αν ο δαίμονας είναι εσωτερική υπηρεσία του inetd, τότε θέστε εδώ την τιμή internal.
Αυτή η επιλογή, πρέπει να είναι σύμφωνη με την server-program, προσδιορίζει τα προθέματα, που ξεκινούν από την argv[0], και περνούν στο δαίμονα κατά την εκκίνηση. Αν η γραμμή
εντολής είναι mydaemon -d , τότε η mydaemon
-d θα είναι η τιμή του server-program-arguments. Και
πάλι, αν ο δαίμονας είναι εσωτερική διεργασία, τότε εδώ χρησιμοποιήστε την τιμή internal.
Κάποιες υπηρεσίες του inetd μπορεί να είναι ενεργοποιημένες, ανάλογα με τις επιλογές που κάνατε κατά τη διάρκεια της εγκατάστασης του FreeBSD. Εάν δεν υπάρχει ιδιαίτερη ανάγκη για κάποιον δαίμονα τότε απενεργοποιήστε τον. Τοποθετήστε μία «#» μπροστά από τον σχετικό δαίμονα στο /etc/inetd.conf, και έπειτα επαναφορτώστε τις ρυθμίσεις του inetd. Μερικοί δαίμονες, όπως ο fingerd, πιθανώς να μην είναι καθόλου επιθυμητοί διότι ίσως να παρέχουν χρήσιμες πληροφορίες σε κακόβουλες επιθέσεις.
Μερικοί δαίμονες παρέχουν ελλιπή μέτρο ασφαλείας και μπορεί να πραγματοποιούν
συνδέσεις σε μεγάλους ή ανύπαρκτους χρόνους. Αυτό μπορεί να επιτρέψει κακόβουλες
επιθέσεις σε αργούς χρόνους .This allows an attacker to slowly send connections to a
particular daemon, thus saturating available resources. Ίσως να είναι καλή ιδέα να θέσετε
για ορισμένους δαίμονες κάποια από τις επιλογές max-connections-per-ip-per-minute, max-child ή max-child-per-ipαν
παρατηρήσετε ότι έχετε πάρα πολλές συνδέσεις.
Προεπιλεγμένα είναι απενεργοποιημένα τα TCP wrapping. Συμβουλευτείτε την σελίδα βοηθείας hosts_access(5) για περισσότερες πληροφορίες σχετικά με μεθόδους περιορισμού TCP για διάφορους δαίμονες που καλούνται μέσω του inetd.
Οι ακόλουθες υπηρεσίες daytime, time, echo, discard, chargen, και η auth παρέχονται μέσα από το inetd.
Η υπηρεσία auth παρέχει υπηρεσίες ταυτοποίησης δικτύων και είναι ρυθμιζόμενη μέχρι ενός βαθμού. Οι υπόλοιπες είναι απλά on / off.
Συμβουλευτείτε τη σελίδα βοηθείας inetd(8) για περισσότερες πληροφορίες.
Αυτό το κείμενο, και άλλα κείμενα, μπορεί να βρεθεί στο ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.
Για ερωτήσεις σχετικά με το FreeBSD, διαβάστε την τεκμηρίωση πριν να επικοινωνήσετε με την
<questions@FreeBSD.org>.
Για ερωτήσεις σχετικά με αυτή την τεκμηρίωση, στείλτε e-mail στην <doc@FreeBSD.org>.