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

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

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

一切正常,但我想改进 Postfix-Amavis-Communication。目前,postfix 会将所有邮件发送到localhost:10024amavis 服务。经过所有检查后,修改后的版本将发送回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 smtpdpid 文件。 因此,我们必须使用一种解决方法: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 对我来说不起作用!

相关内容