Debian + Postfix + Dovecot + Multidomain + SSL + IPv6 + OpenVPN + Multi-interfaces + SpamAssassin-learn + Bind

Αυτό το άρθρο αφορά τον τρόπο ρύθμισης ενός σύγχρονου διακομιστή αλληλογραφίας.
Postfix + Περιστεριώνα. SPF + DKIM + rDNS. με IPv6.
Με κρυπτογράφηση TSL. Με υποστήριξη για πολλαπλούς τομείς - το τμήμα με πραγματικό πιστοποιητικό SSL.
Με προστασία κατά της ανεπιθύμητης αλληλογραφίας και υψηλή βαθμολογία κατά της ανεπιθύμητης αλληλογραφίας από άλλους διακομιστές αλληλογραφίας.
Με υποστήριξη για πολλαπλές φυσικές διεπαφές.
Με το OpenVPN, η σύνδεση στο οποίο είναι μέσω IPv4 και που δίνει IPv6.

Εάν δεν θέλετε να μάθετε όλες αυτές τις τεχνολογίες, αλλά θέλετε να ρυθμίσετε έναν τέτοιο διακομιστή, τότε αυτό το άρθρο είναι για εσάς.

Αυτό το άρθρο δεν προσπαθεί να εξηγήσει κάθε λεπτομέρεια. Η εξήγηση πηγαίνει σε αυτό που δεν έχει ρυθμιστεί τυπικά ή είναι σημαντικό από την άποψη του καταναλωτή.

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

Τα κίνητρα για τη διαμόρφωση του IPv6 είναι δύο. Ένας ειδικός πληροφορικής πρέπει να μαθαίνει συνεχώς νέες τεχνολογίες για να επιβιώσει. Θα ήθελα να κάνω τη μέτρια συμβολή μου στον αγώνα κατά της λογοκρισίας.

Το κίνητρο για τη διαμόρφωση του OpenVPN είναι απλώς να λειτουργήσει το IPv6 στον τοπικό υπολογιστή.
Το κίνητρο για τη δημιουργία πολλαπλών φυσικών διεπαφών είναι ότι στον διακομιστή μου έχω τη μία «αργή αλλά απεριόριστη» διεπαφή και την άλλη «γρήγορη, αλλά με τιμολόγιο».

Το κίνητρο για τη ρύθμιση των ρυθμίσεων Bind είναι ότι ο ISP μου παρέχει έναν ασταθή διακομιστή DNS και το google μερικές φορές διακόπτεται επίσης. Θέλω έναν σταθερό διακομιστή DNS για προσωπική χρήση.

Το κίνητρο για να γράψω το άρθρο είναι ότι το προσχέδιο γράφτηκε πριν από 10 μήνες και το έχω ήδη εξετάσει δύο φορές. Ακόμα κι αν ο συγγραφέας το χρειάζεται τακτικά, τότε υπάρχει μεγάλη πιθανότητα να το χρειαστούν και άλλοι.

Δεν υπάρχει καθολική λύση για τον διακομιστή αλληλογραφίας. Αλλά θα προσπαθήσω να γράψω κάτι σαν «κάντε αυτό και μετά, όταν όλα λειτουργούν όπως πρέπει, πετάξτε την περίσσεια».

Υπάρχει ένας διακομιστής Colocation από το tech.ru. Είναι δυνατή η σύγκριση με OVH, Hetzner, AWS. Για την επίλυση αυτού του προβλήματος, η συνεργασία με το tech.ru θα είναι πολύ πιο αποτελεσματική.

Το Debian 9 είναι εγκατεστημένο στον διακομιστή.

Ο διακομιστής έχει 2 διεπαφές «eno1» και «eno2». Το πρώτο είναι απεριόριστο, και το δεύτερο είναι γρήγορο, αντίστοιχα.

Υπάρχουν 3 στατικές διευθύνσεις IP, XX.XX.XX.X0 και XX.XX.XX.X1 και XX.XX.XX.X2 στη διεπαφή «eno1» και XX.XX.XX.X5 στη διεπαφή «eno2» .

Διαθέσιμο XXXX:XXXX:XXXX:XXXX::/64 μια ομάδα διευθύνσεων IPv6 που έχουν εκχωρηθεί στη διεπαφή `eno1` και από αυτήν XXXX:XXXX:XXXX:XXXX:1:2::/96 εκχωρήθηκε στο `eno2` κατόπιν αιτήματός μου.

Υπάρχουν 3 τομείς «domain1.com», «domain2.com», «domain3.com». Υπάρχει ένα πιστοποιητικό SSL για το "domain1.com" και το "domain3.com".

Έχω έναν λογαριασμό google στον οποίο θέλω να συνδέσω ένα γραμματοκιβώτιο `[προστασία μέσω email]` (λήψη αλληλογραφίας και αποστολή αλληλογραφίας απευθείας από τη διεπαφή του gmail).
Πρέπει να έχει γραμματοκιβώτιο `[προστασία μέσω email]`, ένα αντίγραφο του μηνύματος από το οποίο θέλω να δω στο gmail μου. Και είναι σπάνιο να μπορείς να στείλεις κάτι για λογαριασμό του `[προστασία μέσω email]` μέσω της διεπαφής ιστού.

Πρέπει να έχει γραμματοκιβώτιο `[προστασία μέσω email]`, που θα χρησιμοποιήσει ο Ιβάνοφ από το iPhone του.

Τα μηνύματα ηλεκτρονικού ταχυδρομείου που αποστέλλονται πρέπει να συμμορφώνονται με όλες τις σύγχρονες απαιτήσεις για anti-spam.
Θα πρέπει να είναι το υψηλότερο επίπεδο κρυπτογράφησης που παρέχεται σε δημόσια δίκτυα.
Πρέπει να υπάρχει υποστήριξη IPv6 τόσο για την αποστολή όσο και για τη λήψη email.
Θα πρέπει να είναι το SpamAssassin, το οποίο δεν θα διαγράφει ποτέ μηνύματα ηλεκτρονικού ταχυδρομείου. Και είτε θα αναπηδήσει είτε θα παραλείψει ή θα σταλεί στον φάκελο Ανεπιθύμητα IMAP.
Η αυτόματη εκμάθηση του SpamAssassin πρέπει να ρυθμιστεί: εάν μετακινήσω ένα γράμμα στο φάκελο Spam, θα μάθει από αυτό. αν μετακινήσω ένα γράμμα από το φάκελο Ανεπιθύμητα, θα μάθει από αυτό. Τα αποτελέσματα της εκπαίδευσης στο SpamAssassin θα πρέπει να επηρεάσουν το εάν η επιστολή καταλήγει στο φάκελο Ανεπιθύμητα.
Τα σενάρια PHP θα πρέπει να μπορούν να στέλνουν μηνύματα για λογαριασμό οποιουδήποτε τομέα σε έναν δεδομένο διακομιστή.
Πρέπει να υπάρχει μια υπηρεσία openvpn, με δυνατότητα χρήσης IPv6 σε πελάτη που δεν έχει IPv6.

Πρώτα πρέπει να διαμορφώσετε τις διεπαφές και τη δρομολόγηση, συμπεριλαμβανομένου του IPv6.
Στη συνέχεια, θα χρειαστεί να διαμορφώσετε το OpenVPN, το οποίο θα συνδεθεί μέσω IPv4 και θα παρέχει στον πελάτη μια στατική-πραγματική διεύθυνση IPv6. Αυτός ο πελάτης θα έχει πρόσβαση σε όλες τις υπηρεσίες IPv6 στον διακομιστή και πρόσβαση σε οποιουσδήποτε πόρους IPv6 στο Διαδίκτυο.
Στη συνέχεια, θα χρειαστεί να διαμορφώσετε το Postfix για αποστολή email + SPF + DKIM + rDNS και άλλα μικρά πράγματα όπως αυτό.
Στη συνέχεια, θα χρειαστεί να διαμορφώσετε το Dovecot και να ρυθμίσετε τις παραμέτρους του Multidomain.
Στη συνέχεια, θα χρειαστεί να διαμορφώσετε το SpamAssassin και να ρυθμίσετε την εκπαίδευση.
Τέλος, εγκαταστήστε το Bind.

============= Πολλαπλές διεπαφές ==============

Για να διαμορφώσετε τις διεπαφές, πρέπει να το καταχωρήσετε στο "/etc/network/interfaces".

# The loopback network interface
auto lo
iface lo inet loopback

# The primary network interface
allow-hotplug eno1
iface eno1 inet static
        address XX.XX.XX.X0/24
        gateway XX.XX.XX.1
        dns-nameservers 127.0.0.1 213.248.1.6
        post-up ip route add XX.XX.XX.0/24 dev eno1 src XX.XX.XX.X0 table eno1t
        post-up ip route add default via XX.XX.XX.1 table eno1t
        post-up ip rule add table eno1t from XX.XX.XX.X0
        post-up ip rule add table eno1t to XX.XX.XX.X0

auto eno1:1
iface eno1:1 inet static
address XX.XX.XX.X1
netmask 255.255.255.0
        post-up ip rule add table eno1t from XX.XX.XX.X1
        post-up ip rule add table eno1t to XX.XX.XX.X1
        post-up   ip route add 10.8.0.0/24 dev tun0 src XX.XX.XX.X1 table eno1t
        post-down ip route del 10.8.0.0/24 dev tun0 src XX.XX.XX.X1 table eno1t

auto eno1:2
iface eno1:2 inet static
address XX.XX.XX.X2
netmask 255.255.255.0
        post-up ip rule add table eno1t from XX.XX.XX.X2
        post-up ip rule add table eno1t to XX.XX.XX.X2

