我目前正在使用复杂的邮件服务器设置Postfix、Dovecot、Amavis 和 Spamassassin。
一切正常,但我想改进 Postfix-Amavis-Communication。目前,postfix 会将所有邮件发送到localhost:10024
amavis 服务。经过所有检查后,修改后的版本将发送回localhost:10025
用于接收 amavis 邮件的 postfix 服务。
我的想法:UNIX 套接字 (出于安全原因;原因不重要)
因此我配置了 amavis 来在 中生成一个 unix 套接字/run/amavis/amavis.socket
。
我改变了这一点:
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 一切正常。我该如何解决?
答案1
免责声明:这只是半个答案,因为当 postfix -> amavis 时我可以使用套接字,但当 amavis -> postfix 时我不能使用它。请参阅本答案末尾的解释。
要使用套接字,您应该使用 LMTP 而不是 SMTP 将电子邮件从 postfix 传递到 amavis。
正如 NickW 上面所说,您需要将 amavis 套接字放在 Postfix 队列目录中。在这个答案中我假设后缀队列目录是 /var/spool/postfix/
。
创建目录来保存 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.conf
# 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
};
Postfix 主配置文件
content_filter = amavis-forward:unix:amavis/amavisd.sock
Postfix 主控文件
# 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 之外,我不熟悉此配置。在本页中的示例,显然此参数支持的协议是 pipe、smtp 和 bsmtp。此外,基于Postfix 架构,postfix 仅接受来自 smtpd、qmqmd 或 sendmail 的电子邮件。
答案2
这是 amavis 通过 unix 套接字与 postfix 通信的解决方案。这是 masegaloeh 答案的后半部分。
首先,你必须修改/var/spool/postfix/amavis
目录:
chmod 770 /var/spool/postfix/amavis
chown amavis:postfix /var/spool/postfix/amavis
其背后的想法是:Postfix 将在此目录中创建一个 unix 套接字 smtpd 服务。问题是,您已在 master.cf 中将其定义为,但 postfix 会搜索不起作用的../amavis/amavis-accept - - - 2 smtpd
pid 文件。 因此,我们必须使用一种解决方法:pid/unix...amavis/amavis-accept
创建目录的链接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
现在我们必须配置 smtpd 服务来接受邮件(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 或你的操作系统的配置文件中配置 amavis:
$forward_method = 'smtp:/var/spool/postfix/amavis/amavis-accept';
怎么运行的
邮件被转发到 amavis,您可以在 masegaloeh 的回答的前半部分看到。然后 amavis 使用 smtp 将其发送回 unix 套接字。
问题出在 postfix 上。您必须创建一个 unix 套接字,amavis 可以访问该套接字,而无需将 amavis 添加到 postmap 或 postfix 组。因此,我首先使用,../amavis/amavis-accept
这样套接字就成功创建了。但是 postfix 创建了一个 pid 文件,并使用了这个名称。作为 unix 套接字,postfixpid/unix. + services name
使用pid/unix.../amavis/amavis-accept.
所以我在文件夹中创建了这个链接public
,这样 postfix 就可以创建套接字(设置 amavis 目录的权限),而我只需要amavis/amavis-accept
在 master.cf 中。
使用此配置,pid 文件为pid/unix.amavis/amavis.accept
。为此,我只需要创建unix.amavis directory
并且因为unix.amavis
和不unix...amavis
它与 pid 目录的样式有点匹配。
LMTP 对我来说不起作用!