Postfix、Amavis 和外发邮件:如何通知发件人

mac*_*ete 1 email postfix amavis

我在从受感染的电子邮件帐户发送垃圾邮件时遇到问题,这些邮件从我的服务器发送垃圾邮件并进入黑名单。所以我遵循了使用 amavis 设置 postfix 的指南:

一切似乎都正常,但是我想阻止外发的垃圾邮件/病毒电子邮件,而是通知发件人他的电子邮件已被拒绝(例如通过 MAILER-DAEMON)。有没有可能做到这一点?我只能弄清楚如何:

  • 完全拒绝邮件而不通知发件人(这不是很好,是吗?):
    Aug 25 12:05:35 ns207813 amavis[24728]: (24728-01) Blocked SPAM {NoBounceOpenRelay,Quarantined}, <root@mail.org> -> <john@example.com>, quarantine: J/spam-Jfuzg0ScCmKf.gz, Message-ID: <GTUBE1.1010101@example.net>, mail_id: Jfuzg0ScCmKf, Hits: 1004.054, size: 935, 2013 ms
  • 无论如何发送邮件(但标记为“垃圾邮件”):
    Aug 25 12:19:10 ns207813 amavis[25182]: (25182-01) Passed SPAM {RelayedTaggedInbound,Quarantined}, [217.230.20.223]:65071 [217.230.20.223] <removed@mail.me> -> <removed@mail.com>, quarantine: i/spam-iy3rVCiRk8k2.gz, Queue-ID: 5B9D722AAA, Message-ID: <74576B87-1986-4179-A262-B96640387C9E@mail.me>, mail_id: iy3rVCiRk8k2, Hits: 999.001, size: 2663, queued_as: DD67222ABE, 1379 ms

我目前的 amavis 设置是:

$sa_spam_subject_tag = '[SPAM] ';
$sa_tag_level_deflt  = undef;  # add spam info headers if at, or above that level
$sa_tag2_level_deflt = 5; # add 'spam detected' headers at that level
$sa_kill_level_deflt = 20; # triggers spam evasive actions
$sa_dsn_cutoff_level = 10;   # spam level beyond which a DSN is not sent

$final_virus_destiny      = D_DISCARD;  # (data not lost, see virus quarantine)
$final_banned_destiny     = D_BOUNCE;   # D_REJECT when front-end MTA
$final_spam_destiny       = D_PASS;
$final_bad_header_destiny = D_PASS;     # False-positive prone (for spam)
Run Code Online (Sandbox Code Playgroud)

如果可能的话,我还想将传入的病毒标记为病毒而不是完全拒绝邮件(因此不会丢失邮件)。

感谢您的帮助!

Ste*_*ter 6

您想要做的需要将来自使用您的服务器的用户的邮件作为他们的 MSA(即他们的外发中继)处理,其策略与从第 3 方收到的邮件不同(即当您的邮件服务器充当其 MX 角色时)。幸运的是,amavis 有适合您的工具:政策银行。

让我们看看如何为用户定义策略:

$policy_bank{'PREQ-SUB'} = {
        originating => 1, # indicates client is ours, allows signing
        final_spam_destiny => D_DISCARD, # discard spam
        final_virus_destiny => D_DISCARD, # discard spam
        warnspamsender => 1, # send a warning 
        forward_method => 'smtp:127.0.0.1:10025', # you probably need to adjust this
        smtpd_discard_ehlo_keywords => ['8BITMIME'], # force mail conversion to Q/P
        smtpd_greeting_banner => '${helo-name} ${protocol} ${product} SUBMISSION service ready',
        spam_admin_maps  => ["postmaster\@example.net"],  # warn of spam from us
        virus_admin_maps => ["postmaster\@example.net"],  # warn of viruses from us
};
Run Code Online (Sandbox Code Playgroud)

从这个策略库的命名,你已经可以猜到我把它作为一个队列前过滤器运行,如果邮件通过提交 TCP 端口 587 传递,它就会被触发。为了使这个配置工作,我告诉我的 Postfix MTA将提交服务收到的邮件传送到端口 10028 上的本地主机(而当充当公共 MX 时,服务器将邮件转发到端口 10024)。要在 amavis 中激活两个端口并将 PREQ-SUB 策略绑定到端口 10028,我正在使用这些设置:

# policy bank definition
$inet_socket_port = [10024, 10028];  # listen on listed inet tcp ports
$interface_policy{'10028'} = 'PREQ-SUB'; # mail submitted using TLS on submission/smtps port
Run Code Online (Sandbox Code Playgroud)

Postfix 对应的 master.cf 条目是:

submission inet n - - - - smtpd -o smtpd_tls_security_level=encrypt 
  -o tls_preempt_cipherlist=$submission_tls_preempt_cipherlist 
  -o smtpd_tls_protocols=$submission_smtpd_tls_protocols 
  -o smtpd_tls_ciphers=$submission_smtpd_tls_ciphers 
  -o smtpd_tls_exclude_ciphers=$submission_smtpd_tls_exclude_ciphers 
  -o smtpd_sasl_auth_enable=yes 
  -o smtpd_recipient_restrictions=$submission_smtpd_recipient_restrictions 
  -o milter_macro_daemon_name=ORIGINATING 
  -o smtpd_proxy_filter=127.0.0.1:10028 
  -o syslog_name=postfix-submission/smtpd
  -o receive_override_options=no_header_body_checks
Run Code Online (Sandbox Code Playgroud)

请注意,这实际上并不仅仅是向 amavis 发送邮件,例如设置密码列表等等(您会注意到 main.cf 变量引用)。

那么,如果您的用户没有在端口 587 上提交他们的邮件,或者不是所有用户都这样做,您该怎么办?那么,你将不得不离开 100% 确定的土地。amavis 可以分析邮件的内容并对是否存在标题采取行动。如果您设置smtpd_sasl_authenticated_header = yes ,则此类标头之一可能是经过身份验证的用户名,Postfix 添加该名称。然后你可以告诉 amavis 对这个标题采取行动:

package Amavis::Custom;
use strict;
BEGIN {
        import Amavis::Conf qw(:platform :confvars c cr ca $myhostname);
        import Amavis::Util qw(do_log untaint safe_encode safe_decode);
        import Amavis::rfc2821_2822_Tools;
        import Amavis::Notify qw(build_mime_entity);
}
sub new {
        my($class,$conn,$msginfo) = @_;
        my($self) = bless {}, $class;
        my $auth_sender = 0;
        foreach my $line (@{$msginfo->{'orig_header'}}) {
                $line =~ s/\n    / /g;
                # WARNING: you need to improve this to AT LEAST also match
                # for your OWN mail servers name!
                $auth_sender = 1 if $line =~ m/^Authenticated sender/i;
        }
        if ($auth_sender) {
                do_log(2, sprintf("Load pre-queue submission policy bank"));
                Amavis::load_policy_bank('PREQ-SUBMISSION')
        }
        return $self;
}
1;  # insure a defined return
Run Code Online (Sandbox Code Playgroud)

请不要忽略此代码中的警告:标头很容易伪造,其他邮件服务器也可以插入“经过身份验证的发件人”标头,因此更好地匹配诸如“your-mailserver.example.net.*Authenticated sender”之类的内容.

最后,关于您的一个评论:运行邮件服务器确实需要很多时间,并且需要您不断监控它是否被滥用。参与全球电子邮件系统没有“越狱”卡!