iface eno1 inet6 static
        address XXXX:XXXX:XXXX:XXXX:1:1::/64
        gateway XXXX:XXXX:XXXX:XXXX::1
        up   ip -6 addr add XXXX:XXXX:XXXX:XXXX:1:1:1:1/64 dev $IFACE
        up   ip -6 addr add XXXX:XXXX:XXXX:XXXX:1:1:1:2/64 dev $IFACE
        down ip -6 addr del XXXX:XXXX:XXXX:XXXX:1:1:1:1/64 dev $IFACE
        down ip -6 addr del XXXX:XXXX:XXXX:XXXX:1:1:1:2/64 dev $IFACE

# The secondary network interface
allow-hotplug eno2
iface eno2 inet static
        address XX.XX.XX.X5
        netmask 255.255.255.0
        post-up   ip route add XX.XX.XX.0/24 dev eno2 src XX.XX.XX.X5 table eno2t
        post-up   ip route add default via XX.XX.XX.1 table eno2t
        post-up   ip rule add table eno2t from XX.XX.XX.X5
        post-up   ip rule add table eno2t to XX.XX.XX.X5
        post-up   ip route add 10.8.0.0/24 dev tun0 src XX.XX.XX.X5 table eno2t
        post-down ip route del 10.8.0.0/24 dev tun0 src XX.XX.XX.X5 table eno2t

iface eno2 inet6 static
        address XXXX:XXXX:XXXX:XXXX:1:2::/96
        up   ip -6 addr add XXXX:XXXX:XXXX:XXXX:1:2:1:1/64 dev $IFACE
        up   ip -6 addr add XXXX:XXXX:XXXX:XXXX:1:2:1:2/64 dev $IFACE
        down ip -6 addr del XXXX:XXXX:XXXX:XXXX:1:2:1:1/64 dev $IFACE
        down ip -6 addr del XXXX:XXXX:XXXX:XXXX:1:2:1:2/64 dev $IFACE

# OpenVPN network
iface tun0 inet6 static
        address XXXX:XXXX:XXXX:XXXX:1:3::/80

Αυτές οι ρυθμίσεις μπορούν να εφαρμοστούν σε οποιονδήποτε διακομιστή στο tech.ru (με λίγο συντονισμό με την υποστήριξη) και θα λειτουργήσει αμέσως όπως θα έπρεπε.

Εάν η εμπειρία της δημιουργίας παρόμοιων πραγμάτων για τον Hetzner, η OVH είναι διαφορετική εκεί. Πιο δύσκολο.

Το eno1 είναι το όνομα της κάρτας δικτύου #1 (αργή αλλά απεριόριστη).
Το eno2 είναι το όνομα της κάρτας δικτύου #2 (γρήγορη, αλλά με τιμολόγιο).
tun0 είναι το όνομα του εικονικού NIC από το OpenVPN.
XX.XX.XX.X0 - IPv4 #1 στο eno1.
XX.XX.XX.X1 - IPv4 #2 στο eno1.
XX.XX.XX.X2 - IPv4 #3 στο eno1.
XX.XX.XX.X5 - IPv4 #1 στο eno2.
XX.XX.XX.1 - πύλη IPv4.
XXXX:XXXX:XXXX:XXXX::/64 - IPv6 για ολόκληρο τον διακομιστή.
XXXX:XXXX:XXXX:XXXX:1:2::/96 - IPv6 για eno2, όλα τα άλλα πηγαίνουν στο eno1 από έξω.
XXXX:XXXX:XXXX:XXXX::1 - πύλη IPv6 (αξίζει να σημειωθεί ότι εδώ μπορείτε / πρέπει να το κάνετε διαφορετικά. Καθορίστε τον διακόπτη IPv6).
Καθορίζονται dns-nameservers - 127.0.0.1 (επειδή το bind εγκαθίσταται τοπικά) και 213.248.1.6 (αυτό είναι από το tech.ru).

"πίνακας eno1t" και "table eno2t" - η έννοια αυτών των κανόνων διαδρομής είναι ότι η κίνηση που εισέρχεται μέσω eno1 -> θα έφευγε μέσω αυτής και η κίνηση που εισέρχονταν μέσω eno2 -> θα έφευγε από αυτήν. Και επίσης οι συνδέσεις με πρωτοβουλία του διακομιστή θα έφευγαν μέσω του eno1.

ip route add default via XX.XX.XX.1 table eno1t

Με αυτήν την εντολή, ορίζουμε ότι οποιαδήποτε ακατανόητη κίνηση εμπίπτει σε οποιονδήποτε κανόνα που έχει την ένδειξη "πίνακας eno1t" -> να προωθηθεί στη διεπαφή eno1.

ip route add XX.XX.XX.0/24 dev eno1 src XX.XX.XX.X0 table eno1t

Με αυτήν την εντολή, καθορίζουμε ότι οποιαδήποτε κίνηση που ξεκινά από τον διακομιστή κατευθύνεται στη διεπαφή eno1.

ip rule add table eno1t from XX.XX.XX.X0
ip rule add table eno1t to XX.XX.XX.X0

Με αυτήν την εντολή, ορίζουμε τους ίδιους τους κανόνες κυκλοφορίας.

auto eno1:2
iface eno1:2 inet static
address XX.XX.XX.X2
netmask 255.255.255.0
        post-up ip rule add table eno1t from XX.XX.XX.X2
        post-up ip rule add table eno1t to XX.XX.XX.X2

Αυτό το μπλοκ καθορίζει ένα δεύτερο IPv4 για τη διεπαφή eno1.

ip route add 10.8.0.0/24 dev tun0 src XX.XX.XX.X1 table eno1t

Με αυτήν την εντολή, ορίζουμε τη διαδρομή από τους πελάτες OpenVPN σε τοπικό IPv4 εκτός από το XX.XX.XX.X0.
Γιατί αυτή η εντολή είναι αρκετή για όλα τα IPv4 - ακόμα δεν καταλαβαίνω.

iface eno1 inet6 static
        address XXXX:XXXX:XXXX:XXXX:1:1::/64
        gateway XXXX:XXXX:XXXX:XXXX::1

Ορίζουμε τη διεύθυνση για την ίδια τη διεπαφή. Ο διακομιστής θα το χρησιμοποιήσει ως "εξερχόμενη" διεύθυνση. Δεν θα χρησιμοποιηθούν περισσότερα.

Γιατί είναι τόσο περίπλοκο το ":1:1::"; Για να λειτουργεί σωστά το OpenVPN και μόνο για αυτό. Περισσότερα για αυτό αργότερα.

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

Ωστόσο, για κάποιο λόγο το IPv6 σταματά να λειτουργεί εάν το κάνω αυτό. Πιθανώς, αυτά είναι κάποια προβλήματα του tech.ru.

ip -6 addr add XXXX:XXXX:XXXX:XXXX:1:1:1:1/64 dev $IFACE

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

iface eno1 inet6 static
        address XXXX:XXXX:XXXX:XXXX:1:1::/64
...
iface eno2 inet6 static
        address XXXX:XXXX:XXXX:XXXX:1:2::/96
...
iface tun0 inet6 static
        address XXXX:XXXX:XXXX:XXXX:1:3::/80

Σημείωσα τις διευθύνσεις και τα υποδίκτυα όλων των διεπαφών για να το κάνω σαφές.
eno1 - πρέπει να είναι "/64- γιατί αυτή είναι ολόκληρη η δεξαμενή διευθύνσεών μας.
tun0 - το υποδίκτυο πρέπει να είναι μεγαλύτερο από eno1. Διαφορετικά, δεν θα μπορείτε να διαμορφώσετε την πύλη IPv6 για πελάτες OpenVPN.
eno2 - το υποδίκτυο πρέπει να είναι μεγαλύτερο από tun0. Διαφορετικά, οι πελάτες OpenVPN δεν θα μπορούν να φτάσουν στις τοπικές διευθύνσεις IPv6.
Για λόγους σαφήνειας, επέλεξα το βήμα 16 του υποδικτύου, αλλά αν θέλετε, μπορείτε να κάνετε ακόμη και ένα βήμα «1».
Αντίστοιχα, 64 + 16 = 80 και 80 + 16 = 96.

Για ακόμη μεγαλύτερη σαφήνεια:
ΧΧΧΧ:ΧΧΧ:ΧΧΧ:ΧΧΧ:1:1:ΕΕΕΕ:ΕΕΕΕ είναι οι διευθύνσεις που πρέπει να εκχωρηθούν σε συγκεκριμένους ιστότοπους ή υπηρεσίες στη διεπαφή eno1.
ΧΧΧΧ:ΧΧΧ:ΧΧΧ:ΧΧΧ:1:2:ΕΕΕΕ:ΕΕΕΕ είναι οι διευθύνσεις που πρέπει να εκχωρηθούν σε συγκεκριμένους ιστότοπους ή υπηρεσίες στη διεπαφή eno2.
ΧΧΧΧ:ΧΧΧ:ΧΧΧ:ΧΧΧ:1:3:ΕΕΕΕ:ΕΕΕΕ είναι διευθύνσεις που θα εκχωρηθούν σε πελάτες OpenVPN ή θα χρησιμοποιηθούν ως διευθύνσεις υπηρεσιών OpenVPN.

Για να ρυθμίσετε τις παραμέτρους του δικτύου, θα πρέπει να είναι δυνατή η επανεκκίνηση του διακομιστή.
Οι αλλαγές IPv4 λαμβάνονται κατά την εκτέλεση (φροντίστε να τις τυλίξετε στην οθόνη - διαφορετικά αυτή η εντολή απλώς θα διακόψει τη λειτουργία του δικτύου στον διακομιστή):

/etc/init.d/networking restart

