اثنا عشر بناءً

خادم بريد مستضاف ذاتيًا يصل فعلاً إلى صندوق الوارد

Postfix وDovecot وrspamd على مثيل واحد، مع إعداد SPF وDKIM وDMARC بشكل صحيح وخطوة تحقق تقرأ الترويسات الفعلية للطرف المستلم.

ما يبنيه هذا الدليل

خادم بريد متكامل لنطاق واحد: 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 / AAAAmailعناوين المثيل من اللوحة
MX@10 mail.example.com.
TXT@v=spf1 mx -all
TXT_dmarcv=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/users

5. 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 أثناء قيامك بذلك، لأن البريد هو الشيء الوحيد الذي لا يملك المستخدمون نسخة ثانية منه أبدًا، وإضافة النسخ الاحتياطي لدينا تكتب إلى موقع مختلف عن المثيل.

جاهز عندما تكون

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

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