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

تتناول هذه المقالة كيفية إعداد خادم بريد حديث.
Postfix + Dovecot. SPF + DKIM + rDNS. مع IPv6.
مع تشفير TLS. مع دعم نطاقات متعددة - جزء مع شهادة SSL حقيقية.
مع الحماية ضد البريد العشوائي والتصنيف العالي لمكافحة البريد العشوائي على خوادم البريد الأخرى.
مع دعم واجهات مادية متعددة.
مع OpenVPN ، الذي يتصل من خلال IPv4 ، والذي يعطي IPv6.

إذا كنت لا ترغب في تعلم كل هذه التقنيات ، ولكنك تريد تكوين مثل هذا الخادم ، فإن هذه المقالة مناسبة لك.

لا توجد محاولات لشرح كل التفاصيل في المقالة. يذهب التفسير إلى ما لم يتم تكوينه بشكل قياسي أو مهم من وجهة نظر المستهلك.

حلمي القديم هو إنشاء خادم بريد. قد يبدو الأمر سخيفًا ، لكن IMHO ، أفضل بكثير من الحلم بسيارة جديدة لعلامتك التجارية المفضلة.

الدافع لتكوين IPv6 هو اثنان. يحتاج متخصصو تكنولوجيا المعلومات إلى تعلم التقنيات الجديدة باستمرار من أجل البقاء. أود أن أقدم مساهمتي المتواضعة في مكافحة الرقابة.

الدافع لإعداد OpenVPN هو فقط لـ IPv6 للعمل على الجهاز المحلي.
الدافع لإعداد العديد من الواجهات المادية هو أن واجهة واحدة على الخادم الخاص بي "بطيئة ولكنها غير محدودة" والأخرى "سريعة ، ولكن مع تعريفة".

الدافع لإعداد إعدادات Bind هو أن مزود الخدمة الخاص بي يوفر خادم DNS غير مستقر ، وتعطل Google أيضًا. أريد خادم DNS مستقر للاستخدام الشخصي.

الدافع لكتابة مقال - تمت كتابة مسودة قبل 10 أشهر ، وقد نظرت فيها بالفعل مرتين. إذا كان المؤلف يحتاج إلى ذلك بانتظام ، فهناك احتمال كبير بأن الآخرين سيحتاجون إليه.

لا يوجد حل عالمي لخادم البريد. ولكن سأحاول أن أكتب شيئًا مثل "افعلها على هذا النحو ، وبعد ذلك ، عندما يعمل كل شيء كما ينبغي - التخلص من الفائض".

هناك خادم مملوك من tech.ru. من الممكن المقارنة مع OVH و Hetzner و AWS. لحل هذه المشكلة ، سيكون التعاون مع tech.ru أكثر فعالية.

دبيان 9 مثبت على الخادم.