Στο αρχείο "/etc/iproute2/rt_tables" προσθέστε στο τέλος:

100 eno1t
101 eno2t

Χωρίς αυτό, δεν μπορείτε να χρησιμοποιήσετε προσαρμοσμένους πίνακες στο αρχείο "/etc/network/interfaces".
Τα ψηφία πρέπει να είναι μοναδικά και λιγότερα από 65535.

Οι αλλαγές στο IPv6 αλλάζουν εύκολα χωρίς επανεκκίνηση, αλλά για αυτό πρέπει να μάθετε τουλάχιστον τρεις εντολές:

ip -6 addr ...
ip -6 route ...
ip -6 neigh ...

Ρύθμιση "/etc/sysctl.conf"

# Uncomment the next line to enable packet forwarding for IPv4
net.ipv4.ip_forward = 1

# Do not accept ICMP redirects (prevent MITM attacks)
net.ipv4.conf.all.accept_redirects = 0
net.ipv6.conf.all.accept_redirects = 0

# Do not send ICMP redirects (we are not a router)
net.ipv4.conf.all.send_redirects = 0

# For receiving ARP replies
net.ipv4.conf.all.arp_filter = 0
net.ipv4.conf.default.arp_filter = 0

# For sending ARP
net.ipv4.conf.all.arp_announce = 0
net.ipv4.conf.default.arp_announce = 0

# Enable IPv6
net.ipv6.conf.all.disable_ipv6 = 0
net.ipv6.conf.default.disable_ipv6 = 0
net.ipv6.conf.lo.disable_ipv6 = 0

# IPv6 configuration
net.ipv6.conf.all.autoconf = 1
net.ipv6.conf.all.accept_ra = 0

# For OpenVPN
net.ipv6.conf.all.forwarding = 1
net.ipv6.conf.all.proxy_ndp = 1

# For nginx on boot
net.ipv6.ip_nonlocal_bind = 1

Αυτές είναι οι ρυθμίσεις "sysctl" του διακομιστή μου. Θα επισημάνω κάτι σημαντικό.

net.ipv4.ip_forward = 1

Χωρίς αυτό, το OpenVPN δεν θα λειτουργήσει με κανέναν τρόπο.

net.ipv6.ip_nonlocal_bind = 1

Όποιος προσπαθήσει να συνδέσει το IPv6 (όπως το nginx) αμέσως μετά την άνοδο της διεπαφής θα λάβει ένα σφάλμα. Ότι μια τέτοια διεύθυνση δεν είναι διαθέσιμη.

Για να αποφευχθεί μια τέτοια κατάσταση, γίνεται μια τέτοια ρύθμιση.

net.ipv6.conf.all.forwarding = 1
net.ipv6.conf.all.proxy_ndp = 1

Χωρίς αυτές τις ρυθμίσεις IPv6, η κίνηση από το πρόγραμμα-πελάτη OpenVPN δεν βγαίνει στον κόσμο.

Οι άλλες ρυθμίσεις είτε είναι άσχετες είτε δεν θυμάμαι γιατί.
Αλλά για κάθε ενδεχόμενο, το αφήνω «ως έχει».

Για να γίνει λήψη των αλλαγών σε αυτό το αρχείο χωρίς επανεκκίνηση του διακομιστή, πρέπει να εκτελέσετε την εντολή:

sysctl -p

Περισσότερες λεπτομέρειες σχετικά με τους κανόνες του «πίνακα»: habr.com/post/108690

============= OpenVPN ===============

Το OpenVPN IPv4 δεν λειτουργεί χωρίς iptables.

Έχω iptables όπως αυτό για VPN:

iptables -A INPUT -p udp -s YY.YY.YY.YY --dport 1194 -j ACCEPT
iptables -A FORWARD -i tun0 -o eno1 -j ACCEPT
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eno1 -j SNAT --to-source XX.XX.XX.X0
##iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eno1 -j MASQUERADE
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p udp --dport 1194 -j DROP
iptables -A FORWARD -p udp --dport 1194 -j DROP

YY.YY.YY.YY είναι η στατική μου διεύθυνση IPv4 του τοπικού μηχανήματος.
10.8.0.0/24 - IPv4 openvpn δίκτυο. Διευθύνσεις IPv4 για πελάτες openvpn.
Η σειρά των κανόνων είναι σημαντική.

iptables -A INPUT -p udp -s YY.YY.YY.YY --dport 1194 -j ACCEPT
iptables -A FORWARD -i tun0 -o eno1 -j ACCEPT
...
iptables -A FORWARD -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -m state --state RELATED,ESTABLISHED -j ACCEPT
iptables -A INPUT -p udp --dport 1194 -j DROP
iptables -A FORWARD -p udp --dport 1194 -j DROP

Αυτός είναι ένας περιορισμός ώστε μόνο εγώ να μπορώ να χρησιμοποιώ το OpenVPN από τη στατική IP μου.

iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eno1 -j SNAT --to-source XX.XX.XX.X0
  -- или --
iptables -t nat -A POSTROUTING -s 10.8.0.0/24 -o eno1 -j MASQUERADE

Για να προωθήσετε πακέτα IPv4 μεταξύ των πελατών OpenVPN και του Διαδικτύου, πρέπει να καταχωρίσετε μία από αυτές τις εντολές.

Για διαφορετικές περιπτώσεις, μία από τις επιλογές δεν είναι κατάλληλη.
Και οι δύο εντολές είναι κατάλληλες για την περίπτωσή μου.
Αφού διάβασα την τεκμηρίωση, επέλεξα την πρώτη επιλογή, επειδή τρώει λιγότερο CPU.

Για να ληφθούν όλες οι ρυθμίσεις του iptables μετά την επανεκκίνηση, πρέπει να τις αποθηκεύσετε κάπου.

iptables-save > /etc/iptables/rules.v4
ip6tables-save > /etc/iptables/rules.v6

Αυτά τα ονόματα δεν επιλέχθηκαν τυχαία. Χρησιμοποιούνται από το πακέτο "iptables-persistent".

apt-get install iptables-persistent

Εγκατάσταση του κύριου πακέτου OpenVPN:

apt-get install openvpn easy-rsa

Ας ρυθμίσουμε ένα πρότυπο για πιστοποιητικά (αντικαταστήστε τις τιμές σας):

make-cadir ~/openvpn-ca
cd ~/openvpn-ca
ln -s openssl-1.0.0.cnf openssl.cnf

Ας επεξεργαστούμε τις ρυθμίσεις προτύπου πιστοποιητικού:

mcedit vars

...
# These are the default values for fields
# which will be placed in the certificate.
# Don't leave any of these fields blank.
export KEY_COUNTRY="RU"
export KEY_PROVINCE="Krasnodar"
export KEY_CITY="Dinskaya"
export KEY_ORG="Own"
export KEY_EMAIL="[email protected]"
export KEY_OU="VPN"

# X509 Subject Field
export KEY_NAME="server"
...

Δημιουργήστε ένα πιστοποιητικό διακομιστή:

cd ~/openvpn-ca
source vars
./clean-all
./build-ca
./build-key-server server
./build-dh
openvpn --genkey --secret keys/ta.key

Ας προετοιμάσουμε τη δυνατότητα δημιουργίας των τελικών αρχείων "client-name.opvn":

mkdir -p ~/client-configs/files
chmod 700 ~/client-configs/files
cp /usr/share/doc/openvpn/examples/sample-config-files/client.conf ~/client-configs/base.conf
mcedit ~/client-configs/base.conf

# Client mode
client

# Interface tunnel type
dev tun

# TCP protocol
proto tcp-client

# Address/Port of VPN server
remote XX.XX.XX.X0 1194

# Don't bind to local port/address
nobind

# Don't need to re-read keys and re-create tun at restart
persist-key
persist-tun

# Remote peer must have a signed certificate
remote-cert-tls server
ns-cert-type server

# Enable compression
comp-lzo

# Custom
ns-cert-type server
tls-auth ta.key 1
cipher DES-EDE3-CBC

Ας ετοιμάσουμε ένα σενάριο που θα συγχωνεύει όλα τα αρχεία σε ένα μόνο αρχείο opvn.

mcedit ~/client-configs/make_config.sh
chmod 700 ~/client-configs/make_config.sh

#!/bin/bash

# First argument: Client identifier

KEY_DIR=~/openvpn-ca/keys
OUTPUT_DIR=~/client-configs/files
BASE_CONFIG=~/client-configs/base.conf

cat ${BASE_CONFIG} 
    <(echo -e '<ca>') 
    ${KEY_DIR}/ca.crt 
    <(echo -e '</ca>n<cert>') 
    ${KEY_DIR}/.crt 
    <(echo -e '</cert>n<key>') 
    ${KEY_DIR}/.key 
    <(echo -e '</key>n<tls-auth>') 
    ${KEY_DIR}/ta.key 
    <(echo -e '</tls-auth>') 
    > ${OUTPUT_DIR}/.ovpn

Δημιουργία του πρώτου πελάτη OpenVPN:

cd ~/openvpn-ca
source vars
./build-key client-name
cd ~/client-configs
./make_config.sh client-name

Το αρχείο "~/client-configs/files/client-name.ovpn" αποστέλλεται στη συσκευή στον πελάτη.

Για πελάτες iOS, θα πρέπει να κάνετε το κόλπο:
Το περιεχόμενο της ετικέτας "tls-auth" πρέπει να είναι χωρίς σχόλια.
Επίσης, βάλτε το "key-direction 1" αμέσως πριν από την ετικέτα "tls-auth".

Ρυθμίστε τη διαμόρφωση διακομιστή OpenVPN:

