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)
如果可能的话,我还想将传入的病毒标记为病毒而不是完全拒绝邮件(因此不会丢失邮件)。
感谢您的帮助!
您想要做的需要将来自使用您的服务器的用户的邮件作为他们的 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”之类的内容.
最后,关于您的一个评论:运行邮件服务器确实需要很多时间,并且需要您不断监控它是否被滥用。参与全球电子邮件系统没有“越狱”卡!
归档时间: |
|
查看次数: |
6074 次 |
最近记录: |