يوجد على الخادم واجهتان `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 :: XXXX: / 64 مجموعة من عناوين IPv6 التي تم تخصيصها للواجهة `eno1` ومنه XXXX: XXXX: XXXX: XXXX: XXXX: 1: 2 :: / 96 ، بناءً على طلبي ، تم تعيينها لـ` eno2`.

هناك 3 نطاقات `domain1.com` ،` domain2.com` ، `domain3.com`. بالنسبة لـ `domain1.com` و` domain3.com` ، توجد شهادة SSL.

هناك حساب جوجل تريد ربط صندوق البريد `vasya.pupkin @ domain1.com` (تلقي البريد وإرسال البريد مباشرة من واجهة gmail).
يجب أن يكون هناك صندوق بريد `support @ domain2.com` ، نسخة من البريد الذي أريد رؤيته من خلال gmail الخاص بي. ونادرا ما يكون من الممكن إرسال شيء نيابة عن `support @ domain2.com` من خلال واجهة الويب.

يجب أن يكون هناك صندوق بريد `ivanov @ domain3.com` ، والذي سيستخدمه إيفانوف من جهاز iPhone الخاص به.

يجب أن تتوافق الرسائل المرسلة مع جميع متطلبات مكافحة البريد العشوائي الحالية.
يجب أن يكون هناك أعلى مستوى من التشفير المقدم على الشبكات العامة.
يجب أن يكون هناك دعم IPv6 لإرسال واستقبال رسائل البريد الإلكتروني.
يجب أن يكون هناك SpamAssassin لن يحذف رسائل البريد الإلكتروني أبدًا. وسيقوم إما بارتداد مجلد البريد العشوائي أو تخطيه أو إرساله إلى IMAP.
يجب تكوين التعلم التلقائي من SpamAssassin: إذا قمت بنقل الرسالة إلى مجلد البريد العشوائي ، فسوف أتعلم من هذا ؛ إذا قمت بنقل الرسالة من مجلد الرسائل غير المرغوب فيها ، فسوف أتعلم من ذلك. نتائج التعلم SpamAssassin - يجب أن تؤثر على مدى وصول الرسالة في مجلد البريد المزعج.
يجب أن تكون البرامج النصية Php قادرة على إرسال البريد نيابة عن أي مجال على هذا الخادم.
يجب أن تكون هناك خدمة openvpn مع إمكانية استخدام IPv6 على عميل ليس لديه IPv6.

تحتاج أولاً إلى تكوين الواجهات والتوجيه ، بما في ذلك IPv6.
ثم ستحتاج إلى تكوين OpenVPN ، والذي سيتصل عبر IPv4 وسيزود العميل بعنوان IPv6 ثابت. سيتمكن هذا العميل من الوصول إلى جميع خدمات IPv6 على الخادم والوصول إلى أي موارد IPv6 على الإنترنت.
ثم سيكون من الضروري تكوين Postfix لإرسال رسائل + 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 هو اسم بطاقة الشبكة الافتراضية من 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 محددة (لأنه تم تثبيت ربط محليًا) و 213.248.1.6 (هذا من tech.ru).

"Table 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.

لمزيد من الوضوح:
XXXX: XXXX: XXXX: XXXX: XXXX: 1: 1: YYYY: YYYY - هذه عناوين يجب تعيينها لمواقع أو خدمات محددة على واجهة eno1.
XXXX: XXXX: XXXX: XXXX: XXXX: 1: 2: YYYY: YYYY - هذه عناوين يجب تعيينها لمواقع أو خدمات معينة على واجهة eno2.
XXXX: XXXX: XXXX: XXXX: 1: 3: YYYY: YYYY هي عناوين يجب تعيينها لعملاء 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 والإنترنت ، تحتاج إلى تسجيل أحد هذه الأوامر.

في الحالات المختلفة ، أحد الخيارات غير مناسب.
كلا الفريقين مناسب لحالتي.
بعد قراءة الوثائق ، اخترت الخيار الأول ، لأنه يأكل أقل من وحدة المعالجة المركزية.

بحيث يتم التقاط جميع إعدادات 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="admin@domain1.com" 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 

سنقوم بتحضير الفرصة لإنشاء ملفات "اسم العميل .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}/${1}.crt \ <(echo -e '</cert>\n<key>') \ ${KEY_DIR}/${1}.key \ <(echo -e '</key>\n<tls-auth>') \ ${KEY_DIR}/ta.key \ <(echo -e '</tls-auth>') \ > ${OUTPUT_DIR}/${1}.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 بدون تعليق.
وكذلك وضع "مفتاح الاتجاه 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 

لماذا تمت كتابتها هنا - أجد صعوبة في تذكرها.

الآن يبدو قناع الشبكة الغريب = 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 



وفقًا لمواطني خابروفسك ، تحتوي هذه الكتلة على `` معلومات خاطئة وأطروحات كاذبة ''.
بعد 8 سنوات فقط من بداية مسيرتي ، بدأت أفهم كيف تعمل SSL.

لذلك ، سوف أتحرر من وصف كيفية استخدام SSL (بدون الإجابة على الأسئلة "كيف تعمل؟" و "لماذا تعمل؟").

أساس التشفير الحديث هو إنشاء زوج رئيسي (سطرين طويلين من الشخصيات).

أحد "المفاتيح" خاص والآخر "عام". نحن نحتفظ بالمفتاح الخاص بعناية شديدة في السر. نوزع المفتاح العام على الجميع.

باستخدام مفتاح عام ، يمكنك تشفير سلسلة نصية بحيث لا يمكن فك تشفير سوى مالك المفتاح الخاص.
حسنًا ، هذا هو أساس التكنولوجيا بالكامل.

الخطوة # 1 - مواقع https.
عند الوصول إلى الموقع ، يتعلم المستعرض من خادم الويب أن الموقع https وبالتالي يطلب مفتاحًا عامًا.
خادم الويب يعطي المفتاح العام. باستخدام المفتاح العام ، يقوم المتصفح بتشفير طلب http وإرساله.
يمكن قراءة محتوى http-request فقط من قبل شخص لديه مفتاح خاص ، أي الخادم الذي يتم إجراء المكالمة إليه فقط.
يحتوي طلب Http على URI على الأقل. لذلك ، إذا كانت الدولة تحاول تقييد الوصول ليس إلى الموقع بأكمله ، ولكن إلى صفحة محددة ، فلا يمكن القيام بذلك بالنسبة لمواقع https.

الخطوة رقم 2 هي الجواب المشفر.
يوفر خادم الويب إجابة يمكن قراءتها بسهولة على طول الطريق.
الحل بسيط للغاية - يقوم المتصفح محليًا بإنشاء نفس زوج المفاتيح الخاصة والعامة لكل موقع https.
وإلى جانب طلب المفتاح العام للموقع ، يرسل مفتاحه العام المحلي.
يتذكره خادم الويب ، وعند إرسال استجابة http ، يتم تشفير هذا المفتاح العام لعميل معين.
يمكن الآن فك تشفير استجابة http فقط بواسطة مالك المفتاح الخاص لمتصفح العميل (أي العميل نفسه).

الخطوة رقم 3 - إنشاء اتصال آمن من خلال قناة عامة.
في المثال رقم 2 ، هناك ثغرة أمنية - لا شيء يمنع من يرغبون في اعتراض طلب http وتحرير معلومات المفتاح العام.
وبالتالي ، سيشاهد الوسيط تقريبًا كل محتوى الرسائل المرسلة والمستلمة حتى تتغير قناة الاتصال.
مكافحة هذا أمر بسيط للغاية - فقط أرسل المفتاح العام للمتصفح كرسالة مشفرة بالمفتاح العام لخادم الويب.
يرسل خادم الويب أولاً ردًا مثل "مفتاحك العام هكذا" ويشفّر هذه الرسالة بنفس المفتاح العام.
ينظر المستعرض إلى الإجابة - إذا تم تلقي الرسالة "مفتاحك العام هكذا" - فهذا ضمان بنسبة 100٪ أن قناة الاتصال هذه آمنة.
ما مدى أمانها؟
يحدث إنشاء قناة الاتصال الآمنة هذه بنفس سرعة ping * 2. على سبيل المثال ، 20 مللي ثانية.
يجب أن يكون للمهاجم إما مفتاح خاص لأحد الطرفين مقدمًا. أو احصل على مفتاح خاص لبضع ثوان.
إن اختراق مفتاح خاص حديث سيستغرق عقودًا على الكمبيوتر العملاق.

الخطوة # 4 - قاعدة البيانات العامة للمفاتيح العامة.
من الواضح ، في هذه القصة بأكملها ، هناك احتمال لمهاجم يجلس على قناة الاتصال بين العميل والخادم.
يقدم الخادم الفرصة للعميل ، وللخادم الذي سيقدمه العميل. ومحاكاة زوج المفاتيح في كلا الاتجاهين.
ثم سيرى المهاجم كل حركة المرور وسيكون قادرًا على "تعديل" حركة المرور.
على سبيل المثال ، قم بتغيير العنوان الذي تريد إرسال الأموال إليه أو نسخ كلمة المرور من البنك عبر الإنترنت أو حظر المحتوى "المرفوض".
لمحاربة هؤلاء المهاجمين ، توصلوا إلى قاعدة بيانات عامة مع مفاتيح عامة لكل موقع https.
كل متصفح "يعرف" بوجود حوالي 200 من قواعد البيانات هذه. هذا مثبت مسبقًا في كل متصفح.
يتم دعم "المعرفة" بواسطة مفتاح عام لكل شهادة. أي أنه من المستحيل تزييف الاتصال مع كل مرجع مصدق محدد.

الآن هناك فهم بسيط لكيفية استخدام SSL لـ https.
إذا قمت بتحريك عقلك ، فسوف يتضح كيف يمكن للخدمات الخاصة كسر شيء ما في هذا التصميم. ولكن سيكلفهم ذلك جهودًا هائلة.
والمنظمات الأصغر من وكالة الأمن القومي أو وكالة المخابرات المركزية - يكاد يكون من المستحيل كسر مستوى الحماية الحالي ، حتى بالنسبة لكبار الشخصيات.

سأضيف أيضًا حول اتصالات ssh. لا توجد مفاتيح عامة ، ماذا تفعل. يتم حل المشكلة بطريقتين.
خيار كلمة مرور Ssh:
عند أول اتصال ، يجب أن يحذر عميل ssh من أنه لدينا هنا مفتاح عام جديد من خادم ssh.
ومع المزيد من الاتصالات ، إذا ظهر التحذير "مفتاح عام جديد من خادم ssh" ، فهذا يعني أنهم يحاولون الاستماع إليك.
أو في أول اتصال تم الاستماع إليه ، والآن تتحدث إلى الخادم بدون وسطاء.
في الواقع ، نظرًا لأن حقيقة التنصت على المكالمات الهاتفية يتم كشفها بسهولة وسرعة وبدون عناء ، يتم استخدام هذا الهجوم فقط في حالات خاصة لعميل معين.

خيار مفتاح SSH:
نأخذ محرك أقراص محمول ، ونكتب مفتاحًا خاصًا لخادم ssh عليه (لهذا توجد مصطلحات ومجموعة من الفروق الدقيقة المهمة ، لكنني أكتب برنامجًا تعليميًا ، وليس تعليمات للاستخدام).
نترك المفتاح العام على الجهاز حيث سيكون عميل ssh ونحافظ عليه أيضًا سراً.
نقوم بإحضار محرك الأقراص المحمول إلى الخادم ، ونقوم بإدخال المفتاح الخاص ونسخه ، وحرق محرك الأقراص المحمول ونثر الغبار في الريح (أو على الأقل تنسيقه بالأصفار).
هذا كل شيء - بعد هذه العملية سيكون من المستحيل قطع اتصال ssh. بالطبع ، على مدار 10 سنوات ، يمكنك رؤية حركة المرور على جهاز كمبيوتر فائق - ولكن هذه قصة مختلفة.

أعتذر عن الحمل والولادة.
حتى الآن أن النظرية معروفة. سأقول عن تدفق إنشاء شهادة SSL.

باستخدام "opensl 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 = + 

ربما لا يعرف الكثيرون ، لذلك يعد هذا رمزًا قياسيًا للرعي ، وهذا مدعوم من قبل معظم خوادم البريد الحديثة.

على سبيل المثال ، إذا كان لديك صندوق بريد "username@gmail.com" ، فحاول إرساله إلى "username+spam@gmail.com" - انظر ما يحدث.

 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 الآن أنه يمكنك فقط قبول البريد لإرسال المزيد عن طريق التفويض مع dovecot.

أنا حقا لا أفهم حقا لماذا يتم تكرار هذا هنا. لقد أشرنا بالفعل في virtual_transport كل ما هو مطلوب.

لكن نظام postfix قديم جدًا - ربما يكون القلاع من الأيام الخوالي.

 smtpd_recipient_restrictions = ... smtpd_helo_restrictions = ... smtpd_client_restrictions = ... 

تم تكوين هذا لكل خادم بريد بطريقته الخاصة.

لدي 3 خوادم بريد تحت تصرفي وهذه الإعدادات مختلفة جدًا بسبب متطلبات الاستخدام المختلفة.

يجب عليك التهيئة بعناية - وإلا فإن البريد العشوائي سيغرقك أو أسوأ من ذلك ، سيغرقك البريد العشوائي.

 # 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.

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

هذه تفاصيل رئيسية في توجيه البريد الإلكتروني عند إرسال رسائل البريد الإلكتروني من البرامج النصية php.

ملف "/etc/postfix/sdd_transport.pcre":

 /^www-domain1@domain1\.com$/ domain1: /^www-domain2@domain1\.com$/ domain2: /^www-domain3@domain1\.com$/ domain3: /@domain1\.com$/ domain1: /@domain2\.com$/ domain2: /@domain3\.com$/ domain3: 

— . — , .
Postfix — .

postfix — «master.cf».

4, 5, 6 — . — .
php «from». .

— nginx+fpm.

— linux-user . fpm-pool.

يستخدم Fpm-pool أي إصدار من php (يعد هذا رائعًا عندما يمكنك استخدام إصدار مختلف من php وحتى php.ini مختلف على نفس الخادم للمواقع المجاورة).

لذا ، فإن مستخدم www-domain2 خاص بـ Linux لديه موقع 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 - nn - 0 spawn user=policyd-spf argv=/usr/bin/policyd-spf spamassassin unix - nn - - 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 - nn - - pipe user=spamd argv=/usr/bin/spamc -f -e /usr/sbin/sendmail -oi -f ${sender} ${recipient} 

هذه هي الإعدادات المتعلقة بالسباماسين في وقت لاحق.

 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 - nn - 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 

. 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).

============== Dovecot ==============


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

تكوين الخلية ، تثبيت الحزم بأنفسهم.

ملف "/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 مطلوب.
والشهادة نفسها. وتفصيل مهم هو التوجيه "المحلي". يشير عند الاتصال بأي IPv4 محلي - أي شهادة SSL لاستخدامها.

بالمناسبة ، لم يتم تكوين IPv6 هنا ، سوف أقوم بتصحيح هذا الإغفال كموضوع في وقت لاحق.
XX.XX.XX.X5 (المجال 2) - لا توجد شهادة. لربط العملاء ، يجب تحديد 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 } 

هذا هو البرنامج المساعد لمكافحة البريد التطفلي. من الضروري تدريب spamassasin في وقت النقل من / إلى مجلد Spam.

ملف "/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 = admin@domain1.com } 

تكوين 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" في الخلية مع المستخدم "sa" بكلمة المرور "كلمة المرور" (استبدلها بشيء مناسب).

report_safe - بدلاً من الرسالة ، سيتم إرسال تقرير حول رسالة البريد العشوائي.
use_bayes هي إعدادات تعلُّم الآلة بواسطة البريد العشوائي.

تم تطبيق إعدادات spamassassin المتبقية سابقًا في المقالة.

الإعداد العام هو spamassassin .
حول نقل رسائل البريد الإلكتروني العشوائية الجديدة إلى مجلد IMAP Spam .
عن مجموعة بسيطة من Dovecot + SpamAssassin .
أوصي بقراءة نظرية تعلم spamassasin عند نقل الحروف في مجلدات imap (ولا أوصي باستخدامها) .

============== الاتصال بالمجتمع ==============


أود أيضًا أن أطرح فكرة على المجتمع حول كيفية زيادة مستوى أمان الرسائل المعاد توجيهها. لأنني منغمس بشدة في موضوع البريد.

حتى يتمكن المستخدم من إنشاء زوج مفاتيح على عميله (outlook ، thunderbird ، browser-plugin ، ...). عام وخاص. عام - إرسال إلى DNS. خاص - حفظ للعميل. يمكن لخوادم البريد استخدام المفتاح العام للإرسال إلى مستلم محدد.

وللحماية من الرسائل غير المرغوب فيها بمثل هذه الرسائل الإلكترونية (نعم ، لن يتمكن خادم البريد من رؤية المحتوى) - سيكون من الضروري تقديم 3 قواعد:

  1. توقيع DKIM حقيقي إلزامي ، SPF إلزامي ، rDNS إلزامي.
  2. شبكة عصبية حول موضوع التدريب على مكافحة البريد العشوائي + DB عليه من جانب العميل.
  3. يجب أن تكون خوارزمية التشفير بحيث يجب على الجانب المرسل أن ينفق طاقة وحدة المعالجة المركزية أكثر من 100 مرة على التشفير من جانب الاستقبال.

بالإضافة إلى الرسائل العامة - لوضع خطاب دعوة قياسي "لبدء المراسلات الآمنة". يرسل أحد المستخدمين (صندوق البريد) رسالة إلى صندوق البريد الآخر مع مرفق. في الرسالة ، اقتراح النص لبدء قناة اتصال آمنة للمراسلات والمفتاح العام لصاحب صندوق البريد (مع المفتاح الخاص على جانب العميل).

يمكنك أيضًا عمل زوج من المفاتيح خصيصًا لكل مراسلات. يمكن للمستخدم المستلم قبول هذا العرض وإرسال مفتاحه العمومي (المصمم خصيصًا لهذه المراسلات). بعد ذلك ، يرسل المستخدم الأول رسالة تحكم بالخدمة (مشفرة بالمفتاح العام للمستخدم الثاني) - عند الاستلام يمكن للمستخدم الثاني اعتبار قناة الاتصال المشكلة موثوقة. ثم يرسل المستخدم الثاني خطاب تحكم - ثم يمكن للمستخدم الأول أيضًا اعتبار القناة المشكلة محمية.

لمكافحة اعتراض المفاتيح على الطريق - من الضروري في البروتوكول توفير إمكانية إرسال مفتاح عام واحد على الأقل باستخدام محرك أقراص محمول.

والأهم من ذلك أن كل شيء يعمل (السؤال هو "من سيدفع ثمنه؟"):
تقديم شهادات بريدية بقيمة 10 دولارات لمدة 3 سنوات. مما يسمح للمرسل بالإشارة في نظام أسماء النطاقات إلى أن "مفاتيحي العامة موجودة". وسيعطون الفرصة لبدء اتصال آمن. في نفس الوقت ، خذ هذه المركبات مجانًا.
أخيرا يستثمر gmail مستخدميه. مقابل 10 دولارات في 3 سنوات - الحق في إنشاء قنوات المراسلات الآمنة.

============== الخلاصة ==============


لاختبار المقالة بأكملها ، كنت سأستأجر خادمًا مخصصًا لمدة شهر وشراء نطاق بشهادة SSL.

لكن ظروف الحياة تطورت لذا استمرت هذه المشكلة لمدة شهرين.
وعندما ظهر وقت الفراغ مرة أخرى - قررت نشر المقالة كما هي ، ولا أخاطر بتأخير النشر لمدة عام آخر.

إذا كان هناك الكثير من الأسئلة مثل "ولكن هذا لم يتم وصفه بتفاصيل كافية" - فمن المحتمل أن تكون هناك قوى لأخذ خادم مخصص مع نطاق جديد وشهادة SSL جديدة والوصف بمزيد من التفاصيل والأهم من ذلك - تحديد جميع التفاصيل المهمة المفقودة.

أرغب أيضًا في تلقي تعليقات حول موضوع الأفكار حول شهادات البريد. إذا كنت تحب الفكرة ، فسأحاول العثور على القوة لكتابة مسودة لـ rfc.

— .
— .
.

Source: https://habr.com/ru/post/ar413689/


All Articles