cd ~/openvpn-ca/keys
cp ca.crt ca.key server.crt server.key ta.key dh2048.pem /etc/openvpn
gunzip -c /usr/share/doc/openvpn/examples/sample-config-files/server.conf.gz | tee /etc/openvpn/server.conf
mcedit /etc/openvpn/server.conf

# Listen port
port 1194

# Protocol
proto tcp-server

# IP tunnel
dev tun0
tun-ipv6
push tun-ipv6

# Master certificate
ca ca.crt

# Server certificate
cert server.crt

# Server private key
key server.key

# Diffie-Hellman parameters
dh dh2048.pem

# Allow clients to communicate with each other
client-to-client

# Client config dir
client-config-dir /etc/openvpn/ccd

# Run client-specific script on connection and disconnection
script-security 2
client-connect "/usr/bin/sudo -u root /etc/openvpn/server-clientconnect.sh"
client-disconnect "/usr/bin/sudo -u root /etc/openvpn/server-clientdisconnect.sh"

# Server mode and client subnets
server 10.8.0.0 255.255.255.0
server-ipv6 XXXX:XXXX:XXXX:XXXX:1:3::/80
topology subnet

# IPv6 routes
push "route-ipv6 XXXX:XXXX:XXXX:XXXX::/64"
push "route-ipv6 2000::/3"

# DNS (for Windows)
# These are OpenDNS
push "dhcp-option DNS 208.67.222.222"
push "dhcp-option DNS 208.67.220.220"

# Configure all clients to redirect their default network gateway through the VPN
push "redirect-gateway def1 bypass-dhcp"
push "redirect-gateway ipv6" #For iOS

# Don't need to re-read keys and re-create tun at restart
persist-key
persist-tun

# Ping every 10s. Timeout of 120s.
keepalive 10 120

# Enable compression
comp-lzo

# User and group
user vpn
group vpn

# Log a short status
status openvpn-status.log

# Logging verbosity
##verb 4

# Custom config
tls-auth ta.key 0
cipher DES-EDE3-CBC

Αυτό απαιτείται για να ορίσετε μια στατική διεύθυνση για κάθε πελάτη (δεν είναι απαραίτητο, αλλά τη χρησιμοποιώ):

# Client config dir
client-config-dir /etc/openvpn/ccd

Η πιο δύσκολη και βασική λεπτομέρεια.

Δυστυχώς, το OpenVPN δεν γνωρίζει ακόμη πώς να διαμορφώσει από μόνο του την πύλη IPv6 για πελάτες.
Πρέπει να το προωθήσετε "μη αυτόματα" για κάθε πελάτη.

# Run client-specific script on connection and disconnection
script-security 2
client-connect "/usr/bin/sudo -u root /etc/openvpn/server-clientconnect.sh"
client-disconnect "/usr/bin/sudo -u root /etc/openvpn/server-clientdisconnect.sh"

Αρχείο "/etc/openvpn/server-clientconnect.sh":

#!/bin/sh

# Check client variables
if [ -z "$ifconfig_pool_remote_ip" ] || [ -z "$common_name" ]; then
        echo "Missing environment variable."
        exit 1
fi

# Load server variables
. /etc/openvpn/variables

ipv6=""

# Find out if there is a specific config with fixed IPv6 for this client
if [ -f "/etc/openvpn/ccd/$common_name" ]; then
        # Get fixed IPv6 from client config file
        ipv6=$(sed -nr 's/^.*ifconfig-ipv6-push[ t]+([0-9a-fA-F:]+).*$/1/p' "/etc/openvpn/ccd/$common_name")
        echo $ipv6
fi

# Get IPv6 from IPv4
if [ -z "$ipv6" ]; then
        ipp=$(echo "$ifconfig_pool_remote_ip" | cut -d. -f4)
        if ! [ "$ipp" -ge 2 -a "$ipp" -le 254 ] 2>/dev/null; then
                echo "Invalid IPv4 part."
                exit 1
        fi
        hexipp=$(printf '%x' $ipp)
        ipv6="$prefix$hexipp"
fi

# Create proxy rule
/sbin/ip -6 neigh add proxy $ipv6 dev eno1

Αρχείο "/etc/openvpn/server-clientdisconnect.sh":

#!/bin/sh

# Check client variables
if [ -z "$ifconfig_pool_remote_ip" ] || [ -z "$common_name" ]; then
        echo "Missing environment variable."
        exit 1
fi

# Load server variables
. /etc/openvpn/variables

ipv6=""

# Find out if there is a specific config with fixed IPv6 for this client
if [ -f "/etc/openvpn/ccd/$common_name" ]; then
        # Get fixed IPv6 from client config file
        ipv6=$(sed -nr 's/^.*ifconfig-ipv6-push[ t]+([0-9a-fA-F:]+).*$/1/p' "/etc/openvpn/ccd/$common_name")
fi

# Get IPv6 from IPv4
if [ -z "$ipv6" ]; then
        ipp=$(echo "$ifconfig_pool_remote_ip" | cut -d. -f4)
        if ! [ "$ipp" -ge 2 -a "$ipp" -le 254 ] 2>/dev/null; then
                echo "Invalid IPv4 part."
                exit 1
        fi
        hexipp=$(printf '%x' $ipp)
        ipv6="$prefix$hexipp"
fi

# Delete proxy rule
/sbin/ip -6 neigh del proxy $ipv6 dev eno1

Και τα δύο σενάρια χρησιμοποιούν το αρχείο "/etc/openvpn/variables":

# Subnet
prefix=XXXX:XXXX:XXXX:XXXX:2:
# netmask
prefixlen=112

Γιατί είναι τόσο γραμμένο εδώ - δυσκολεύομαι να το θυμηθώ.

Τώρα φαίνεται περίεργο netmask = 112 (θα έπρεπε να είναι 96 ακριβώς εκεί).
Και το πρόθεμα είναι περίεργο, δεν ταιριάζει με το δίκτυο tun0.
Αλλά εντάξει, θα το αφήσω ως έχει.

cipher DES-EDE3-CBC

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

Μάθετε περισσότερα σχετικά με τη ρύθμιση του OpenVPN IPv4.

Μάθετε περισσότερα σχετικά με τη ρύθμιση του OpenVPN IPv6.

============ Postfix ===============

Εγκατάσταση του κύριου πακέτου:

apt-get install postfix

Κατά την εγκατάσταση, επιλέξτε «Ιστότοπος Διαδικτύου».

Το "/etc/postfix/main.cf" μου μοιάζει με αυτό:

smtpd_banner = $myhostname ESMTP $mail_name (Debian/GNU)
biff = no

# appending .domain is the MUA's job.
append_dot_mydomain = no

readme_directory = no

# See http://www.postfix.org/COMPATIBILITY_README.html -- default to 2 on
# fresh installs.
compatibility_level = 2

# TLS parameters
smtpd_tls_cert_file=/etc/ssl/domain1.com.2018.chained.crt
smtpd_tls_key_file=/etc/ssl/domain1.com.2018.key
smtpd_use_tls=yes
smtpd_tls_auth_only = yes
smtp_bind_address = XX.XX.XX.X0
smtp_bind_address6 = XXXX:XXXX:XXXX:XXXX:1:1:1:1

smtp_tls_security_level = may
smtp_tls_ciphers = export
smtp_tls_protocols = !SSLv2, !SSLv3
smtp_tls_loglevel = 1

smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated defer_unauth_destination
myhostname = domain1.com
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
myorigin = domain1.com
mydestination = localhost
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
inet_protocols = ipv4

internal_mail_filter_classes = bounce

# Storage type
virtual_transport = lmtp:unix:private/dovecot-lmtp
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf

# SMTP-Auth settings
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_recipient_restrictions =
        permit_sasl_authenticated,
        permit_mynetworks,
        #reject_invalid_hostname,
        #reject_unknown_recipient_domain,
        reject_unauth_destination,
        reject_rbl_client sbl.spamhaus.org,
        check_policy_service unix:private/policyd-spf

smtpd_helo_restrictions =
        #reject_invalid_helo_hostname,
        #reject_non_fqdn_helo_hostname,
        reject_unknown_helo_hostname

smtpd_client_restrictions =
        permit_mynetworks,
        permit_sasl_authenticated,
        reject_non_fqdn_helo_hostname,
        permit

# SPF
policyd-spf_time_limit = 3600

# OpenDKIM
milter_default_action = accept
milter_protocol = 6
smtpd_milters = unix:var/run/opendkim/opendkim.sock
non_smtpd_milters = unix:var/run/opendkim/opendkim.sock

# IP address per domain
sender_dependent_default_transport_maps = pcre:/etc/postfix/sdd_transport.pcre

Ας δούμε τις λεπτομέρειες αυτής της διαμόρφωσης.

smtpd_tls_cert_file=/etc/ssl/domain1.com.2018.chained.crt
smtpd_tls_key_file=/etc/ssl/domain1.com.2018.key

Σύμφωνα με τους Khabrovites, αυτό το μπλοκ περιέχει «παραπληροφόρηση και λανθασμένες διατριβές».Μόλις 8 χρόνια μετά την έναρξη της καριέρας μου, άρχισα να καταλαβαίνω πώς λειτουργεί το SSL.

Ως εκ τούτου, θα πάρω την ελευθερία να περιγράψω τον τρόπο χρήσης του SSL (χωρίς να απαντήσω στις ερωτήσεις "Πώς λειτουργεί;" και "Γιατί λειτουργεί;").

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

Το ένα "κλειδί" είναι ιδιωτικό, το άλλο κλειδί είναι "δημόσιο". Το ιδιωτικό κλειδί διατηρείται πολύ προσεκτικά μυστικό. Διανέμουμε το δημόσιο κλειδί σε όλους.

