رفع خطای no SASL authentication mechanisms در Postfix
وقتی smtpd پورت ۵۸۷ با خطای «no SASL authentication mechanisms» بالا نمیآید، ریشه معمولاً سوکت Dovecot است که داخل chroot پستفیکس ساخته نشده. این مقاله علت و راهحل کامل را قدمبهقدم بررسی میکند.

شرح مسئله
سرور میل روی Debian/Ubuntu بالا میآید، پورت ۲۵ کار میکند و ایمیلهای ورودی هم تحویل داده میشوند، اما هیچکدام از کاربران نمیتوانند از Thunderbird یا Outlook ارسال کنند. کلاینت روی پورت ۵۸۷ وصل میشود، هندشیک STARTTLS را انجام میدهد، ولی یا لیست AUTH در پاسخ EHLO وجود ندارد، یا بعد از تلاش برای احراز هویت اتصال بیدلیل قطع میشود.
در /var/log/mail.log چیزی شبیه این میبینید:
postfix/submission/smtpd[24112]: connect from unknown[203.0.113.45]
postfix/submission/smtpd[24112]: Anonymous TLS connection established from unknown[203.0.113.45]: TLSv1.3 with cipher TLS_AES_256_GCM_SHA384
postfix/submission/smtpd[24112]: warning: SASL: Connect to private/auth failed: No such file or directory
postfix/submission/smtpd[24112]: fatal: no SASL authentication mechanisms
postfix/master[2310]: warning: process /usr/lib/postfix/sbin/smtpd pid 24112 exit status 1
postfix/master[2310]: warning: /usr/lib/postfix/sbin/smtpd: bad command startup -- throttling
سه نشانه کلیدی اینجاست: نبود مسیر private/auth، خطای fatal: no SASL authentication mechanisms و در نهایت throttling که باعث میشود master پستفیکس سرویس را حدود یک دقیقه خفه کند و کلاینتها فقط تایماوت ببینند. چون این خطا در سطح پروسه smtpd رخ میدهد، حتی ارسال داخلی از وباپلیکیشنها روی پورت ۲۵ هم اگر smtpd_sasl_auth_enable روشن باشد متأثر میشود.
علت ریشهای
پستفیکس روی توزیعهای خانواده Debian بهصورت پیشفرض سرویس smtpd را در حالت chroot اجرا میکند؛ یعنی ریشه فایلسیستم این پروسه /var/spool/postfix است، نه /. بنابراین هر مسیری که در پستفیکس مینویسید نسبت به همان دایرکتوری تفسیر میشود.
از طرف دیگر Dovecot سوکت احراز هویت خودش را در مسیر پیشفرض /run/dovecot/auth-client میسازد. نتیجه این است که وقتی پستفیکس میخواهد به private/auth وصل شود، بهدنبال /var/spool/postfix/private/auth میگردد و چیزی پیدا نمیکند.
سه خطای رایج در همین سناریو وجود دارد و هرکدام ریشه متفاوتی دارد:
No such file or directory: سوکت اصلاً داخل chroot ساخته نشده است.Permission denied: سوکت ساخته شده، ولی مالک یا مجوز آن طوری نیست که کاربرpostfixبتواند بنویسد.no SASL authentication mechanisms: پستفیکس پشتیبانی SASL را کامپایل/نصب ندارد یاsmtpd_sasl_typeاشتباه تنظیم شده است.
یک نکته ظریف هم این است که این خطا در زمان راهاندازی پروسه smtpd رخ میدهد، نه در زمان ریستارت Dovecot. پس اگر بعد از رفع مشکل، master همچنان در حالت throttling باشد، ممکن است چند ده ثانیه طول بکشد تا سرویس دوباره سالم شود.
راهحل گامبهگام
گام ۱: تشخیص وضعیت فعلی
اول ببینید پستفیکس چه چیزی پشتیبانی میکند و مسیر فعلی چیست:
postconf -a
postconf smtpd_sasl_type smtpd_sasl_path smtpd_sasl_auth_enable
postconf -M submission/inet
ls -l /var/spool/postfix/private/
doveconf -n | grep -A8 'service auth'
خروجی postconf -a باید شامل dovecot باشد. اگر خالی بود، یعنی ماژول SASL نصب نیست و باید بسته postfix با پشتیبانی SASL نصب شود.
گام ۲: ساخت سوکت داخل chroot
در فایل /etc/dovecot/conf.d/10-master.conf بلوک service auth را به این شکل تغییر دهید تا Dovecot سوکت را مستقیماً داخل مسیر chroot پستفیکس بسازد:
service auth {
unix_listener /var/spool/postfix/private/auth {
mode = 0660
user = postfix
group = postfix
}
unix_listener auth-userdb {
mode = 0600
user = dovecot
}
}
دقت کنید که mode = 0660 و مالک postfix:postfix باشد؛ در غیر این صورت دوباره به Permission denied میخورید. همچنین در /etc/dovecot/conf.d/10-auth.conf مطمئن شوید مکانیزمهای لازم فعالاند:
auth_mechanisms = plain login
اگر disable_plaintext_auth = yes باشد (که پیشفرض درست و امنی است)، احراز هویت فقط روی اتصال TLS انجام میشود؛ پس حتماً سرویس submission را با smtpd_tls_security_level=encrypt تنظیم کنید.
گام ۳: تنظیم main.cf
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = no
smtpd_sasl_security_options = noanonymous
smtpd_sasl_tls_security_options = noanonymous
smtpd_sasl_local_domain = $myhostname
مقدارsmtpd_sasl_auth_enableرا درmain.cfرویnoبگذارید و فقط در سرویس submission آن را روشن کنید. این کار جلوی افشای AUTH روی پورت ۲۵ در بستر بدون رمزنگاری را میگیرد.
گام ۴: پیکربندی سرویس submission در master.cf
بلوک submission را در /etc/postfix/master.cf به این شکل کامل کنید (ستون chroot همان y است و مشکلی ندارد، چون سوکت داخل chroot ساخته شده):
submission inet n - y - - smtpd
-o syslog_name=postfix/submission
-o smtpd_tls_security_level=encrypt
-o smtpd_tls_auth_only=yes
-o smtpd_sasl_auth_enable=yes
-o smtpd_sasl_path=private/auth
-o smtpd_reject_unlisted_recipient=no
-o smtpd_client_restrictions=$mua_client_restrictions
-o smtpd_helo_restrictions=$mua_helo_restrictions
-o smtpd_sender_restrictions=$mua_sender_restrictions
-o smtpd_relay_restrictions=permit_sasl_authenticated,reject
-o milter_macro_daemon_name=ORIGINATING
استفاده از متغیرهای $mua_*_restrictions باعث میشود قوانین پیشفرض کانال MUA حفظ شوند و لازم نباشد برای هر سرویس، لیست قوانین را دستی تکرار کنید.
گام ۵: اعمال تغییرات و بررسی سوکت
systemctl restart dovecot
systemctl restart postfix
ls -l /var/spool/postfix/private/auth
postfix check
postfix status
خروجی ls باید چیزی شبیه این باشد:
srw-rw---- 1 postfix postfix 0 Aug 12 09:14 /var/spool/postfix/private/auth
گام ۶: تست دستی احراز هویت
ابتدا فقط چک کنید مکانیزمها در پاسخ EHLO ظاهر میشوند:
openssl s_client -starttls smtp -crlf -connect 127.0.0.1:587
بعد از اتصال، دستور EHLO test.local را تایپ کنید. باید خط 250-AUTH PLAIN LOGIN را ببینید. سپس واقعاً یک ایمیل تستی بفرستید:
swaks --to me@example.org --from user@example.com \
--server 127.0.0.1:587 --tls --auth PLAIN \
--auth-user user@example.com --auth-password 'secret'
روش بررسی اینکه مشکل واقعاً حل شده است
سه سطح تأیید را با هم چک کنید، نه فقط یکی:
- لاگ: در
/var/log/mail.logدیگر نبایدno SASL authentication mechanismsیاbad command startupببینید. در عوض باید خطوطی مثلsasl_method=PLAIN, sasl_username=user@example.comوSASL PLAIN authentication successfulثبت شود. - پروسهها: خروجی
systemctl status postfixباید active باشد وpostfix statusهم بدون خطا برگردد. اگر master همچنان در حالت throttling بود، بعد از حدود ۶۰ ثانیه خودش رفع میشود؛ در غیر این صورتpostfix reloadبزنید. - مسیر واقعی کاربر: یک ایمیل از کلاینت واقعی (Thunderbird در ویندوز و یک موبایل) به یک دامنه بیرونی مثل Gmail بفرستید و در هدر پیام بررسی کنید که
Receivedازpostfix/submissionعبور کرده باشد.
پیشگیری و بهترین روشها
- فایلهای پیکربندی را در IaC نگه دارید. بلوک سوکت Dovecot و بلوک submission در master.cf باید از یک مخزن نسخهبندیشده بیایند؛ چون هر آپدیت بسته ممکن است master.cf را بازنویسی کند.
- مانیتورینگ سینتتیک بگذارید. یک چک دورهای با
swaksروی پورت ۵۸۷ که احراز هویت را واقعاً تست کند، این خطا را قبل از کاربران میگیرد. برای لاگها هم روی الگویno SASL authentication mechanismsهشدار بگذارید. - وابستگی سرویس را صریح کنید. با
systemctl edit postfixمیتوانیدAfter=dovecot.serviceاضافه کنید تا ترتیب بوت قابل پیشبینیتر شود. - روی RHEL و مشتقاتش SELinux را چک کنید. اگر بعد از ساخت سوکت همچنان
Permission deniedمیگیرید، باausearch -m avc -ts recentدنبال denial بگردید و context دایرکتوریprivateرا باrestorecon -Rv /var/spool/postfix/privateاصلاح کنید. - پورتها را تفکیک کنید. احراز هویت را فقط روی submission (۵۸۷) و در صورت نیاز smtps (۴۶۵) فعال کنید؛ پورت ۲۵ باید بدون AUTH و فقط برای تبادل سروربهسرور بماند.
- بعد از هر تغییر،
postfix checkرا فراموش نکنید. این دستور خطاهای نگارشی پیکربندی را قبل از ریستارت نشان میدهد و از downtime جلوگیری میکند.
نویسنده
تیم محتوای کلودیکپ
تیم فنی و محتوای کلودیکپ؛ مهندسانی که هر روز با DevOps، Kubernetes و زیرساخت ابری کار میکنند و تجربههایشان را اینجا مینویسند.
سوالات متداول این مقاله
این پیام یعنی پستفیکس نتوانسته هیچ مکانیزم SASL را بارگذاری کند. دو علت اصلی دارد: یا ماژول SASL (خروجی postconf -a) خالی است، یا مسیر smtpd_sasl_path مانند private/auth پیدا نمیشود. در حالت دوم بعد از ساخت سوکت داخل chroot و ریستارت سرویس، مشکل رفع میشود.
بله. اگر ستون chroot را در master.cf برای سرویسهای smtpd و submission روی n بگذارید، پستفیکس میتواند به مسیرهای عادی مثل /run/dovecot/auth-client دسترسی داشته باشد. اما این کار سطح امنیت را پایین میآورد؛ روش توصیهشده همان ساخت سوکت داخل /var/spool/postfix/private/auth است.
saslauthd بخشی از بسته Cyrus SASL است و برای احراز هویت باید با سوکت یا PAM جداگانه کار کند. Dovecot SASL سوکت خودش را در اختیار Postfix میگذارد و چون Dovecot از قبل در حال اجراست، سرویس اضافهای لازم نیست. در اکثر نصبهای مدرن Postfix + Dovecot، گزینه دوم سادهتر و کمدردسرتر است.
کلودیکپ در این زمینه چه کمکی میکند؟
DevSecOps و امنیت زیرساخت
تزریق امنیت در تمام مراحل توسعه و استقرار، از کد تا زیرساخت.
مشاهده جزئیات خدمتمدیریت سرور و Linux
پیکربندی، بهینهسازی و نگهداری سرورهای لینوکسی با تمرکز بر پایداری و امنیت.
مشاهده جزئیات خدمتراهاندازی میل سرور اختصاصی (Self-Hosted)
استقرار، پیکربندی و پشتیبانی میل سرور اختصاصی مبتنی بر Mailcow روی زیرساخت شما، با کنترل کامل بر دادهها و ارسال/دریافت ایمیل سازمانی.
مشاهده جزئیات خدمت
رفع dkim=none در Postfix با راهاندازی OpenDKIM
اگر ایمیلهای سرور Postfix شما در Gmail به اسپم میروند و هدر پیام dkim=none نشان میدهد، یعنی هیچ امضای DKIM روی پیامها درج نمیشود. در این مقاله OpenDKIM را نصب، پیکربندی و به Postfix وصل میکنیم و رکورد DNS را منتشر میکنیم.

خطای fsnotify watcher در Kubernetes؛ سقف inotify نود
اگر پادهای Grafana، Prometheus یا هر اپلیکیشنی که از inotify استفاده میکند با خطای «failed to create fsnotify watcher: too many open files» کرش میکنند، مقصر سقف پیشفرض هسته لینوکس روی نود است.

تأخیر ۵ ثانیهای DNS در Kubernetes؛ پای ndots:5 در میان است
هرچند وقت یکبار یک درخواست خروجی دقیقاً ۵ ثانیه طول میکشد و بعد موفق میشود؟ ریشه معمولاً گزینه ndots:5 در resolv.conf پادها و لیست search است. این مقاله علت، تشخیص و راهحل کامل را بررسی میکند.
در پیادهسازی به کمک نیاز دارید؟
تیم کلودیکپ همین کار را هر روز برای تیمهای دیگر انجام میدهد. اگر جایی گیر کردهاید، با ما صحبت کنید.