ما يبنيه هذا الدليل
خادم بريد متكامل لنطاق واحد: Postfix للنقل، Dovecot لـIMAP والتسليم المحلي، rspamd للتصفية وتوقيع DKIM، وسجلات DNS الثلاثة التي تحدد ما إذا كان المستقبلون الكبار سيضعون بريدك في صندوق الوارد أو في مجلد لا يفتحه أحد. يرسل ويستقبل ويصادق، وليس مرحّلًا مفتوحًا.
تشغيل بريدك الخاص نصيحة غير رائجة وهذا في الغالب لسبب وجيه. قابلية التسليم هي الجزء الصعب، وليس البرنامج. إذا أخطأت في DNS، فحتى أفضل تكوين Postfix في العالم سيرسل الرسائل إلى العدم.
قبل أن تبدأ
- خادم R-8 أو أكبر. التصفية تستهلك المعالج بكثافة، وrspamd سيستخدم بكل سرور كل نواة تمنحها إياه أثناء موجة سبام.
- نطاق تتحكم في DNS الخاص به، وصبر على انتشار السجلات.
- DNS عكسي مضبوط على عنوان المثيل ليكون مطابقًا لاسم مضيف بريدك. يمكنك تحريره من اللوحة، وهو إلزامي: المستقبلون يرفضون المرسلين غير القابلين للحل.
- تذكرة واحدة إلى الدعم تسأل فيها عما إذا كان منفذ 25 الصادر مفتوحًا على مثيلك. اسأل قبل البناء، وليس بعده.
mail.example.comفي كل مكان. استبدلها بقيمك الخاصة.
1. اسم المضيف وDNS
hostnamectl set-hostname mail.example.com
apt update && apt full-upgrade -yانشر هذه السجلات الآن، لأن خطوة الشهادة تحتاج إلى سجل A وخطوة التوقيع تحتاج إلى مكان لوضع مفتاح. القيم في الجدول توضح ما يفعله كل سجل، وليس ما يجب لصقه.
| السجل | الاسم | المحتوى |
|---|---|---|
| A / AAAA | mail | عناوين المثيل من اللوحة |
| MX | @ | 10 mail.example.com. |
| TXT | @ | v=spf1 mx -all |
| TXT | _dmarc | v=DMARC1; p=none; rua=mailto:[email protected]; adkim=s; aspf=s |
| PTR | عنوان المثيل | mail.example.com — يتم ضبطه في اللوحة |
سجل SPF يقول: خوادم MX الخاصة بي ترسل بريدي، وكل شيء آخر مزور. فشل صارم وليس فشلًا لينًا، لأن ~all يدعو المستقبلين إلى اتخاذ قرارهم الخاص، وقرارهم لن يكون سخيًا. يبدأ DMARC عند p=none بحيث تجمع التقارير لمدة أسبوع قبل رفض أي شيء باسمك.
2. الشهادات
apt install -y certbot
certbot certonly --standalone -d mail.example.comلا شيء يستمع على المنفذ 80 بعد، لذا الوضع المستقل هو أبسط مسار. تأتي خطافات التجديد في النهاية، بمجرد وجود الخدمات لإعادة تحميلها.
3. Postfix
DEBIAN_FRONTEND=noninteractive apt install -y postfix postfix-pcre dovecot-imapd dovecot-lmtpd rspamd redis-serverالآن اضبط تكوين النقل. كل سطر أدناه مقصود؛ postconf يكتبها في مكانها فلا يوجد محرر يمكن الخطأ فيه:
postconf -e "myhostname = mail.example.com"
postconf -e "mydestination = localhost"
postconf -e "smtpd_banner = \$myhostname ESMTP"
postconf -e "inet_interfaces = all"
postconf -e "smtpd_tls_cert_file = /etc/letsencrypt/live/mail.example.com/fullchain.pem"
postconf -e "smtpd_tls_key_file = /etc/letsencrypt/live/mail.example.com/privkey.pem"
postconf -e "smtpd_tls_security_level = may"
postconf -e "smtp_tls_security_level = dane"
postconf -e "smtpd_tls_mandatory_protocols = >=TLSv1.2"
postconf -e "smtpd_sasl_type = dovecot"
postconf -e "smtpd_sasl_path = private/auth"
postconf -e "smtpd_relay_restrictions = permit_mynetworks permit_sasl_authenticated reject_unauth_destination"
postconf -e "smtpd_recipient_restrictions = permit_mynetworks permit_sasl_authenticated reject_unknown_recipient_domain reject_unauth_destination"
postconf -e "virtual_transport = lmtp:unix:private/dovecot-lmtp"
postconf -e "virtual_mailbox_domains = example.com"
postconf -e "smtpd_milters = inet:127.0.0.1:11332"
postconf -e "non_smtpd_milters = inet:127.0.0.1:11332"
postconf -e "milter_default_action = accept"السطر الأكثر أهمية هو smtpd_relay_restrictions. وينتهي بـreject_unauth_destination، وهو ما يمنع الإنترنت كله من استخدام جهازك لإرسال بريده. المرحّل المفتوح يؤدي إلى إدراجك في القائمة السوداء خلال ساعات، وهو انتهاك لـسياسة الاستخدام المقبول أيضًا.
فعّل منفذ التقديم حتى يتمكن عملاؤك من الإرسال، مع طلب المصادقة ومنع الوصول المجهول:
postconf -M submission/inet="submission inet n - y - - smtpd"
postconf -P "submission/inet/syslog_name=postfix/submission"
postconf -P "submission/inet/smtpd_tls_security_level=encrypt"
postconf -P "submission/inet/smtpd_sasl_auth_enable=yes"
postconf -P "submission/inet/smtpd_client_restrictions=permit_sasl_authenticated,reject"4. Dovecot
صناديق البريد بتنسيق Maildir تحت مستخدم نظام واحد يجعل هذا البناء صغيرًا. أنشئ المستخدم ووحدة التخزين:
groupadd -g 5000 vmail
useradd -g vmail -u 5000 -d /var/vmail -m vmail
install -d -o vmail -g vmail -m 700 /var/vmail/example.comاكتب /etc/dovecot/conf.d/99-local.conf:
mail_location = maildir:/var/vmail/%d/%n
mail_uid = vmail
mail_gid = vmail
ssl = required
ssl_cert = </etc/letsencrypt/live/mail.example.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.example.com/privkey.pem
ssl_min_protocol = TLSv1.2
auth_mechanisms = plain login
disable_plaintext_auth = yes
passdb {
driver = passwd-file
args = scheme=ARGON2ID username_format=%u /etc/dovecot/users
}
userdb {
driver = static
args = uid=vmail gid=vmail home=/var/vmail/%d/%n
}
service lmtp {
unix_listener /var/spool/postfix/private/dovecot-lmtp {
mode = 0600
user = postfix
group = postfix
}
}
service auth {
unix_listener /var/spool/postfix/private/auth {
mode = 0660
user = postfix
group = postfix
}
}أنشئ صندوق بريد. يطلب الأمر مرتين ويكتب تجزئة، وليس كلمة المرور نفسها أبدًا:
echo -n "[email protected]:" >> /etc/dovecot/users
doveadm pw -s ARGON2ID >> /etc/dovecot/users
chmod 640 /etc/dovecot/users
chgrp dovecot /etc/dovecot/users5. rspamd وDKIM
أنشئ مفتاح التوقيع، ثم انشر النصف العام:
install -d -o _rspamd -g _rspamd -m 750 /var/lib/rspamd/dkim
rspamadm dkim_keygen -s mail -b 2048 -d example.com -k /var/lib/rspamd/dkim/example.com.mail.key
chown _rspamd:_rspamd /var/lib/rspamd/dkim/example.com.mail.key
chmod 400 /var/lib/rspamd/dkim/example.com.mail.keyيطبع هذا الأمر سجل DNS على الإخراج القياسي. انشره كسجل TXT عند mail._domainkey.example.com، تمامًا كما طُبع، مع ضم الأجزاء المقتبسة بالطريقة التي يتوقعها مزود DNS الخاص بك. ثم أخبر rspamd بمكان المفتاح، في /etc/rspamd/local.d/dkim_signing.conf:
path = "/var/lib/rspamd/dkim/$domain.$selector.key";
selector = "mail";
allow_username_mismatch = true;
use_domain = "header";
sign_authenticated = true;
sign_local = true;اربط milter واضبط كلمة مرور لواجهة الويب:
echo "bind_socket = \"127.0.0.1:11332\";" > /etc/rspamd/local.d/worker-proxy.inc
rspamadm pwالصق التجزئة الناتجة في /etc/rspamd/local.d/worker-controller.inc باسم password = "...". وصل إلى الواجهة عبر نفق SSH بدلاً من فتح المنفذ 11334 للعالم.
6. ابدأ كل شيء
systemctl enable --now redis-server rspamd dovecot postfix
postfix check
systemctl --no-pager --failedأضف خطاف تجديد بحيث تصل الشهادة الجديدة إلى كلا الخدمتين:
echo "systemctl reload postfix dovecot" > /etc/letsencrypt/renewal-hooks/deploy/reload-mail.sh
chmod +x /etc/letsencrypt/renewal-hooks/deploy/reload-mail.shتحقق منه
ثلاثة اختبارات. الأول محلي، والثاني هو المهم، والثالث هو الذي يبقيك بعيدًا عن قوائم الحظر.
echo | openssl s_client -starttls smtp -connect mail.example.com:25 -servername mail.example.com 2>/dev/null | grep -E "subject=|Verify return"ثم أرسل رسالة من خادمك الجديد إلى صندوق بريد تملكه في مزود ويب كبير، وافتح الرسالة المستلمة واقرأ ترويساتها الخام. أنت تبحث عن سطر واحد:
Authentication-Results: mx.receiver.example;
dkim=pass [email protected];
spf=pass smtp.mailfrom=example.com;
dmarc=pass (p=NONE) header.from=example.comثلاث تمريرات ويعتبر الأمر منجزًا. dkim=none تعني أن rspamd لا يوقع، لذا تحقق من rspamadm configdump dkim_signing. spf=fail تعني دائمًا تقريبًا أن الرسالة غادرت عبر IPv6 بينما يغطي سجل SPF عنوان IPv4 الخاص بـMX فقط.
أخيرًا، أثبت أنك لست مرحّلًا. من أي جهاز آخر، اتصل وحاول إرسال بريد بين نطاقين لا تملكهما:
apt install -y swaks
swaks --to [email protected] --from [email protected] --server mail.example.comالنتيجة الصحيحة هي رفض في مرحلة المستلم: 554 5.7.1 Relay access denied. أي شيء آخر يعني أنك قمت بتكوين جهاز سيُساء استخدامه خلال اليوم، ويجب عليك التوقف وإعادة قراءة الخطوة الثالثة.
بعد ذلك
اترك DMARC عند p=none لمدة أسبوع واقرأ التقارير المجمعة. بمجرد أن تظهر أن خادمك فقط هو الذي يوقع بريدك، انتقل إلى p=quarantine، ثم p=reject بعد أسبوعين. أضف نسخة احتياطية خارج العقدة لـ/var/vmail أثناء قيامك بذلك، لأن البريد هو الشيء الوحيد الذي لا يملك المستخدمون نسخة ثانية منه أبدًا، وإضافة النسخ الاحتياطي لدينا تكتب إلى موقع مختلف عن المثيل.