Χρησιμοποιώντας το δημόσιο κλειδί, μπορείτε να κρυπτογραφήσετε μια συμβολοσειρά κειμένου έτσι ώστε μόνο ο κάτοχος του ιδιωτικού κλειδιού να μπορεί να την αποκρυπτογραφήσει.
Λοιπόν, αυτή είναι όλη η βάση της τεχνολογίας.

Βήμα #1 - ιστότοποι https.
Το πρόγραμμα περιήγησης, κατά την πρόσβαση στον ιστότοπο, μαθαίνει από τον διακομιστή ιστού ότι ο ιστότοπος είναι https και επομένως ζητά το δημόσιο κλειδί.
Ο διακομιστής web δίνει το δημόσιο κλειδί. Το πρόγραμμα περιήγησης χρησιμοποιεί το δημόσιο κλειδί για να κρυπτογραφήσει το αίτημα http και το στέλνει.
Το περιεχόμενο ενός αιτήματος http μπορεί να διαβαστεί μόνο από όσους έχουν το ιδιωτικό κλειδί, δηλαδή μόνο τον διακομιστή στον οποίο υποβάλλεται το αίτημα.
Το αίτημα Http περιέχει τουλάχιστον ένα URI. Επομένως, εάν μια χώρα προσπαθεί να περιορίσει την πρόσβαση όχι σε ολόκληρο τον ιστότοπο, αλλά σε μια συγκεκριμένη σελίδα, τότε αυτό είναι αδύνατο να γίνει για ιστότοπους https.

Βήμα #2 - κρυπτογραφημένη απάντηση.
Ο διακομιστής ιστού παρέχει μια απάντηση που μπορεί να διαβαστεί εύκολα στο δρόμο.
Η λύση είναι εξαιρετικά απλή - το πρόγραμμα περιήγησης δημιουργεί τοπικά το ίδιο ζεύγος ιδιωτικού-δημόσιου κλειδιού για κάθε ιστότοπο https.
Και μαζί με το αίτημα για το δημόσιο κλειδί του ιστότοπου, στέλνει το τοπικό δημόσιο κλειδί του.
Ο διακομιστής ιστού το θυμάται και, όταν στέλνει την απάντηση http, το κρυπτογραφεί με αυτό το δημόσιο κλειδί ενός συγκεκριμένου πελάτη.
Τώρα το http-response μπορεί να αποκρυπτογραφηθεί μόνο από τον κάτοχο του ιδιωτικού κλειδιού του προγράμματος περιήγησης του πελάτη (δηλαδή τον ίδιο τον πελάτη).

Βήμα νούμερο 3 - δημιουργία ασφαλούς σύνδεσης μέσω δημόσιου καναλιού.
Υπάρχει μια ευπάθεια στο παράδειγμα Νο. 2 - τίποτα δεν εμποδίζει τους καλοθελητές να υποκλέψουν το αίτημα http και να επεξεργαστούν τις πληροφορίες σχετικά με το δημόσιο κλειδί.
Έτσι, ο ενδιάμεσος θα μπορεί να δει άψογα ολόκληρο το περιεχόμενο των μηνυμάτων που αποστέλλονται και λαμβάνονται μέχρι να αλλάξει το κανάλι επικοινωνίας.
Η αντιμετώπιση αυτού του θέματος είναι εξαιρετικά απλή - απλώς στείλτε το δημόσιο κλειδί του προγράμματος περιήγησης ως μήνυμα κρυπτογραφημένο με το δημόσιο κλειδί του διακομιστή web.
Στη συνέχεια, ο διακομιστής ιστού στέλνει πρώτα μια απάντηση όπως "το δημόσιο κλειδί σας είναι έτσι" και κρυπτογραφεί αυτό το μήνυμα με το ίδιο δημόσιο κλειδί.
Το πρόγραμμα περιήγησης εξετάζει την απάντηση - εάν ληφθεί το μήνυμα "το δημόσιο κλειδί σας είναι έτσι", τότε αυτό αποτελεί εγγύηση 100% ότι αυτό το κανάλι επικοινωνίας είναι ασφαλές.
Πόσο ασφαλές είναι;
Η ίδια η δημιουργία ενός τέτοιου ασφαλούς καναλιού επικοινωνίας συμβαίνει με ταχύτητα ping * 2. Για παράδειγμα 20 ms.
Ο εισβολέας πρέπει είτε να έχει το ιδιωτικό κλειδί ενός από τα μέρη εκ των προτέρων. Ή πάρτε ένα ιδιωτικό κλειδί σε μερικά χιλιοστά του δευτερολέπτου.
Το σπάσιμο ενός σύγχρονου ιδιωτικού κλειδιού θα χρειαζόταν δεκαετίες σε έναν υπερυπολογιστή.

Βήμα #4 - δημόσια βάση δεδομένων δημόσιων κλειδιών.
Προφανώς, σε όλη αυτή την ιστορία υπάρχει η ευκαιρία για έναν εισβολέα να καθίσει στο κανάλι επικοινωνίας μεταξύ του πελάτη και του διακομιστή.
Η δυνατότητα ο πελάτης να εμφανίζεται ως διακομιστής και ο διακομιστής να εμφανίζεται ως πελάτης. Και μιμηθείτε ένα ζευγάρι πλήκτρα και προς τις δύο κατευθύνσεις.
Τότε ο εισβολέας θα δει όλη την κίνηση και θα μπορεί να «επεξεργαστεί» την κίνηση.
Για παράδειγμα, αλλάξτε τη διεύθυνση όπου μπορείτε να στείλετε χρήματα ή αντιγράψτε τον κωδικό πρόσβασης από την ηλεκτρονική τράπεζα ή αποκλείστε "απαράδεκτο" περιεχόμενο.
Για να καταπολεμήσουν τέτοιους εισβολείς, δημιούργησαν μια δημόσια βάση δεδομένων με δημόσια κλειδιά για κάθε ιστότοπο https.
Κάθε πρόγραμμα περιήγησης «γνωρίζει» για την ύπαρξη περίπου 200 τέτοιων βάσεων δεδομένων. Έρχεται προεγκατεστημένο με κάθε πρόγραμμα περιήγησης.
Το "Knowledge" υποστηρίζεται από ένα δημόσιο κλειδί από κάθε πιστοποιητικό. Δηλαδή, η σύνδεση με κάθε συγκεκριμένη αρχή πιστοποίησης δεν μπορεί να πλαστογραφηθεί.

Τώρα υπάρχει μια απλή κατανόηση του τρόπου χρήσης του SSL για https.
Εάν χρησιμοποιήσετε τον εγκέφαλό σας, θα καταστεί σαφές πώς οι ειδικές υπηρεσίες μπορούν να χακάρουν κάτι σε αυτή τη δομή. Αλλά θα τους κοστίσει τερατώδεις προσπάθειες.
Και για οργανισμούς μικρότερους από την NSA ή τη CIA, είναι σχεδόν αδύνατο να σπάσουν το υπάρχον επίπεδο προστασίας ακόμη και για το vip.

Θα προσθέσω επίσης σχετικά με τις συνδέσεις ssh. Δεν υπάρχουν δημόσια κλειδιά εκεί, οπότε τι μπορείτε να κάνετε; Το θέμα λύνεται με δύο τρόπους.
Επιλογή ssh-by-password:
Στην πρώτη σύνδεση, ο πελάτης ssh θα πρέπει να προειδοποιήσει ότι έχουμε ένα νέο δημόσιο κλειδί από τον διακομιστή ssh εδώ.
Και με περαιτέρω συνδέσεις, εάν εμφανιστεί μια προειδοποίηση "ένα νέο δημόσιο κλειδί από τον διακομιστή ssh", αυτό θα σημαίνει ότι προσπαθούν να σας ακούσουν.
Ή με την πρώτη σύνδεση ακούσατε, και τώρα επικοινωνείτε με τον διακομιστή χωρίς μεσάζοντες.
Στην πραγματικότητα, λόγω του γεγονότος ότι το γεγονός της υποκλοπής αποκαλύπτεται εύκολα, γρήγορα και αβίαστα, αυτή η επίθεση χρησιμοποιείται μόνο σε ειδικές περιπτώσεις για έναν συγκεκριμένο πελάτη.

Επιλογή ssh-by-key:
Παίρνουμε μια μονάδα flash, γράφουμε ένα ιδιωτικό κλειδί για τον διακομιστή ssh σε αυτό (υπάρχουν όροι και πολλές βασικές αποχρώσεις για αυτό, αλλά γράφω ένα εκπαιδευτικό πρόγραμμα, όχι οδηγίες χρήσης).
Αφήνουμε το δημόσιο κλειδί στο μηχάνημα όπου θα βρίσκεται ο πελάτης ssh και το κρατάμε επίσης μυστικό.
Φέρνουμε τη μονάδα flash στον διακομιστή, την επικολλάμε, αντιγράφουμε το ιδιωτικό κλειδί και καίμε τη μονάδα flash και σκορπίζουμε τις στάχτες στον άνεμο (ή τουλάχιστον τη μορφοποιούμε με μηδενικό padding).
Αυτό είναι όλο - μετά από μια τέτοια λειτουργία θα είναι αδύνατο να χακάρετε μια τέτοια σύνδεση ssh. Φυσικά, σε 10 χρόνια θα είναι δυνατό να βλέπουμε κίνηση σε έναν υπερυπολογιστή - αλλά αυτό είναι μια διαφορετική ιστορία.

Ζητώ συγγνώμη για το offtopic.

Λοιπόν, τώρα που η θεωρία είναι γνωστή. Θα σας πω για τη ροή δημιουργίας πιστοποιητικού ssl.

