عدم ارسال ایمیل توسط Discourse (حل شد)

docker
smtp
discourse

#1

درود
من از داکر استفاده میکنم و چند کانتینر برای سرویس ها دارم .

کانتینر dovecotsmtp شامل سرویس postfix و dovecot هست
کانتینر Roundcubemail شامل php و اسکریپت roundcube هست که بعنوان کلاینت عمل میکنه .

کانتینر Roundcubemail که به dovecotsmtp وصل هست و ارسال و دریافت ایمیل هم مشکلی نداره و ایمیل های ارسالی هم در اسپم قرار نمیگیرن . دامنه ها از ssl استفاده میکنه و کلیدها هم از سایت letsencrypt گرفته شده . سرویس smtp و imap با دستورات زیر تست شدن و مشکلی نداشتن

 openssl s_client -connect mail.example.com:587 -starttls smtp

openssl  s_client -connect mail.example.com:993

در حال حاضر دیسکورس بالا میاد ولی برای ساختن کاربر ادمین ، باید یک ایمیل ارسال بکنه ولی با اینکه پیام موفق در ارسال رو در قسمت وب میده ولی چیزی نمیفرسته

Screenshot_2018-10-22_18-41-50

کانتینر discourse که به کانتینر dovecotsmtp وصل هست از نظر شبکه مشکلی ندارند و در دو طرف پینگ هم دیگه رو دارند .

تنظیمات سرور smtp برای فایل app.yml مربوط به discourse به صورت زیر هست (به غیر از ip و port بقیه موارد عوض شده )

DISCOURSE_SMTP_ADDRESS: 172.20.4.3
DISCOURSE_SMTP_PORT: 587
DISCOURSE_SMTP_USER_NAME: test@example.com
DISCOURSE_SMTP_PASSWORD: mypassword
DISCOURSE_SMTP_ENABLE_START_TLS: true   

لاگ ها به صورت زیر هست(اسم سایت و ipهای خارجی عوض شده)

من موارد زیر رو انجام دادم ولی مشکل حل نشد:
اضافه کردن ip های کانتینر discourse و dovecot به فایل main.cf سرویس postfix


mynetworks = 172.20.13.0/24  172.20.4.0/24 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128

=============================================
یکبار tls رو در فایل app.yml غیر فعال کردم و دوباره discourse رو rebuild کردم

DISCOURSE_SMTP_ENABLE_START_TLS: false

که خطای زیر رو گرفتم . بعد دوباره tls رو فعال کردم

‍lost connection after EHLO

فعلا در حال بررسی هستم ببینم چه موارد دیگه ای هست تا بتونم مشکل رو رفع کنم . چون ارسال و دریافت ایمیل خارج از سرور با ترمینال و خارج از سرور با کانتینر دیگه ای داره انجام میشه ولی دیسکورس نمیفرسته چیزی عجیه :confused:


#2

رفتم داخل کانتینر discourse این دستورات رو تست زدم

دستور زیر اوکی بود

ping 8.8.8.8 

دستور زیر هم اوکی بود

ping 1xx.xx.xxx.xx7

دستور زیر هم اوکی بود

ping  example.com
ping mail.example.com

دستورات زیر در ۳ حالت تست شد
داخل کانیتنر: جواب نداد
خارج از کانتینر و روی سرور: جواب داد
خارج از سرور:‌ جواب داد

openssl s_client -connect mail.example.com:587 -starttls smtp
openssl s_client -connect example.com:587 -starttls smtp
openssl s_client -connect 1xx.xx.xxx.xx7:587 -starttls smtp

دستورات زیر در ۲ حالت تست شد چون ip داخلی هست
داخل کانیتنر: جواب داد
خارج از کانتینر و روی سرور: جواب داد

openssl s_client -connect 172.20.4.3:587 -starttls smtp

به نظر شما مشکل از چی میتونه باشه ؟


#3

پیشنهاد می کنم بدون TLS از توی کانتینر discourse با نت کتی چیزی وصل شین به پورت SMTP میل سرورتون و تست کنین


#4

با telnet بدون TLS تست کردم

telnet  mail.example.com 587
telnet 1xx.xx.xxx.xx7  587

ولی باز جواب نداد

به نظرم یه مشکلی روی شبکه داکر و iptables باید باشه .

iptables -L -t nat

دو یا سه تا رول تکراری دارم
نظر شما چی هست ؟


#5

من از ساختار شبکه شما چیزی نمی دونم ولی مشخص هست که این دوتا سرویس همدیگه رو نمی تونن ببینن. البته شما باید روی پورت SMTP امتحان کنین. نه SMTPS


#6

روی پورت ۲۵ تست کردم الان ولی همون وضعیت بود . سوال اینجاست چرا روی پورت ۲۵ ۵۸۷ ۹۹۳ خارج از داکر روی سرور و خارج سرور روی کلاینت مشکلی وجود نداره ولی مشکل داخل کانتینر هست


#7

مشکل routing دارین حتما . روشی که برای پیاده سازی شبکه بین کانتینر ها استفاده کردید رو دوباره چک کنین


#8

درود
من شبکه رو یه بررسی کردم به نظر نمیومد مشکلی داشته باشه ولی با این حال تغییرات زیر رو اعمال کردم
ارتقا نسخه docker compose از 2 به 3.7
حذف ipهای استاتیک از روی کانتینرها
جهت تست به همه کانتینرها دسترسی خارج از شبکه هم دادم .
یه سری رول اضافه توی فایروال بودم پاک کردم
نوع شبکه ای که فعلا برای داکر استفاده میکنم bridge هست
ولی باز هم مشکل رفع نشد

خط زیر رو تست کردم توی کانتینر بدون مشکل بود

openssl s_client -connect smtp.gmail.com:587 -starttls smtp

بعد گفتم شاید مشکل از postfix باشه یه تغییرات هم توی فایل main.cf مربوط به postfix دادم در قسمت mynetworks و smtpd_relay_restrictions
smtpd_recipient_restrictions ولی مشکل حل نشد.

حتی این دستور هم داخل کانتینر کار نمیکنه فقط روی شبکه داکر کار میکنن

 curl example.com  -v
* Rebuilt URL to: example.com/
*   Trying 1xx.xx.xxx.xx7...

#9

طبق بررسی که انجام دادم مشکل از iptables بود . اول سرویس داکر رو غیر فعال کردم . همه رول ها iptables رو حذف کردم . دوباره سرویس داکر رو فعال کردم که رولهای خودش رو ساخت . چک کردم دستور زیر رو

openssl s_client -connect mail.example.com:587 -starttls smtp

و بدون مشکل پاسخ داد لاگین هم کردم .

به نظرم مشکل بالا به خاطر اضافه کردن رول هایی برای فعال کردن knocking بوده باید اونا رو چک کنم


#10

دیسکورس رو تست کردم و ایمیل ارسال شد . در حال حاضر مشکلی ندارم .