30.2 Ο «Υπερ-Εξυπηρετητής»inetd

Συνεισφορά του Chern Lee. Ενημερωμένο για την έκδοση FreeBSD 6.1 από την Ομάδα Τεκμηρίωσης του FreeBSD.

30.2.1 Περίληψη

Ο inetd(8) συχνά αναφέρεται και ως «Υπερ-Εξυπηρετητής Διαδικτύου» γιατί χειρίζεται συνδέσεις για διαφορετικές υπηρεσίες. Όταν ο inetd λαμβάνει μία σύνδεση, προσδιορίζει για ποιο πρόγραμμα προορίζεται, δημιουργεί την κατάλληλη διεργασία και εξουσιοδοτεί τον υποδοχέα (socket) (το πρόγραμμα τίθεται σε λειτουργία με τον υποδοχέα υπηρεσίας να παίζει τον ρόλο του standard input, του standard output και του ελεγκτή σφαλμάτων). Η λειτουργία του inetd σε διακομιστές που δεν χρησιμοποιούνται σε μεγάλο βαθμό μπορεί να μειώσει δραστικά το συνολικό φόρτο του συστήματος, συγκρίνοντας το με το σύνολο των μεμονωμένων λειτουργιών αν εκτελέσουμε κάθε δαίμονα ξεχωριστά.

Αρχικά, ο inetd χρησιμοποιήθηκε για να εκκινεί άλλους δαίμονες, όμως πολλά απλά πρωτόκολλα μπορούν να λειτουργήσουν άμεσα, όπως τα chargen, auth, και daytime.

Σε αυτή την ενότητα θα καλύψουμε τις βασικές έννοιες για την ρύθμιση του inetd χρησιμοποιώντας τις επιλογές γραμμής εντολών και του αρχείου ρυθμίσεων /etc/inetd.conf.

30.2.2 Ρυθμίσεις

Η αρχικοποίηση του 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.

30.2.3 Επιλογές Γραμμής-Εντολών

Όπως συμβαίνει και με τους περισσότερους δαίμονες, στο 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, οι νέοι χρήστες δεν χρειάζεται να ανησυχούν: στην πλειονότητα των περιπτώσεων αυτές οι παράμετροι δεν χρειάζονται αλλαγές. Οι επιλογές αυτές είναι χρήσιμες αν ανακαλύψετε ότι λαμβάνετε υπερβολικά μεγάλο αριθμό συνδέσεων. Μπορείτε να δείτε μια πλήρη λίστα των επιλογών στη σελίδα manual inetd(8).

-c maximum

Ορίζει την προεπιλεγμένη τιμή του μέγιστου αριθμού ταυτόχρονων κλήσεων για κάθε υπηρεσία. Η προεπιλεγμένη τιμή είναι να μην υπάρχει περιορισμός. Μπορείτε να μεταβάλλετε τη τιμή ξεχωριστά για κάθε υπηρεσία με την παράμετρο max-child.

-C rate

Ορίζει την προεπιλεγμένη τιμή του μέγιστου αριθμού κλήσεων που δύναται να δεχθεί μία υπηρεσία σε ένα λεπτό από μία συγκεκριμένη IP. Η προεπιλεγμένη τιμή είναι να μην υπάρχει περιορισμός. Μπορείτε να μεταβάλλετε τη τιμή ξεχωριστά για κάθε υπηρεσία με τη παράμετρο max-connections-per-ip-per-minute.

-R rate

Ορίζει το μέγιστο αριθμό κλήσεων μιας υπηρεσίας το λεπτό. Η προεπιλεγμένη τιμή είναι 256. Με την τιμή rate 0 επιτρέπεται απεριόριστος αριθμός κλήσεων.

-s maximum

Ορίζει το στιγμιαίο μέγιστο αριθμό κλήσεων μιας υπηρεσίας από μια συγκεκριμένη διεύθυνση IP. Η προεπιλεγμένη τιμή είναι να μην υπάρχει περιορισμός. Μπορείτε να μεταβάλλετε την τιμή χωριστά για κάθε υπηρεσία ορίζοντας την παράμετρο max-child-per-ip.