Με τη βοήθεια του "openssl genrsa" δημιουργούμε ένα ιδιωτικό κλειδί και "κενά" για το δημόσιο κλειδί.
Στέλνουμε "κενά" σε μια τρίτη εταιρεία, στην οποία πληρώνουμε περίπου 9 $ για το απλούστερο πιστοποιητικό.

Μετά από μερικές ώρες, λαμβάνουμε το "δημόσιο" κλειδί μας και ένα σύνολο από πολλά δημόσια κλειδιά από αυτήν την τρίτη εταιρεία.

Γιατί να πληρώσει μια τρίτη εταιρεία για την εγγραφή του δημόσιου κλειδιού μου είναι ξεχωριστή ερώτηση, δεν θα το εξετάσουμε εδώ.

Τώρα είναι σαφές ποιο είναι το νόημα της επιγραφής:

smtpd_tls_key_file=/etc/ssl/domain1.com.2018.key

Ο φάκελος "/etc/ssl" περιέχει όλα τα αρχεία για ερωτήσεις ssl.
domain1.com είναι το όνομα του τομέα.
Το 2018 είναι η χρονιά της δημιουργίας κλειδιών.
"κλειδί" είναι ο προσδιορισμός ότι το αρχείο είναι ιδιωτικό κλειδί.

Και το νόημα αυτού του αρχείου:

smtpd_tls_cert_file=/etc/ssl/domain1.com.2018.chained.crt
domain1.com είναι το όνομα του τομέα.
Το 2018 είναι η χρονιά της δημιουργίας κλειδιών.
αλυσοδεμένο - χαρακτηρισμός ότι υπάρχει αλυσίδα δημόσιων κλειδιών (το πρώτο είναι το δημόσιο κλειδί μας και τα υπόλοιπα είναι αυτά που προήλθαν από την εταιρεία που εξέδωσε το δημόσιο κλειδί).
crt - προσδιορισμός ότι υπάρχει έτοιμο πιστοποιητικό (δημόσιο κλειδί με τεχνικές επεξηγήσεις).

smtp_bind_address = XX.XX.XX.X0
smtp_bind_address6 = XXXX:XXXX:XXXX:XXXX:1:1:1:1

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

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

Τότε αποδείξτε σε όλους ότι δεν είστε ένοχοι.

recipient_delimiter = +

Ίσως πολλοί να μην το γνωρίζουν, επομένως αυτός είναι ο τυπικός χαρακτήρας για την κατάταξη του pasem και υποστηρίζεται από τους περισσότερους σύγχρονους διακομιστές αλληλογραφίας.

Για παράδειγμα, εάν έχετε γραμματοκιβώτιο "[προστασία μέσω email]» προσπαθήστε να στείλετε σε «[προστασία μέσω email]- Δείτε τι γίνεται.

inet_protocols = ipv4

Αυτό μπορεί να προκαλεί σύγχυση.

Αλλά δεν είναι μόνο αυτό. Κάθε νέος τομέας - από προεπιλογή μόνο IPv4, στη συνέχεια ενεργοποιώ το IPv6 για καθένα ξεχωριστά.

virtual_transport = lmtp:unix:private/dovecot-lmtp
virtual_mailbox_domains = mysql:/etc/postfix/mysql-virtual-mailbox-domains.cf
virtual_mailbox_maps = mysql:/etc/postfix/mysql-virtual-mailbox-maps.cf
virtual_alias_maps = mysql:/etc/postfix/mysql-virtual-alias-maps.cf

Εδώ διευκρινίζουμε ότι όλα τα εισερχόμενα μηνύματα πηγαίνουν στο Dovecot.
Και οι κανόνες για τομέα, γραμματοκιβώτιο, ψευδώνυμο - αναζητήστε στη βάση δεδομένων.

/etc/postfix/mysql-virtual-mailbox-domains.cf

user = usermail
password = mailpassword
hosts = 127.0.0.1
dbname = servermail
query = SELECT 1 FROM virtual_domains WHERE name='%s'

/etc/postfix/mysql-virtual-mailbox-maps.cf

user = usermail
password = mailpassword
hosts = 127.0.0.1
dbname = servermail
query = SELECT 1 FROM virtual_users WHERE email='%s'

/etc/postfix/mysql-virtual-alias-maps.cf

user = usermail
password = mailpassword
hosts = 127.0.0.1
dbname = servermail
query = SELECT destination FROM virtual_aliases WHERE source='%s'

# SMTP-Auth settings
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes

Τώρα η postfix γνωρίζει ότι είναι δυνατή η αποδοχή αλληλογραφίας για περαιτέρω αποστολή μόνο με εξουσιοδότηση με περιστεριώνα.

Δεν καταλαβαίνω πραγματικά γιατί αυτό επαναλαμβάνεται εδώ. Έχουμε ήδη υποδείξει όλα όσα χρειάζονται στο "virtual_transport".

Αλλά το σύστημα postfix είναι πολύ παλιό - μάλλον είναι μια αναδρομή από τα παλιά.

smtpd_recipient_restrictions =
        ...

smtpd_helo_restrictions =
        ...

smtpd_client_restrictions =
        ...

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

Έχω 3 διακομιστές αλληλογραφίας στη διάθεσή μου και αυτές οι ρυθμίσεις είναι πολύ διαφορετικές λόγω διαφορετικών απαιτήσεων χρήσης.

Πρέπει να το διαμορφώσετε προσεκτικά - διαφορετικά θα σας πλημμυρίσει το spam ή ακόμα χειρότερα - το spam θα πλημμυρίσει από εσάς.

# SPF
policyd-spf_time_limit = 3600

Ρύθμιση για κάποια προσθήκη που σχετίζεται με τον έλεγχο του SPF των εισερχόμενων γραμμάτων.

# OpenDKIM
milter_default_action = accept
milter_protocol = 6
smtpd_milters = unix:var/run/opendkim/opendkim.sock
non_smtpd_milters = unix:var/run/opendkim/opendkim.sock

Η ρύθμιση είναι ότι πρέπει να παρέχουμε μια υπογραφή DKIM με όλα τα εξερχόμενα email.

# IP address per domain
sender_dependent_default_transport_maps = pcre:/etc/postfix/sdd_transport.pcre

Αυτή είναι μια βασική λεπτομέρεια στη δρομολόγηση email κατά την αποστολή email από σενάρια php.

Αρχείο "/etc/postfix/sdd_transport.pcre":

/^[email protected]$/ domain1:
/^[email protected]$/ domain2:
/^[email protected]$/ domain3:
/@domain1.com$/             domain1:
/@domain2.com$/             domain2:
/@domain3.com$/             domain3:

Στα αριστερά υπάρχουν κανονικές εκφράσεις. Στα δεξιά υπάρχει μια ετικέτα που επισημαίνει το γράμμα.
Postfix σύμφωνα με την ετικέτα - θα λάβει υπόψη μερικές ακόμη γραμμές διαμόρφωσης για ένα συγκεκριμένο γράμμα.

Το πώς ακριβώς θα διαμορφωθεί εκ νέου το postfix για ένα συγκεκριμένο γράμμα θα υποδειχθεί στο "master.cf".

Οι γραμμές 4, 5, 6 είναι οι κύριες. Για λογαριασμό ποιου τομέα στέλνουμε μια επιστολή - βάζουμε μια τέτοια ετικέτα.
Αλλά όχι πάντα στα σενάρια php στον παλιό κώδικα υποδεικνύεται το πεδίο "από". Στη συνέχεια, το όνομα χρήστη έρχεται στη διάσωση.

Το άρθρο είναι ήδη εκτενές - δεν θα ήθελα να αποσπάσω την προσοχή ρυθμίζοντας το nginx + fpm.

Εν συντομία - ορίσαμε τον δικό μας ιδιοκτήτη χρήστη linux για κάθε ιστότοπο. Και ανάλογα τα fpm-pool σας.

Το Fpm-pool χρησιμοποιεί οποιαδήποτε έκδοση php (είναι υπέροχο όταν μπορείτε να χρησιμοποιήσετε διαφορετικές εκδόσεις php και ακόμη και διαφορετικές php.ini στον ίδιο διακομιστή χωρίς προβλήματα για γειτονικούς ιστότοπους).

Έτσι, ένας συγκεκριμένος χρήστης linux "www-domain2" έχει έναν ιστότοπο domain2.com. Αυτός ο ιστότοπος έχει έναν κωδικό για την αποστολή μηνυμάτων ηλεκτρονικού ταχυδρομείου χωρίς να προσδιορίσετε το πεδίο από.

Έτσι και σε αυτή την περίπτωση τα γράμματα θα φύγουν σωστά και δεν θα πέσουν ποτέ σε ανεπιθύμητα.

Το "/etc/postfix/master.cf" μου μοιάζει με αυτό:

...
smtp      inet  n       -       y       -       -       smtpd
  -o content_filter=spamassassin
...
submission inet n       -       y       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
...
policyd-spf  unix  -       n       n       -       0       spawn
    user=policyd-spf argv=/usr/bin/policyd-spf

spamassassin unix -     n       n       -       -       pipe
    user=spamd argv=/usr/bin/spamc -f -e
    /usr/sbin/sendmail -oi -f ${sender} ${recipient}
...
domain1  unix -       -       n       -       -       smtp
   -o smtp_bind_address=XX.XX.XX.X1
   -o smtp_helo_name=domain1.com
   -o inet_protocols=all
   -o smtp_bind_address6=XXXX:XXXX:XXXX:XXXX:1:1:1:1
   -o syslog_name=postfix-domain1

domain2  unix -       -       n       -       -       smtp
   -o smtp_bind_address=XX.XX.XX.X5
   -o smtp_helo_name=domain2.com
   -o inet_protocols=all
   -o smtp_bind_address6=XXXX:XXXX:XXXX:XXXX:1:2:1:1
   -o syslog_name=postfix-domain2

