Debian + Postfix + Dovecot + Multidomain + SSL + IPv6 + OpenVPN + واجهات متعددة + SpamAssassin-Learn + Bind

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

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

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

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

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

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

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

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

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

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

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

يحتوي الخادم على واجهتين "eno2" و "eno1". الأول غير محدود ، والثاني سريع ، على التوالي.

هناك 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 وأريد ربط صندوق بريد به[البريد الإلكتروني محمي]"(استلام البريد وإرسال البريد مباشرة من واجهة gmail).
يجب أن يكون لديك صندوق بريد[البريد الإلكتروني محمي]"، نسخة من البريد الذي أرغب في رؤيته في gmail الخاص بي. ومن النادر أن تتمكن من إرسال شيء نيابة عن "[البريد الإلكتروني محمي]`عبر واجهة الويب.

يجب أن يكون لديك صندوق بريد[البريد الإلكتروني محمي]، والذي سيستخدمه إيفانوف من جهاز iPhone الخاص به.

يجب أن تمتثل رسائل البريد الإلكتروني المرسلة لجميع المتطلبات الحديثة لمكافحة البريد الإلكتروني العشوائي.
يجب أن يكون على أعلى مستوى من التشفير المقدم في الشبكات العامة.
يجب أن يكون هناك دعم IPv6 لكل من إرسال واستقبال رسائل البريد الإلكتروني.
يجب أن يكون SpamAssassin ، والذي لن يحذف رسائل البريد الإلكتروني أبدًا. وسوف يرتد أو يتخطى أو يرسل إلى مجلد IMAP Spam.
يجب تكوين التعلم التلقائي لـ 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 هو اسم 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 - 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: 1: 1: YYYY: YYYY هي العناوين التي يجب تعيينها لمواقع أو خدمات معينة على الواجهة eno1.
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="[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

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

الآن يبدو قناع شبكة غريبًا = 112 (يجب أن يكون 96 هناك).
والبادئة غريبة ، لا تتطابق مع شبكة tun0.
لكن حسنًا ، سأترك الأمر كما هو.

cipher DES-EDE3-CBC

هذا ليس للجميع - اخترت هذه الطريقة لتشفير الاتصال.

تعرف على المزيد حول تكوين OpenVPN IPv4.

تعرف على المزيد حول تكوين OpenVPN IPv6.

============ بوستفيكس ==============

تثبيت الحزمة الرئيسية:

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 فقط من قبل الشخص الذي لديه المفتاح الخاص ، أي فقط الخادم الذي يتم الوصول إليه.
يحتوي طلب Http على URI على الأقل. لذلك ، إذا حاولت دولة ما تقييد الوصول ليس إلى الموقع بأكمله ، ولكن إلى صفحة معينة ، فلا يمكن القيام بذلك لمواقع https.

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

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

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

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

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

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

أعتذر عن خارج الموضوع.

والآن بعد أن أصبحت النظرية معروفة. سأخبرك عن مسار إنشاء شهادة ssl.

بمساعدة "openssl genrsa" نقوم بإنشاء مفتاح خاص و "blanks" للمفتاح العام.
نرسل "فراغات" إلى شركة خارجية ، ندفع لها حوالي 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 ، وهو مدعوم من قبل معظم خوادم البريد الحديثة.

على سبيل المثال ، إذا كان لديك صندوق بريد "[البريد الإلكتروني محمي]»حاول الإرسال إلى«[البريد الإلكتروني محمي]- انظر ماذا سيحدث.

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

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

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

لكن نظام ما بعد الإصلاح قديم جدًا - من المحتمل أنه تم تشكيله من الأيام الخوالي.

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":

/^[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 في الكود القديم يشار إلى الحقل "from". ثم يأتي اسم المستخدم للإنقاذ.

المقالة شاملة بالفعل - لا أريد أن أتشتت انتباهي عن طريق إعداد nginx + fpm.

باختصار - قمنا بتعيين مالك مستخدم Linux الخاص بنا لكل موقع. وبناءً على ذلك ، تجمع fpm الخاص بك.

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

لذلك ، فإن مستخدم لينكس "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}

هذه هي الإعدادات المتعلقة بالبريد المزعج ، والمزيد عن ذلك لاحقًا.

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

وهذا هو الأكثر إثارة للاهتمام. هذه هي القدرة على إرسال رسائل بريد إلكتروني لمجال معين من عنوان IPv4 / IPv6 محدد.

يتم ذلك من أجل rDNS. يحصل rDNS على بعض السلسلة حسب عنوان IP.
وبالنسبة للبريد ، تُستخدم هذه الميزة لتأكيد أن helo يطابق تمامًا rDNS الخاص بالعنوان الذي تم إرسال البريد الإلكتروني منه.

إذا لم تتطابق 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

إعداد 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 {
  }
}

هذا هو ملف تكوين الحمامة الرئيسي.
هنا نقوم بتعطيل الاتصالات غير الآمنة.
وتمكين الاتصالات الآمنة.

ملف "/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 (المجال 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 في وقت النقل إلى / من مجلد "البريد العشوائي".

ملف "/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
}

إعدادات التدريب على Spamassas في وقت النقل إلى / من مجلد "البريد العشوائي".

ملف "/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

ملف التكوين الرئيسي.
المهم هو أننا نحدد ونضيف البروتوكولات هنا.

============= البريد العشوائي ==============

apt-get install spamassassin spamc

لنقم بتثبيت الحزم.

adduser spamd --disabled-login

إضافة مستخدم نيابة عن من.

systemctl enable spamassassin.service

تفعيل خدمة التحميل التلقائي للبريد المزعج عند التمهيد.

ملف "/ 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".
حول نقل رسائل البريد الإلكتروني العشوائية الجديدة إلى مجلد "البريد العشوائي" في IMAP.
حول مجموعة بسيطة من Dovecot + SpamAssassin.
أوصي بقراءة نظرية التعلم spamassasin عند نقل الأحرف في مجلدات imap (ولا أوصي باستخدامه).

============= نداء المجتمع ==============

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

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

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

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

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

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

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

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

============= خاتمة ==============

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

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

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

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

عند نسخ أجزاء كبيرة من مقالة ، حدد ارتباطًا لهذه المقالة.
عند الترجمة إلى أي لغة أخرى ، قم بتوفير ارتباط لهذه المقالة.
سأحاول الترجمة إلى الإنجليزية بنفسي وترك المراجع الترافقية.


المصدر: www.habr.com

إضافة تعليق