30.2.4 inetd.conf

Η παραμετροποίηση του inetd γίνεται μέσω του αρχείου /etc/inetd.conf.

Όταν γίνεται μια μεταβολή στο /etc/inetd.conf, μπορείτε να εξαναγκάσετε το inetd να ξαναδιαβάσει το αρχείο ρυθμίσεων του εκτελώντας την εντολή:

Παράδειγμα 30-1. Επαναφόρτωση του αρχείου ρυθμίσεων inetd

# /etc/rc.d/inetd reload

Κάθε γραμμή του αρχείου ρυθμίσεων ορίζει μια συγκεκριμένη διεργασία. Οι γραμμές που ξεκινούν με «#» είναι σχόλια. Η διάταξη κάθε καταχώρισης στο /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
service-name

Είναι το όνομα της υπηρεσίας του συγκεκριμένου δαίμονα. θα πρέπει να αντιστοιχεί σε μια υπηρεσία που φαίνεται στη λίστα /etc/services. Έτσι προσδιορίζεται η πόρτα στην οποία θα ακούει ο inetd για εισερχόμενη κλήση. Εάν προσθέσετε μια νέα υπηρεσία, τότε θα πρέπει πρώτα να την συμπεριλάβετε στη λίστα /etc/services.

socket-type

Μπορεί να είναι stream, dgram, raw, ή seqpacket. Το stream είναι για δαίμονες που χρησιμοποιούν συνδέσεις TCP προσανατολισμένες στη σύνδεση, ενώ το dgram χρησιμοποιείται από δαίμονες που κάνουν χρήση του πρωτοκόλλου μεταφοράς UDP.

protocol

Κάποιο από τα ακόλουθα πρωτόκολλα:

Πρωτόκολλο Επεξήγηση
tcp, tcp4 TCP IPv4
udp, udp4 UDP IPv4
tcp6 TCP IPv6
udp6 UDP IPv6
tcp46 Αμφότερα TCP IPv4 ή v6
udp46 Αμφότερα UDP IPv4 ή v6
{wait|nowait}[/max-child[/max-connections-per-ip-per-minute[/max-child-per-ip]]]

Η επιλογή wait|nowaitπροσδιορίζει αν ο δαίμονας που έχει κληθεί από το inetd μπορεί να χειριστεί τον υποδοχέα του (socket) ή όχι. Οι υποδοχείς τύπου dgram πρέπει να χρησιμοποιούν την επιλογή wait, ενώ οι δαίμονες με υποδοχείς stream, οι οποίοι συνήθως έχουν δυνατότητες multi threading, θα πρέπει να χρησιμοποιούν την nowait. Η επιλογή wait τροφοδοτεί πολλούς υποδοχείς σε ένα δαίμονα, ενώ η επιλογή nowait γεννά ένα child του δαίμονα για κάθε νέο υποδοχέα.

Ο μέγιστος αριθμός child δαιμόνων που μπορεί να δημιουργήσει το inetd μπορεί να οριστεί με τη χρήση της επιλογής max-child. Αν χρειάζεται να θέσουμε ένα όριο δέκα στιγμιοτύπων για κάποιο δαίμονα, θα τοποθετήσουμε την τιμή /10 μετά την επιλογή nowait. Θέτοντας την τιμή /0 θα επιτρέπεται απεριόριστος αριθμός child.

Επιπρόσθετα στην επιλογή 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 multi-threaded για τον οποίο δεν έχουν τεθεί οι περιορισμοί 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 τέκνων και μέγιστο αριθμό συνδέσεων ανά IP πέντε: nowait/100/0/5.

user

