Postfix和Amavis – 使用UNIX Soket进行通信

我目前正在使用一个复杂的邮件服务器设置使用Postfix,Dovecot,Amavis和Spamassassin

一切工作正常,但我想改善后缀Amavis通信。 目前,postfix将发送所有邮件到localhost:10024这是amavis服务。 在所有检查修改后的版本被发回到localhost:10025这是一个接收amavis邮件的后缀服务。

我的想法: UNIX SOCKETS (由于安全原因;不重要为什么)

所以我configuration了amavis在/run/amavis/amavis.socket产生一个unix套接字

我改变了这个:

 amavis-forward:[127.0.0.1]:10024` to `amavis-forward:unix:/run/amavis/amavis.sock 

但是,然后我得到这个错误:

 Jan 5 13:55:23 server postfix/smtp[1447]: fatal: unknown service: /run/amavis/amavis.sock/tcp Jan 5 13:55:24 server postfix/qmgr[1254]: warning: private/amavis-forward socket: malformed response Jan 5 13:55:24 server postfix/qmgr[1254]: warning: transport amavis-forward failure -- see a previous warning/fatal/panic logfile record for the problem description 

所以邮件状态被设置为status=deferred (unknown mail transport error)

master.cf:

  ... # Amavis amavis-forward unix - - - - 2 smtp -o smtp_tls_security_level=none -o smtp_data_done_timeout=1200 -o smtp_send_xforward_command=yes -o disable_dns_lookups=yes -o max_use=20 ... 

结束:10024任何工作正常。 我该如何解决?

免责声明:这是一半的答案,因为我可以在postfix – > amavis使用套接字,但是当amavis – > postfix时我不能使用它。 看到这个答案结束的解释。

要使用套接字,您应该使用LMTP而不是SMTP将邮件从postfix传送到amavis。

正如上面所说的NickW所说的,你需要把amavis socket放在Postfix队列目录中。 在这个答案我假设后缀队列目录是 /var/spool/postfix/

创build目录以容纳amavis套接字

 mkdir /var/spool/postfix/amavis/ chmod 750 /var/spool/postfix/amavis/ chown amavis:amavis /var/spool/postfix/amavis/ 

在amavis组中添加postfix用户

 usermod -G amavis postfix 

amavisd.confconfiguration

 # for socket, it should reside in /var/spool/postfix $unix_socketname = "/var/spool/postfix/amavis/amavisd.sock"; # set permission so amavis group can access this socket $unix_socket_mode = 0660; # Replace $interface_policy{'SOCK'} = 'AM.PDP'; $interface_policy{'SOCK'} = 'mysock'; $policy_bank{'mysock'} = { protocol => 'LMTP', auth_required_release => 0, # don't require secret-id for release }; 

后缀main.cf

 content_filter = amavis-forward:unix:amavis/amavisd.sock 

Postfix master.cf

 # Amavis amavis-forward unix - - - - 2 lmtp -o lmtp_data_done_timeout=1200 -o lmtp_send_xforward_command=yes -o disable_dns_lookups=yes -o max_use=20 

结果

 amais postfix/smtpd[13393]: connect from localhost[127.0.0.1] amais postfix/smtpd[13393]: 4E0B82340F: client=localhost[127.0.0.1] amais postfix/cleanup[13359]: 4E0B82340F: message-id=<[email protected]> amais postfix/qmgr[13352]: 4E0B82340F: from=<[email protected]>, size=344, nrcpt=1 (queue active) amais postfix/smtpd[13363]: connect from localhost[127.0.0.1] amais postfix/smtpd[13363]: 6081E2340B: client=localhost[127.0.0.1] amais postfix/cleanup[13359]: 6081E2340B: message-id=<[email protected]> amais postfix/qmgr[13352]: 6081E2340B: from=<[email protected]>, size=688, nrcpt=1 (queue active) amais postfix/smtpd[13363]: disconnect from localhost[127.0.0.1] amais postfix/local[13365]: 6081E2340B: to=<[email protected]>, orig_to=<[email protected]>, relay=local, delay=0.01, delays=0.01/0/0/0.01, dsn=2.0.0, status=sent (delivered to mailbox) amais postfix/qmgr[13352]: 6081E2340B: removed amais amavis[13113]: (13113-03) Passed CLEAN {RelayedInbound}, mysock <[email protected]> -> <[email protected]>, Message-ID: <[email protected]>, mail_id: MLZDzoda7siu, Hits: -, size: 344, queued_as: 6081E2340B, 90 ms amais postfix/lmtp[13361]: 4E0B82340F: to=<[email protected]>, relay=example.net[amavis/amavisd.sock], delay=0.11, delays=0.01/0/0.01/0.09, dsn=2.0.0, status=sent (250 2.0.0 from MTA(smtp:[127.0.0.1]:10025): 250 2.0.0 Ok: queued as 6081E2340B) amais postfix/qmgr[13352]: 4E0B82340F: removed 

