Postfix - amavisd-new بدون مضيف محلي أو خادم بريد بطريقة جديدة

هناك الكثير من الإرشادات حول كيفية رفع خادم البريد على مجموعة من 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= 

تعتمد الخيارات المحددة على الإعداد الخاص بك ، وهذا هو خياري.

هناك مشكلتان:

  1. سيكون المسار متعلقًا بـ / var / spool / postfix / private ، والذي يخضع لأذونات صارمة للغاية.
  2. لست متأكدًا مما إذا كان هذا صحيحًا في جميع التوزيعات ، ولكن على Ubuntu بالتأكيد. من الأفضل عدم لمس حقوق المجلد (مآخذ جميع خدمات postfix موجودة) ، فمن الأفضل فقط إنشاء ارتباط رمزي.
  3. بالإضافة إلى المقبس ، يقوم 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, # don't require secret-id for release }; 

إعادة التشغيل ، والتحقق - في الواقع ، تم إنشاء كل من المقابس! النصر ليس في الحقيقة ، عندما تحاول الاتصال بالمقبس ، لا يحدث أي شيء ، ويتم كتابة خطأ في السجل مفاده أن البروتوكول غير معرف له. اتضح أن بنك السياسة لا ينطبق عليهم.

كيف ذلك؟ كان علي أن أذهب إلى الرمز.

جلبت هذه الحملة خبرين - كالعادة ، جيد وسيئ. الشيء الجيد هو أن الافتراض المتعلق بـ٪ interface_policy كان صحيحًا:

 # load policy banks according to my socket (destination), # then check for allowed access from the peer (client/source) # sub access_is_allowed($;$$$$) { my($unix_socket_path, $src_addr, $src_port, $dst_addr, $dst_port) = @_; my(@bank_names); if (defined $unix_socket_path) { push(@bank_names, $interface_policy{"SOCK"}); push(@bank_names, $interface_policy{$unix_socket_path}); } elsif (defined $dst_addr && defined $dst_port) { $dst_addr = '['.lc($dst_addr).']' if $dst_addr =~ /:[0-9a-f]*:/i; # IPv6? push(@bank_names, $interface_policy{$dst_port}); push(@bank_names, $interface_policy{"$dst_addr:$dst_port"}); } load_policy_bank($_) for @bank_names; 

الشيء السيئ هو أن $ 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 

تم.

ملاحظة: لقد أرسلت التصحيح ووصف المشكلة من قبل مارك مارتينيك عن طريق البريد لأنني لم أجد أي إشارة إلى أداة تتبع الأخطاء على الموقع . ما زلت لم أتلقى إجابة ، لكنني لا أعتمد عليها حقًا - يبدو المشروع مهجورًا (الإصدار الأخير قبل أكثر من عامين).

Source: https://habr.com/ru/post/ar415597/


All Articles