Αυτό είναι το όνομα χρήστη (username) με το οποίο θα πρέπει να εκτελεστεί ο δαίμονας. Συνήθως οι δαίμονες εκτελούνται από τον χρήστη root. Για λόγους ασφαλείας, ενδέχεται κάποιοι διακομιστές να εκτελούνται από το χρήστη daemon, ή και από τον nobody που έχει ακόμη λιγότερα προνόμια.

server-program

Είναι η πλήρης διαδρομή προς τον δαίμονα που πρέπει να εκτελεστεί όταν λαμβάνεται μια σύνδεση. Αν ο δαίμονας είναι εσωτερική υπηρεσία του inetd, το πεδίο αυτό θα περιέχει την τιμή internal.

server-program-arguments

Αυτή η επιλογή λειτουργεί σε συνδυασμό με την server-program, προσδιορίζόντας τα ορίσματα (ξεκινώντας από το argv[0]) που περνούν στο δαίμονα κατά την εκκίνηση. Αν η γραμμή εντολής είναι mydaemon -d, τότε η mydaemon -d θα είναι η τιμή του server-program-arguments. Αν ο δαίμονας είναι εσωτερική διεργασία, το πεδίο θα πρέπει να έχει την τιμή internal.

30.2.5 Ασφάλεια

Κάποιες υπηρεσίες του inetd μπορεί να είναι ενεργοποιημένες, ανάλογα με τις επιλογές που κάνατε κατά τη διάρκεια της εγκατάστασης του FreeBSD. Εάν δεν υπάρχει ιδιαίτερη ανάγκη για κάποιον δαίμονα, απενεργοποιήστε τον. Τοποθετήστε μία «#» μπροστά από τον σχετικό δαίμονα στο /etc/inetd.conf, και έπειτα επαναφορτώστε τις ρυθμίσεις του inetd. Μερικοί δαίμονες, όπως ο fingerd, πιθανώς να μην είναι καθόλου επιθυμητοί διότι ίσως παρέχουν πληροφορίες χρήσιμες σε κακόβουλες επιθέσεις.

Μερικοί δαίμονες δεν λαμβάνουν τόσο υπόψη τους την ασφάλεια και επιτρέπουν μεγάλους ως απεριόριστους χρόνους time outs. Αυτό μπορεί να επιτρέψει σε κάποιο κακόβουλο να εξαντλήσει τους πόρους του συστήματος πραγματοποιώντας πολλές συνδέσεις με αργό ρυθμό. Ίσως να είναι καλή ιδέα να θέσετε για ορισμένους δαίμονες κάποια από τις επιλογές max-connections-per-ip-per-minute, max-child ή max-child-per-ip αν παρατηρήσετε ότι έχετε πάρα πολλές συνδέσεις.

Το TCP wrapping είναι ενεργοποιημένο από προεπιλογή. Συμβουλευτείτε την σελίδα manual hosts_access(5) για περισσότερες πληροφορίες σχετικά με μεθόδους περιορισμού του TCP για διάφορους δαίμονες που καλούνται μέσω του inetd.

30.2.6 Διάφορα

Οι ακόλουθες υπηρεσίες: daytime, time, echo, discard, chargen, και η auth παρέχονται μέσα από το inetd.

Η υπηρεσία auth παρέχει υπηρεσίες ταυτοποίησης δικτύων και έχει κάποιες δυνατότητες ρυθμίσεων. Οι υπόλοιπες είναι απλά on / off.

Συμβουλευτείτε τη σελίδα manual inetd(8) για περισσότερες πληροφορίες.

Αυτό το κείμενο, και άλλα κείμενα, μπορεί να βρεθεί στο ftp://ftp.FreeBSD.org/pub/FreeBSD/doc/.

Για ερωτήσεις σχετικά με το FreeBSD, διαβάστε την τεκμηρίωση πριν να επικοινωνήσετε με την <questions@FreeBSD.org>.
Για ερωτήσεις σχετικά με αυτή την τεκμηρίωση, στείλτε e-mail στην <doc@FreeBSD.org>.