domain3  unix -       -       n       -       -       smtp
   -o smtp_bind_address=XX.XX.XX.X2
   -o smtp_helo_name=domain3
   -o inet_protocols=all
   -o smtp_bind_address6=XXXX:XXXX:XXXX:XXXX:1:1:5:1
   -o syslog_name=postfix-domain3

Το αρχείο δεν εμφανίζεται πλήρως - είναι ήδη πολύ μεγάλο.
Σημείωσα μόνο τι άλλαξε.

smtp      inet  n       -       y       -       -       smtpd
  -o content_filter=spamassassin
...
spamassassin unix -     n       n       -       -       pipe
    user=spamd argv=/usr/bin/spamc -f -e
    /usr/sbin/sendmail -oi -f ${sender} ${recipient}

Αυτές είναι ρυθμίσεις που σχετίζονται με το spamassasin, περισσότερα για αυτό αργότερα.

submission inet n       -       y       -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject

Σας επιτρέπουμε να συνδεθείτε στον διακομιστή αλληλογραφίας μέσω της θύρας 587.
Για να το κάνετε αυτό, πρέπει να συνδεθείτε.

policyd-spf  unix  -       n       n       -       0       spawn
    user=policyd-spf argv=/usr/bin/policyd-spf

Ενεργοποιήστε τον έλεγχο SPF.

apt-get install postfix-policyd-spf-python

Ας εγκαταστήσουμε το πακέτο για ελέγχους SPF παραπάνω.

domain1  unix -       -       n       -       -       smtp
   -o smtp_bind_address=XX.XX.XX.X1
   -o smtp_helo_name=domain1.com
   -o inet_protocols=all
   -o smtp_bind_address6=XXXX:XXXX:XXXX:XXXX:1:1:1:1
   -o syslog_name=postfix-domain1

Και αυτό είναι το πιο ενδιαφέρον. Αυτή είναι η δυνατότητα αποστολής email για έναν συγκεκριμένο τομέα από μια συγκεκριμένη διεύθυνση IPv4/IPv6.

Αυτό γίνεται για χάρη του rDNS. Το rDNS λαμβάνει κάποια συμβολοσειρά ανά διεύθυνση IP.
Και για την αλληλογραφία, αυτή η δυνατότητα χρησιμοποιείται για να επιβεβαιώσει ότι το helo ταιριάζει ακριβώς με το rDNS της διεύθυνσης από την οποία στάλθηκε το email.

Εάν το helo δεν ταιριάζει με τον τομέα αλληλογραφίας για λογαριασμό του οποίου στάλθηκε η επιστολή, απονέμονται πόντοι ανεπιθύμητης αλληλογραφίας.

Το Helo δεν ταιριάζει με το rDNS - απονέμονται πολλοί πόντοι ανεπιθύμητης αλληλογραφίας.
Αντίστοιχα, κάθε τομέας πρέπει να έχει τη δική του διεύθυνση IP.
Για το OVH, είναι δυνατό να καθοριστεί το rDNS στην κονσόλα.
Για το tech.ru, το πρόβλημα επιλύεται μέσω υποστήριξης.
Για το AWS, το πρόβλημα επιλύεται μέσω υποστήριξης.
"inet_protocols" και "smtp_bind_address6" - ενεργοποιούμε την υποστήριξη IPv6.
Για το IPv6 πρέπει επίσης να καταχωρήσετε rDNS.
"syslog_name" - και αυτό είναι για τη διευκόλυνση της ανάγνωσης των αρχείων καταγραφής.

Αγοράστε πιστοποιητικά προτείνουμε εδώ.

Ρύθμιση συνδέσμου postfix+dovecot εδώ.

Ρύθμιση SPF.

============= Περιστεριώνα ==============

apt-get install dovecot-imapd dovecot-pop3d dovecot-lmtpd dovecot-mysql dovecot-antispam

Ρυθμίζοντας το mysql, εγκαταστήστε τα ίδια τα πακέτα.

Αρχείο "/etc/dovecot/conf.d/10-auth.conf"

disable_plaintext_auth = yes
auth_mechanisms = plain login

Η εξουσιοδότηση είναι κρυπτογραφημένη μόνο.

Αρχείο "/etc/dovecot/conf.d/10-mail.conf"

mail_location = maildir:/var/mail/vhosts/%d/%n

Εδώ υποδεικνύουμε τη θέση αποθήκευσης των γραμμάτων.

Θέλω να αποθηκευτούν σε αρχεία και να ομαδοποιηθούν ανά τομέα.

Αρχείο "/etc/dovecot/conf.d/10-master.conf"

service imap-login {
  inet_listener imap {
    port = 0
  }
  inet_listener imaps {
    address = XX.XX.XX.X1, XX.XX.XX.X2, XX.XX.XX.X5, [XXXX:XXXX:XXXX:XXXX:1:1:1:1], [XXXX:XXXX:XXXX:XXXX:1:2:1:1], [XXXX:XXXX:XXXX:XXXX:1:1:5:1]
    port = 993
    ssl = yes
  }
}
service pop3-login {
  inet_listener pop3 {
    port = 0
  }
  inet_listener pop3s {
    address = XX.XX.XX.X1, XX.XX.XX.X2, XX.XX.XX.X5, [XXXX:XXXX:XXXX:XXXX:1:1:1:1], [XXXX:XXXX:XXXX:XXXX:1:2:1:1], [XXXX:XXXX:XXXX:XXXX:1:1:5:1]
    port = 995
    ssl = yes
  }
}
service lmtp {
  unix_listener /var/spool/postfix/private/dovecot-lmtp {
    mode = 0600
    user = postfix
    group = postfix
  }
}
service imap {
}
service pop3 {
}
service auth {
  unix_listener auth-userdb {
    mode = 0600
    user = vmail
  }

  unix_listener /var/spool/postfix/private/auth {
    mode = 0666
    user = postfix
    group = postfix
  }
  user = dovecot
}
service auth-worker {
  user = vmail
}
service dict {
  unix_listener dict {
  }
}

Αυτό είναι το κύριο αρχείο διαμόρφωσης Dovecot.
Εδώ απενεργοποιούμε τις μη ασφαλείς συνδέσεις.
Και ενεργοποιήστε ασφαλείς συνδέσεις.

Αρχείο "/etc/dovecot/conf.d/10-ssl.conf"

ssl = required
ssl_cert = </etc/nginx/ssl/domain1.com.2018.chained.crt
ssl_key = </etc/nginx/ssl/domain1.com.2018.key
local XX.XX.XX.X5 {
  ssl_cert = </etc/nginx/ssl/domain2.com.2018.chained.crt
  ssl_key =  </etc/nginx/ssl/domain2.com.2018.key
}

Ρύθμιση ssl. Υποδεικνύουμε ότι απαιτείται ssl.
Και το ίδιο το πιστοποιητικό. Και μια σημαντική λεπτομέρεια είναι η «τοπική» οδηγία. Καθορίζει ποιο πιστοποιητικό ssl θα χρησιμοποιείται κατά τη σύνδεση σε ποιο τοπικό IPv4.

Παρεμπιπτόντως, το IPv6 δεν έχει ρυθμιστεί εδώ, θα διορθώσω αυτήν την παράλειψη ως νήμα αργότερα.
XX.XX.XX.X5 (domain2) - χωρίς πιστοποιητικό. Για να συνδέσετε πελάτες, πρέπει να καθορίσετε το domain1.com.
XX.XX.XX.X2 (domain3) - υπάρχει πιστοποιητικό, μπορείτε να καθορίσετε domain1.com ή domain3.com για να συνδέσετε πελάτες.

Αρχείο "/etc/dovecot/conf.d/15-lda.conf"

protocol lda {
  mail_plugins = $mail_plugins sieve
}

Αυτό θα χρειαστεί αργότερα για spamassassin.

Αρχείο "/etc/dovecot/conf.d/20-imap.conf"

protocol imap {
  mail_plugins = $mail_plugins antispam
}

Αυτό είναι ένα πρόσθετο antispam. Απαιτείται για την εκπαίδευση του spamassasin τη στιγμή της μεταφοράς προς / από το φάκελο "Ανεπιθύμητα".

Αρχείο "/etc/dovecot/conf.d/20-pop3.conf"

protocol pop3 {
}

Υπάρχει ακριβώς ένα τέτοιο αρχείο.

Αρχείο "/etc/dovecot/conf.d/20-lmtp.conf"

protocol lmtp {
  mail_plugins = $mail_plugins sieve
  postmaster_address = [email protected]
}

Ρύθμιση lmtp.

Αρχείο "/etc/dovecot/conf.d/90-antispam.conf"

plugin {
  antispam_backend = pipe
  antispam_trash = Trash;trash
  antispam_spam = Junk;Spam;SPAM
  antispam_pipe_program_spam_arg = --spam
  antispam_pipe_program_notspam_arg = --ham
  antispam_pipe_program = /usr/bin/sa-learn
  antispam_pipe_program_args = --username=%Lu
}

Ρυθμίσεις εκπαίδευσης Spamassasin τη στιγμή της μεταφοράς προς / από το φάκελο "Ανεπιθύμητα".

Αρχείο "/etc/dovecot/conf.d/90-sieve.conf"

plugin {
  sieve = ~/.dovecot.sieve
  sieve_dir = ~/sieve
  sieve_after = /var/lib/dovecot/sieve/default.sieve
}

Ένα αρχείο που καθορίζει τι να κάνετε με τα εισερχόμενα μηνύματα.

Αρχείο "/var/lib/dovecot/sieve/default.sieve"