对于amavis – > postfix传输,它由参数forward_method控制。 除了smtp,我不熟悉这个configuration。 在这个页面的例子中 ,显然这个参数支持的协议是pipe,smtp和bsmtp。 另外,根据后缀架构 ,postfix只接受来自smtpd,qmqmd或sendmail的电子邮件。

这是通过unix套接字进行postfix通信的解决scheme。 这是masegaloeh的答案的后半部分。

首先,你必须修改/var/spool/postfix/amavis目录:

 chmod 770 /var/spool/postfix/amavis chown amavis:postfix /var/spool/postfix/amavis 

后面的想法是:Postfix将在这个目录中创build一个unix套接字smtpd服务。 问题是,你已经在master.cf中定义为../amavis/amavis-accept - - - 2 smtpd但是后缀将searchpid/unix...amavis/amavis-accept的pid文件pid/unix...amavis/amavis-accept不工作。
所以我们必须使用一个解决方法:

创build一个链接到amavis目录:

 cd /var/spool/postfix/public ln -s ../amavis amavis 

之后,必须准备好pid文件目录:

 cd /var/spool/postfix/pid mkdir unix.amavis chown root:root unix.amavis chmod 700 unix.amavis 

现在我们必须configurationsmtpd服务来接受邮件(master.cf):

 amavis/amavis-accept unix n - - - - smtpd -o smtpd_tls_security_level=none -o cleanup_service_name=amaviscleanup -o mynetworks=127.0.0.0/8 -o content_filter= -o local_recipient_maps= -o relay_recipient_maps= -o smtpd_restriction_classes= -o smtpd_delay_reject=no -o smtpd_client_restrictions=permit_mynetworks,reject -o smtpd_helo_restrictions= -o smtpd_sender_restrictions= -o smtpd_recipient_restrictions=permit_mynetworks,reject -o smtpd_data_restrictions=reject_unauth_pipelining -o smtpd_end_of_data_restrictions= -o smtpd_error_sleep_time=0 -o smtpd_soft_error_limit=1001 -o smtpd_hard_error_limit=1000 -o smtpd_client_connection_count_limit=0 -o smtpd_client_connection_rate_limit=0 -o receive_override_options=no_unknown_recipient_checks 

现在在amavisd.conf中configurationamavis或者你的os的configuration文件:

 $forward_method = 'smtp:/var/spool/postfix/amavis/amavis-accept'; 

怎么运行的

邮件转发给amavis,你可以在masegaloeh的回答的前半部分看到。 然后amavis用smtp把它发回到unix socket。

问题是后缀。 你必须创build一个unix套接字,amavis可以访问而不需要添加amavis到postmap或postfix组。 所以我第一次使用../amavis/amavis-accept所以套接字被成功创build。 但后缀创build一个PID文件,它使用这个名字。 作为unix套接字后缀使用pid/unix. + services name pid/unix. + services namepid/unix.../amavis/amavis-accept.

所以我在public文件夹中创build了这个链接,因此postfix可以创build套接字(设置amavis目录的权限),而我只需要master.cf中的amavis/amavis-accept

有了这个configuration,pid文件是pid/unix.amavis/amavis.accept 。 为此,我只需要创buildunix.amavis directory并且由于unix.amavis而不是unix...amavis它与pid目录的样式稍微匹配。

LMTP不适合我!