هناك الكثير من الإرشادات حول كيفية رفع خادم البريد على مجموعة من postfix - amavisd-new - dovecot. والغالبية العظمى منهم يكررون بعضهم البعض تقريبا حرفيا ، بما في ذلك الأخطاء وعدم الدقة.
يبدو لي أنه من الممل أن أدفع الأزرار دون تفكير ، لذلك قررت تحسين التكوين القياسي: ماذا لو قمت ببناء تفاعل postfix و amavisd-new ليس من خلال المضيف المحلي ، ولكن على مقبس يونكس؟
كما اتضح ، كل شيء ليس بهذه البساطة ، لكنني فعلت ذلك! التعليمات والتصحيح تحت القطع.
بصراحة ، لا أحب عمومًا التفاعل من خلال المضيف المحلي داخل نفس الجهاز. إذا كنت ترغب في تنظيم تبادل البيانات بين تطبيقين ، فمن الأصح والأكثر أمانًا وأقل استهلاكًا للموارد للقيام بذلك من خلال مقبس يونكس على نظام الملفات. علاوة على ذلك ، بهذه الطريقة يمكنك تنظيم الحماية (عن طريق الحقوق في نظام الملفات) حتى عندما تكون غائبة على مستوى التطبيق أو البروتوكول.
لذا ، يبدو مسار البريد في المجموعة التي تمت مناقشتها كما يلي:

اتضح أننا بحاجة إلى تنظيم اتصالين: عند التحويل إلى التصفية وعند العودة إلى MTA. منذ أن تم إنشاء مأخذ التوصيل من قبل المستمع ، في الحالة الأولى سيكون amavisd ، وفي الحالة الثانية - postfix.
لنبدأ بالثاني ، لأنه أبسط وأفضل وصفًا. من أجل postfix لإنشاء مقبس استماع ، تحتاج فقط إلى تحديد unix ، وليس inet ، في العمود الثاني من master.cf (عمود النوع). في هذه الحالة ، يحدد العمود الأول مسار واسم ملف المقبس.
نظرًا لأن عمليات postfix تعمل في chroot (يمكن تعطيل هذا لعملية معينة ، ولكنها لا تستحق ذلك) ، فأنت بحاجة إلى إنشاء مجلد داخل دليل postfix الرئيسي: / var / spool / postfix. سيكون له كلا المقابس:
mkdir /var/spool/postfix/amavis chown amavis:postfix /var/spool/postfix/amavis chmod 770 /var/spool/postfix/amavis
تكوين جيد و postfix:
amavis/postfix-in unix y - y - - smtpd -o smtpd_client_restrictions=$local_clients_only -o smtpd_helo_restrictions= -o smtpd_sender_restrictions= -o smtpd_recipient_restrictions= -o smtpd_milters=
تعتمد الخيارات المحددة على الإعداد الخاص بك ، وهذا هو خياري.
هناك مشكلتان:
- سيكون المسار متعلقًا بـ / var / spool / postfix / private ، والذي يخضع لأذونات صارمة للغاية.
- لست متأكدًا مما إذا كان هذا صحيحًا في جميع التوزيعات ، ولكن على Ubuntu بالتأكيد. من الأفضل عدم لمس حقوق المجلد (مآخذ جميع خدمات postfix موجودة) ، فمن الأفضل فقط إنشاء ارتباط رمزي.
- بالإضافة إلى المقبس ، يقوم postfix أيضًا بإنشاء ملف pid للعملية ، يتم إنشاء اسمه تلقائيًا بواسطة قناع $ type. $ Name. حيث سيكون النوع مساويًا لـ unix ، ويتم أخذ الاسم من العمود الأول من master.cf. اتضح unux.amavis / postfix-in أي ملف في مجلد فرعي. هو نفسه لن يخلقها وسيسقط بخطأ.
لذا ، فإننا نستبدل العكازات:
cd /var/spool/postfix/private ln -s ../amavis . mkdir /var/spool/postfix/pid/unix.amavis
ليست لطيفة جدًا ، ولكنها ليست مدمرة لبنية المجلد العادية للحزمة.
نعيد تشغيل postfix ونتأكد من ظهور ملف المقبس في مجلد amavis وملف pid في pid / unix.amavis. لسوء الحظ ، فإن حقوق المقبس هي 666 ، لكن حقوق المجلد الذي قمت بإنشائه سابقًا ستحمي الملف من العيون غير الضرورية.
يمكنك التحقق من العمل باستخدام الأمر:
netcat -U /var/spool/postfix/amavis/postfix-in 220 mail.example.ru ESMTP Postfix
حسنًا ، لقد فعلوا ذلك. الآن إلى amavisd.
أولاً ، قم بتكوين مسار إرجاع البريد من خلال مأخذ unix المملوك لـ postfix. هذا يعمل خارج الصندوق:
$forward_method = 'smtp:/var/spool/postfix/amavis/postfix-in'; $notify_method = \$forward_method;
حسنًا ، الجزء الأصعب الآن هو تركيب مآخذ في amavisd. يمكن العثور على الحل على
الإنترنت ، ولكن يُقترح استخدام مقبس واحد محدد بواسطة المعلمة $ unix_socketname. أردت أيضًا بروتوكول amavisd الجديد الخاص بي (AM.PDP) واستقبال البريد من خلال المقابس.
يحتوي ملف التهيئة الافتراضي على مرجع لتوجيهlisten_sockets ، ولكن لا يوجد وصف له. ولكن في
ملاحظات الإصدار ، حتى مع الأمثلة! صحيح ، يوجد مقبس واحد فقط ، ولكن ما الذي يمنعك من المحاولة؟
حسنًا ، ولكن كيف يمكنني تعيين البروتوكول للمقبس (المحدد في بنك السياسة)؟ في جميع الأمثلة ، يكتبون ببساطة SOCK. عن طريق القياس مع مآخذ inet (يمكنك تحديد منفذ المضيف هناك) ، اقترحت أنك بحاجة إلى تحديد المسار الكامل لملف المقبس. إليك ما حدث:
$unix_socketname = undef; $inet_socket_bind = undef; $inet_socket_port = undef; @listen_sockets = ('/var/lib/amavis/amavisd.sock', '/var/spool/postfix/amavis/amavis-in.sock'); $unix_socket_mode = 0660; %interface_policy = ( '/var/lib/amavis/amavisd.sock' => 'AM.PDP-SOCK', '/var/spool/postfix/amavis/amavis-in.sock' => 'LMTP-SOCK' ); $policy_bank{'LMTP-SOCK'} = { protocol => 'LMTP' }; $policy_bank{'AM.PDP-SOCK'} = { protocol => 'AM.PDP', auth_required_release => 0,
إعادة التشغيل ، والتحقق - في الواقع ، تم إنشاء كل من المقابس! النصر ليس في الحقيقة ، عندما تحاول الاتصال بالمقبس ، لا يحدث أي شيء ، ويتم كتابة خطأ في السجل مفاده أن البروتوكول غير معرف له. اتضح أن بنك السياسة لا ينطبق عليهم.
كيف ذلك؟ كان علي أن أذهب إلى الرمز.
جلبت هذه الحملة خبرين - كالعادة ، جيد وسيئ. الشيء الجيد هو أن الافتراض المتعلق بـ٪ interface_policy كان صحيحًا:
الشيء السيئ هو أن $ unix_socket_path يأتي في هذه الوظيفة فارغة. تمتلئ على النحو التالي:
my $is_ux = $sock && $sock->UNIVERSAL::can('NS_proto') && $sock->NS_proto eq 'UNIX';
وكلا الموقعين فارغين هناك.
اقترحت دراسة
الوثائق هذا الخيار:
my $unix_socket_path = $sock->hostpath();
وعملت! يمكن أن يقال
هنا .patch جاهز.
هناك اللمسة الأخيرة. نظرًا لأن amavisd ينشئ مقبسًا خاصًا به حقوق لنفسه فقط ، وقد رفضنا الوصول إلى الباقي (وهذا صحيح) ، نحتاج إلى إضافة postfix إلى مجموعة amavis حتى تتمكن من الكتابة إلى المقبس:
gpasswd -a postfix amavis
تم.
ملاحظة: لقد أرسلت التصحيح ووصف المشكلة من قبل مارك مارتينيك عن طريق البريد لأنني لم أجد أي إشارة إلى أداة تتبع الأخطاء على
الموقع . ما زلت لم أتلقى إجابة ، لكنني لا أعتمد عليها حقًا - يبدو المشروع مهجورًا (الإصدار الأخير قبل أكثر من عامين).