Εγγενείς μονάδες (για προγραμματιστές)
Δεν χρειάζονται μονάδες για τη συνήθη χρήση. Αυτός ο οδηγός απευθύνεται σε προγραμματιστές και διαχειριστές που θέλουν να επεκτείνουν την υπηρεσία Windows ή Linux με εγγενείς βιβλιοθήκες. Οι μονάδες εκτελούνται μέσα στην υπηρεσία με τα δικαιώματά της. Εγκαθιστάτε μόνο έμπιστο κώδικα και διατηρείτε την ιδιοκτησία των αρχείων μονάδων, εξαρτήσεων και ρυθμίσεων στον διαχειριστή.
Φόρτωση μονάδας
Η υπηρεσία διαβάζει αρχεία *.conf από τον κατάλογο modules.d δίπλα στο αρχείο ρυθμίσεων. Οι προεπιλεγμένες θέσεις είναι:
| Λειτουργικό σύστημα | Θέση ρυθμίσεων μονάδων | Μορφή βιβλιοθήκης |
|---|---|---|
| Linux | /etc/mudfish-dns/modules.d/ | .so |
| Windows | %ProgramData%\Mudfish DNS\modules.d\ | .dll |
Σε κάθε αρχείο γράψτε μία απόλυτη διαδρομή βιβλιοθήκης ανά γραμμή. Για παράδειγμα, το /etc/mudfish-dns/modules.d/10-policy.conf περιέχει:
/usr/lib/mudfish-dns/modules/policy.so
Τα αρχεία διαβάζονται με τη σειρά ονόματος και οι γραμμές κάθε αρχείου με τη σειρά τους. Αγνοούνται κενές γραμμές και γραμμές που αρχίζουν με #. Μην περικλείετε διαδρομές σε εισαγωγικά και μη χρησιμοποιείτε μεταβλητές περιβάλλοντος ή σχόλια στο τέλος γραμμής, επειδή δεν ερμηνεύονται. Και στα Windows γράψτε την πλήρη απόλυτη διαδρομή, ακόμη και αν περιέχει κενά.
Μετά την προσθήκη, αλλαγή ή αφαίρεση μονάδας, επανεκκινήστε την υπηρεσία. Στο Linux χρησιμοποιήστε:
sudo systemctl restart mudfish-dns.service
Στα Windows, επανεκκινήστε την υπηρεσία Mudfish DNS από τη διαχείριση υπηρεσιών. Οι επιλογές Έναρξη DNS, Διακοπή DNS και Εφαρμογή ρυθμίσεων δεν επαναφορτώνουν τις μονάδες. Η υπηρεσία δεν ξεκινά αν δεν μπορεί να διαβάσει αρχείο ρυθμίσεων, αν μια διαδρομή είναι λανθασμένη ή αν αποτύχει η φόρτωση ή η αρχικοποίηση. Επιτρέπεται ο κατάλογος μονάδων να λείπει ή να είναι κενός.
Κατά την ανάπτυξη, μπορείτε να επαναλάβετε το όρισμα --module για φόρτωση βιβλιοθηκών με τη σειρά των ορισμάτων. Αυτό αντικαθιστά την αυτόματη φόρτωση του modules.d. Το --config FILE αλλάζει επίσης τη θέση του καταλόγου μονάδων δίπλα στο αρχείο ρυθμ ίσεων. Το --restore-dns εκτελεί επαναφορά χωρίς φόρτωση μονάδων.
Υλοποίηση hooks
Διαβάστε την κεφαλίδα mudfish_dns_module.h ή κατεβάστε το mudfish_dns_module.h. Η κεφαλίδα ορίζει τις δομές, τα hooks, τις ενέργειες και τους κανόνες διάρκειας ζωής δεδομένων των μονάδων. Αυτός ο οδηγός χρησιμοποιεί C ABI v2. Εξαγάγετε τη mudfish_dns_module_init_v2() και, πριν συμπληρώσετε τα hooks, ελέγξτε το MUDFISH_DNS_MODULE_ABI_V2 και το μέγεθος της δομής που δόθηκε. Επιστρέψτε 0 σε επιτυχή αρχικοποίηση.
| Hook | Πότε καλείται |
|---|---|
on_dns_query | Μετά την αποδοχή του αναλυμένου ερωτήματος, πριν από αναζήτηση στην προσωρινή μνήμη ή προώθηση. |
on_dns_response | Μετά την επιλογή απόκρισης, πριν από αποθήκευση στην προσωρινή μνήμη ή επιστροφή στον πελάτη. Περνούν και οι αποθηκευμένες αποκρίσεις. |
on_web_hello | Μετά τον αρχικό έλεγχο HTTP Host/TLS SNI, πριν από τη σύνδεση ή την επεξεργασία αρχικών δεδομένων. |
on_web_data | Μετά την ανάγνωση επόμενων δεδομένων πελάτη ή δεδομένων διακομιστή, πριν από την προώθηση. |
Ενέργειες DNS
Τα hooks DNS v2 επιστρέφουν 0 σε επιτυχία και ορίζουν το result->action.
| Ενέργεια | Αποτέλεσμα |
|---|---|
MUDFISH_DNS_CONTINUE | Συνεχίζει στην επόμενη μονάδα και στην κανονική επεξεργασία. |
MUDFISH_DNS_ALLOW | Τερματίζει την τρέχουσα αλυσίδα hooks και συνεχίζει την κανονική αναζήτηση DNS ή επιστρέφει την επιλεγμένη απόκριση. |
MUDFISH_DNS_BLOCK | Επιστρέφει REFUSED. |
MUDFISH_DNS_DROP | Απορρίπτει χωρίς αποστολή απόκρισης DNS. |
MUDFISH_DNS_ANSWER | Δημιουργεί απόκριση με τη δοσμένη διεύθυνση IPv4/IPv6 και TTL. |
MUDFISH_DNS_REPLACE | Χρησιμοποιεί την πλήρη απόκριση DNS σε μορφή δικτύου που παρέχει η μονάδα. |
Μην επιστρέφετε απευθείας σταθερές ενεργειών από hooks DNS v2. Αν η συνάρτηση επιστρέψει μη μηδενική τιμή ή το αποτέλεσμα δεν είναι έγκυρο, προκύπτει SERVFAIL. Το ALLOW τερματίζει μόνο την τρέχουσα αλυσίδα hooks και δεν παρακάμπτει κανόνες τομέων, άδειες τρόπων επικοινωνίας ή ελέγχους πιστοποιητικών. Τα αποτελέσματα ερωτημάτων, εκτός από DROP, περνούν και από τα hooks απόκρισης.
Τα hooks ιστού επιστρέφουν απευθείας MUDFISH_DNS_CONTINUE ή MUDFISH_DNS_REJECT. Η απόρριψη αιτήματος ιστού κλείνει τη σύνδεση. Για χρήση hooks ιστού πρέπει να είναι ενεργή η προστασία ιστού. Δεν παρέχεται αποκρυπτογραφημένο περιεχόμενο HTTPS.
Buffers, νήματα και προσωρινή μνήμη
Τα εισερχόμενα συμβάντα και buffers είναι μόνο για ανάγνωση και ισχύουν μόνο κατά την εκτέλεση του callback. Οι εναλλακτικές αποκρίσεις πρέπει να χρησιμοποιούν μνήμη που ανήκει στη μονάδα και να παραμένουν έγκυρες μέχρι το επόμενο callback της μονάδας ή τον τερματισμό της. Μην επιστρέφετε μνήμη στοίβας ή δείκτες που δανειστήκατε από συμβάν. Το DNS ID, το opcode και το ερώτημα της εναλλακτικής απόκρισης πρέπει να ταιριάζουν με το αρχικό ερώτημα. Τα callbacks ενός στιγμιοτύπου εκτελούνται σειριακά, αλλά μπορεί να καλούνται από διαφορετικά νήματα. Ολοκληρώνετε τα callbacks γρήγορα και μην επιτρέπετε διάδοση εξαιρέσεων πέρα από το όριο ABI.
Αποτελέσματα που δημιουργήθηκαν, αντικαταστάθηκαν, αποκλείστηκαν ή απορρίφθηκαν δεν αποθηκεύονται στην προσωρινή μνήμη του host. Η αντικατάσταση αποθηκευμένης απόκρισης δεν αλλάζει την αρχική εγγραφή μνήμης. Ο host καθαρίζει τη σημαία AD των εναλλακτικών αποκρίσεων και δεν εκτελεί επαλήθευση ή νέα υπογραφή DNSSEC. Μονάδες που τροποποιούν υπογεγραμμένα δεδομένα πρέπει να διαχειρίζονται οι ίδιες τις υπογραφές που ακυρώνονται.
Παράδειγμα και κεφαλίδα
Οι παρακάτω σελίδες περιέχουν τον πλήρη πηγαίο κώδικα παραδείγματος και την απαιτούμενη κεφαλίδα. Δεν χρειάζεται να κατεβάσετε ξεχωριστά το δέντρο πηγαίου κώδικα του Mudfish DNS.
| Αρχείο | Περιεχόμενο |
|---|---|
| policy.c — παράδειγμα πολιτικής DNS | Αποδοχή, αποκλεισμός και απόρριψη ερωτημάτων DNS, δημιουργία απαντήσεων IP και αλλαγή διευθύνσεων απόκρισης και TTL. Περιλαμβάνει εντολές μεταγλώττισης και δοκιμής Linux. |
| mudfish_dns_module.h — κεφαλίδα μονάδων | Δηλώσεις ABI, υπογραφές hooks, σταθερές ενεργειών και κανόνες ιδιοκτησίας buffers. |
Πριν από τη μεταγλώττιση, κατεβάστε τα policy.c και mudfish_dns_module.h στον ίδιο κατάλογο. Η εντολή μεταγλώττισης του παραδείγματος δημιουργεί βιβλιοθήκη Linux .so.