require ["fileinto", "mailbox"];

if header :contains "X-Spam-Flag" "YES" {
        fileinto :create "Spam";
}

Είναι απαραίτητο να μεταγλωττίσετε το αρχείο: "sievec default.sieve".

Αρχείο "/etc/dovecot/conf.d/auth-sql.conf.ext"

passdb {
  driver = sql
  args = /etc/dovecot/dovecot-sql.conf.ext
}
userdb {
  driver = static
  args = uid=vmail gid=vmail home=/var/mail/vhosts/%d/%n
}

Καθορισμός αρχείων sql για εξουσιοδότηση.
Και το ίδιο το αρχείο - ως τρόπος εξουσιοδότησης.

Αρχείο "/etc/dovecot/dovecot-sql.conf.ext"

driver = mysql
connect = host=127.0.0.1 dbname=servermail user=usermail password=password
default_pass_scheme = SHA512-CRYPT
password_query = SELECT email as user, password FROM virtual_users WHERE email='%u';

Αυτό αντιστοιχεί σε παρόμοιες ρυθμίσεις για το postfix.

Αρχείο "/etc/dovecot/dovecot.conf"

protocols = imap lmtp pop3
listen = *, ::
dict {
}
!include conf.d/*.conf
!include_try local.conf

Κύριο αρχείο ρυθμίσεων.
Αυτό που είναι σημαντικό είναι ότι προσδιορίζουμε-προσθέτουμε πρωτόκολλα εδώ.

============= SpamAssassin ===============

apt-get install spamassassin spamc

Ας εγκαταστήσουμε τα πακέτα.

adduser spamd --disabled-login

Ας προσθέσουμε έναν χρήστη για λογαριασμό του οποίου.

systemctl enable spamassassin.service

Ενεργοποιήστε την αυτόματη φόρτωση της υπηρεσίας spamassassin κατά την εκκίνηση.

Αρχείο "/etc/default/spamassassin":

CRON=1

Ενεργοποιώντας την αυτόματη ενημέρωση κανόνων από προεπιλογή.

Αρχείο "/etc/spamassassin/local.cf":

report_safe 0

use_bayes          1
bayes_auto_learn   1
bayes_auto_expire  1
bayes_store_module Mail::SpamAssassin::BayesStore::MySQL
bayes_sql_dsn      DBI:mysql:sa:localhost:3306
bayes_sql_username sa
bayes_sql_password password

Είναι απαραίτητο να δημιουργήσετε μια βάση δεδομένων «sa» στο mysql με τον χρήστη «sa» με τον κωδικό «password» (αντικαταστήστε με κάτι κατάλληλο).

report_safe - αυτό θα στείλει μια αναφορά ανεπιθύμητης αλληλογραφίας αντί για μια επιστολή.
Οι use_bayes είναι ρυθμίσεις μηχανικής εκμάθησης spamassassin.

Οι υπόλοιπες ρυθμίσεις spamassassin εφαρμόστηκαν νωρίτερα στο άρθρο.

Γενική ρύθμιση "spamasassin".
Σχετικά με τη μεταφορά νέων ανεπιθύμητων μηνυμάτων ηλεκτρονικού ταχυδρομείου στον φάκελο "Ανεπιθύμητα" IMAP.
Σχετικά με έναν απλό συνδυασμό Dovecot + SpamAssassin.
Συνιστώ να διαβάζετε τη θεωρία εκμάθησης spamassasin όταν μετακινείτε γράμματα σε φακέλους imap (και δεν το συνιστώ για χρήση).

============= Έκκληση κοινότητας ===============

Θα ήθελα επίσης να ρίξω μια ιδέα στην κοινότητα για το πώς να αυξηθεί το επίπεδο ασφάλειας των προωθούμενων επιστολών. Επειδή είμαι τόσο βαθιά βυθισμένος στο θέμα της αλληλογραφίας.

Για να μπορεί ο χρήστης να δημιουργήσει ένα ζεύγος κλειδιών στον πελάτη του (outlook, thunderbird, πρόγραμμα περιήγησης-πρόσθετο, ...). Δημόσιο και ιδιωτικό. Δημόσιο - αποστολή σε DNS. Ιδιωτικό - εξοικονόμηση στον πελάτη. Οι διακομιστές αλληλογραφίας θα μπορούν να χρησιμοποιούν το δημόσιο κλειδί για αποστολή σε συγκεκριμένο παραλήπτη.

Και για προστασία από ανεπιθύμητα μηνύματα με τέτοια γράμματα (ναι, ο διακομιστής αλληλογραφίας δεν θα μπορεί να δει το περιεχόμενο) - θα χρειαστεί να εισαγάγετε 3 κανόνες:

  1. Υποχρεωτική αληθινή υπογραφή DKIM, υποχρεωτικό SPF, υποχρεωτικό rDNS.
  2. Ένα νευρωνικό δίκτυο για το θέμα της εκμάθησης anti-spam + μια βάση δεδομένων για αυτό στην πλευρά του πελάτη.
  3. Ο αλγόριθμος κρυπτογράφησης πρέπει να είναι τέτοιος ώστε η πλευρά αποστολής πρέπει να ξοδεύει 100 φορές περισσότερη ισχύ CPU στην κρυπτογράφηση από την πλευρά λήψης.

Εκτός από τις δημόσιες επιστολές, αναπτύξτε ένα πρότυπο για μια επιστολή προσφοράς για να «ξεκινήσετε μια ασφαλή αλληλογραφία». Ένας από τους χρήστες (γραμματοκιβώτιο) στέλνει μια επιστολή με συνημμένο σε άλλο γραμματοκιβώτιο. Στην επιστολή, ένα κείμενο-πρόταση για την έναρξη ενός ασφαλούς καναλιού επικοινωνίας για την αλληλογραφία και το δημόσιο κλειδί του ιδιοκτήτη του γραμματοκιβωτίου (με το ιδιωτικό κλειδί στην πλευρά του πελάτη).

Μπορείτε ακόμη και να φτιάξετε μερικά κλειδιά ειδικά για κάθε αλληλογραφία. Ο παραλήπτης χρήστης μπορεί να αποδεχτεί αυτήν την προσφορά και να στείλει το δημόσιο κλειδί του (επίσης κατασκευασμένο ειδικά για αυτήν την αλληλογραφία). Στη συνέχεια, ο πρώτος χρήστης στέλνει μια επιστολή ελέγχου υπηρεσίας (κρυπτογραφημένη με το δημόσιο κλειδί του δεύτερου χρήστη), μετά την παραλαβή της οποίας ο δεύτερος χρήστης μπορεί να θεωρήσει αξιόπιστο το διαμορφωμένο κανάλι επικοινωνίας. Στη συνέχεια, ο δεύτερος χρήστης στέλνει μια επιστολή ελέγχου - και στη συνέχεια ο πρώτος χρήστης μπορεί επίσης να θεωρήσει το σχηματισμένο κανάλι ασφαλές.

Για την καταπολέμηση της υποκλοπής κλειδιών στο δρόμο, είναι απαραίτητο να προβλεφθεί η δυνατότητα μεταφοράς τουλάχιστον ενός δημόσιου κλειδιού χρησιμοποιώντας μονάδα flash στο πρωτόκολλο.

Και το πιο σημαντικό είναι ότι όλα λειτουργούν (το ερώτημα είναι "ποιος θα πληρώσει για αυτό;"):
Εισαγάγετε ταχυδρομικά πιστοποιητικά αξίας από $10 για 3 χρόνια. Το οποίο θα επιτρέψει στον αποστολέα να καθορίσει σε dns ότι "τα δημόσια κλειδιά μου βρίσκονται εκεί". Και θα δώσουν την ευκαιρία να ξεκινήσετε μια ασφαλή σύνδεση. Ταυτόχρονα - να αποδεχτείτε τέτοιες συνδέσεις δωρεάν.
Το gmail επιτέλους δημιουργεί έσοδα από τους χρήστες του. Για 10 $ σε 3 χρόνια - το δικαίωμα δημιουργίας ασφαλών καναλιών αλληλογραφίας.

============= Συμπέρασμα ===============

Για να δοκιμάσω ολόκληρο το άρθρο, επρόκειτο να νοικιάσω έναν αποκλειστικό διακομιστή για ένα μήνα και να αγοράσω έναν τομέα με πιστοποιητικό ssl.

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

Εάν υπάρχουν πολλές ερωτήσεις όπως "αλλά δεν περιγράφεται με επαρκείς λεπτομέρειες εδώ", τότε πιθανότατα θα υπάρχει η δύναμη να πάρετε έναν αποκλειστικό διακομιστή με έναν νέο τομέα και ένα νέο πιστοποιητικό SSL και να τον περιγράψετε με περισσότερες λεπτομέρειες, και το πιο σημαντικό , προσδιορίστε όλες τις σημαντικές λεπτομέρειες που χάθηκαν.

Θα ήθελα επίσης να λαμβάνω σχόλια σχετικά με την ιδέα των πιστοποιητικών αλληλογραφίας. Αν σας αρέσει η ιδέα, θα προσπαθήσω να βρω τη δύναμη να γράψω ένα προσχέδιο για το rfc.

Όταν αντιγράφετε μεγάλα τμήματα ενός άρθρου, παρέχετε έναν σύνδεσμο προς αυτό το άρθρο.
Όταν μεταφράζετε σε οποιαδήποτε άλλη γλώσσα, παρέχετε έναν σύνδεσμο προς αυτό το άρθρο.
Θα προσπαθήσω να μεταφράσω μόνος μου στα αγγλικά και θα αφήσω παραπομπές.


Πηγή: www.habr.com

Προσθέστε ένα σχόλιο