الاتصال بخادم SMTP على localhost:25 بدون مصادقة؟

في عام 2019، يُعد هذا التكوين الافتراضي لـ Postfix على أنظمة RHEL/CentOS. يرتبط Postfix فقط بواجهة الحلقة (loopback interface) ويرفض جميع طلبات SMTP التي لا تنشأ من 127.0.0.0/8. لا يتطلب أي مصادقة. لست متأكدًا بشأن Debian، لكنني أتخيل أن exim لديه تكوين افتراضي مشابه.

إليك بعض المواضيع ذات الصلة في هذه المنتديات من مستخدمين آخرين واجهوا هذه المشكلة:

لا يبدو أن هناك موضوعًا حول كيفية إعداد هذا على RHEL/CentOS مع التغييرات اللازمة على كل من Discourse و Postfix، لذا سأقوم بتوثيق ذلك هنا.

لا يبدو أن هذا ممكن باستخدام سكريبت discourse-setup، لكنني تمكنت من جعله يعمل.

أولاً، كان عليّ معرفة عنوان IP لمضيف Docker كما يراه حاوية Docker. استخدام 127.0.0.1 لن يعمل لأن حاوية Docker سترى 127.0.0.1 على أنها هي نفسها. بدلاً من ذلك، نحتاج إلى تحديد عنوان IP أو اسم المضيف الخاص بمضيف Docker الذي يشغل خادم SMTP الخاص بـ Postfix، والذي يمكن الوصول إليه من قبل حاوية Docker (لذا ليس عنوان IP الموجه للإنترنت الخاص بمضيف Docker إذا كنت لا تريد أن يكون خادم SMTP الخاص بك متاحًا عبر الإنترنت، على سبيل المثال).

استخرجت عنوان IP ذي الصلة لمضيف Docker (172.17.0.1) من واجهة docker0 بتنفيذ الأمر التالي على مضيف Docker:

[maltfield@osestaging1 ~]$ ip address show docker0
3: docker0: <BROADCAST,MULTICAST,UP,LOWER_UP> mtu 1500 qdisc noqueue state UP 
    link/ether 02:42:80:35:65:a1 brd ff:ff:ff:ff:ff:ff
    inet 172.17.0.1/16 brd 172.17.255.255 scope global docker0
       valid_lft forever preferred_lft forever
    inet6 fe80::42:80ff:fe35:65a1/64 scope link 
       valid_lft forever preferred_lft forever
[maltfield@osestaging1 ~]$

ثم قمت بتعديل ملف yaml الخاص بتطبيق Discourse، مع تعيين “DISCOURSE_SMTP_ADDRESS” إلى 172.17.0.1 من الأعلى.

[maltfield@osestaging1 ~]$ cd /var/discourse/
[maltfield@osestaging1 discourse]$ grep SMTP containers/app.yml
  DISCOURSE_SMTP_ADDRESS: 172.17.0.1
  DISCOURSE_SMTP_PORT: 25
  DISCOURSE_SMTP_AUTHENTICATION: none
  DISCOURSE_SMTP_OPENSSL_VERIFY_MODE: none
  DISCOURSE_SMTP_ENABLE_START_TLS: false
[maltfield@osestaging1 discourse]$ 

لاحظ أنني حاولت أولاً استخدام اسم المضيف الداخلي لـ Docker host.docker.internal لهذا الغرض، لكن يبدو أن هذا الاسم غير متاح لمستخدمي Docker على Linux.

بما أن تكوين Postfix الافتراضي على RHEL/CentOS يرتبط فقط بـ 127.0.0.1 (وهو أمر جيد)، ستحتاج إلى تغيير /etc/postfix/main.cf بحيث يرتبط أيضًا بواجهة docker0 وإضافة هذا النطاق الفرعي إلى مجموعة mynetworks حتى يتم قبول حركة مرور SMTP القادمة من حاويات Docker بواسطة Postfix.

[maltfield@osestaging1 postfix]$ grep -ir '172.17' /etc/postfix/*
/etc/postfix/main.cf:inet_interfaces = 127.0.0.1, 172.17.0.1
/etc/postfix/main.cf:mynetworks = 127.0.0.0/8, 172.17.0.0/16
[maltfield@osestaging1 postfix]$ 

بعد هذه التغييرات، أعد بناء Discourse ويجب أن يكون الآن قادرًا على إرسال رسائل البريد الإلكتروني عبر Postfix الخاص بمضيف Docker.

/var/discourse/launcher rebuild app

بينما يعمل هذا، لدي بعض الأسئلة:

  1. هل هناك متغير بيئة أو اسم مضيف آخر يشير بالفعل إلى مضيف Docker (172.17.0.1 في هذه الحالة)؟

لاحظت أن هناك متغير بيئة DISCOURSE_HOST_IP يتم “حقنه” بواسطة launcher. هل من الممكن تعيين مفتاح yaml DISCOURSE_SMTP_ADDRESS هذا إلى نفس قيمة مفتاح yaml الآخر باستخدام شيء مثل هذا؟

DISCOURSE_SMTP_ADDRESS: $DISCOURSE_HOST_IP
  1. بشكل عام، ما مدى متانة عنوان IP 172.17.0.1 الخاص بمضيف Docker؟ هل هو دائمًا هذا العنوان على أنظمة RHEL/CentOS؟ هل سيتغير في أي وقت؟