本帖最后由 nettman 于 2015-4-3 22:04 编辑
接上篇:
国外个人作品介绍:构建个人私有云案例,保护数据隐私的控制权(2)
测试
就这些了!现在开始测试postfix和dovecot服务!
- service dovecot restart
- service postfix restart
复制代码
在服务器上,尝试发送邮件给本地用户:
- telnet localhost 25
- EHLO cloud.jhausse.net
- MAIL FROM:youremail@domain.com
- RCPT TO:roudy@jhausse.net
- data
- Subject: Hallo!
- This is a test, to check if cloud.jhausse.net is ready to be an MX!
- Cheers, Roudy
- .
- QUIT
复制代码
服务器应该接受我们的邮件并返回类似消息:
- 250 2.0.0 Ok: queued as 58D54101DB
复制代码
如果一切正常的话,检查一下/var/log/mail.log里的日志。应该有类似下面的一行:
- Nov 14 07:57:06 cloud dovecot: lmtp(4375, roudy@jhausse.net): ... saved mail to INBOX
复制代码
到这里一切都正常吗?不错。现在,让我尝试从不同的机器发邮件,比如说我们用来设定服务器的电脑。这次我们使用加密方式(TLS)和服务器对话:
- openssl s_client -connect cloud.jhausse.net:25 -starttls smtp
- EHLO cloud.jhausse.net
- MAIL FROM:roudy@jhausse.net
- rcpt to:bob@gmail.com
复制代码
服务器应该有这样的响应:
- 554 5.7.1 <bob@gmail.com>: Relay access denied
复制代码
这个没问题:如果服务器能接受这封邮件而不是返回如上的拒绝消息,那意味着我们架设的postfix是一个对全世界所有垃圾邮件都开放的中继,这将完全没法使用。除了'Relay access denied'消息,你也可能会收到这样的响应: - 554 5.7.1 Service unavailable; Client host [87.68.61.119] blocked using zen.spamhaus.org; http://www.spamhaus.org/query/bl?ip=87.68.61.119
复制代码
意思是你正尝试从一个被标记成垃圾邮件发送者的IP地址连接服务器。我在通过普通的因特网服务提供商(ISP)连接服务器时曾收到过这样的消息。要解决这个问题,可以试着从另一个主机发起连接,比如另外一个你可以SSH登录的主机。另外一种方式是,你可以修改postfix的main.cf配置文件,不要使用Spamhous的RBL,重启postfix服务,然后再检查上面的测试是否正常。不管用哪种方式,最重要的是你要确定一个能工作的,因为我们后面马上要测试其他功能。如果你选择了重新配置postfix不使用RBL,别忘了在完成本文后重新开启RBL并重启postfix,以避免收到一些不必要的垃圾邮件。(LCTT 译者注:在国内可以使用 CASA 的 RBL:cblplus.anti-spam.org.cn,参见: http://www.anti-spam.org.cn/ 。) 现在,我们试一下往SMTP端口25发送一封有效的邮件,这是一般正常的邮件服务器用来彼此对话的方式: - openssl s_client -connect cloud.jhausse.net:25 -starttls smtp
- EHLO cloud.jhausse.net
- MAIL FROM:youremail@domain.com
- RCPT TO:roudy@jhausse.net
复制代码
服务器应该有这样的响应: - Client host rejected: Greylisted, see http://postgrey.schweikert.ch/help/jhausse.net.html
复制代码
这意味着 postgrey工作正常。postgrey做的是用临时错误拒绝未知发送者的邮件。邮件的技术规则是要求邮件服务器尝试重新发送邮件。在5分钟后,postgrey就会接收这封邮件。一般世界范围内遵守规则的邮件服务器都会尝试为我们重复投递邮件,但大多数垃圾邮件发送者不会这样做。所以,等上5分钟,再次通过上面的命令发送一次,然后检查postfix应该正常接收了邮件。 之后,我们检查一下我们可以通过IMAP和dovecot对话获取刚才发送的两封邮件。 - openssl s_client -crlf -connect cloud.jhausse.net:993
- 1 login roudy@jhausse.net "mypassword"
- 2 LIST "" "*"
- 3 SELECT INBOX
- 4 UID fetch 1:1 (UID RFC822.SIZE FLAGS BODY.PEEK[])
- 5 LOGOUT
复制代码
这里,你应该把mypassword替换为你自己为这个邮件账号设定的密码。如果能正常工作,基本上我们已经拥有一个能接收邮件的邮件服务器了,通过它我们可以在各种设备(PC/笔记本、平板、手机...)上收取邮件了。
外发(中继)邮件
但是我们不能把邮件给它发送出去,除非我们自己从服务器发送。现在我们将让postfix为我们转发邮件,但是这个只有成功登录才可以,这是为了保证邮件是由服务器上的某个有效帐号发出来的。要做到这个,我们要打开一个特殊的,全程SSL连接的,SASL鉴权的邮件提交服务。在文件/etc/postfix/master.cf里设置下面的参数: - submission inet n - - - - smtpd
- -o syslog_name=postfix/submission
- -o smtpd_tls_security_level=encrypt
- -o smtpd_sasl_auth_enable=yes
- -o smtpd_client_restrictions=permit_sasl_authenticated,reject
- -o smtpd_sasl_type=dovecot
- -o smtpd_sasl_path=private/auth
- -o smtpd_sasl_security_options=noanonymous
- -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject_non_fqdn_recipient,reject_unauth_destination
复制代码
然后重启postfix服务: 复制代码
现在,让我们试试从一台不同的机器连接这个服务,确定一下postfix现在能够正常中继我们自己的而不是其他任何人的邮件: - openssl s_client -connect cloud.jhausse.net:587 -starttls smtp
- EHLO cloud.jhausse.net
复制代码
注意一下服务器建议的'250-AUTH PLAIN'功能,在从端口25连接的时候不会出现。 - MAIL FROM:asdf@jkl.net
- rcpt to:bob@gmail.com
- 554 5.7.1 <bob@gmail.com>: Relay access denied
- QUIT
复制代码
这个没问题,postfix在不认识我们的时候是不会中继邮件的。所以,首先让我们先鉴定一下自己的身份。要这样做,我们首先需要生成一个鉴权字符串: - echo -ne '\000roudy@jhausse.net\000mypassword'|base64
复制代码
然后让我们尝试再次通过服务器发送邮件: - openssl s_client -connect cloud.jhausse.net:587 -starttls smtp
- EHLO cloud.jhausse.net
- AUTH PLAIN DGplYW5AMTk4NGNsb3VQLm5ldAA4bmFmNGNvNG5jOA==
- MAIL FROM:asdf@jkl.net
- rcpt to:bob@gmail.com
复制代码
- telnet cloud.jhausse.net 25
- EHLO cloud.jhausse.net
- MAIL FROM:youremail@domain.com
- rcpt to:postmaster@jhausse.net
- data
- Subject: Virtual alias test
- Dear postmaster,
- Long time no hear! I hope your MX is working smoothly and securely.
- Yours sincerely, Roudy
- .
- QUIT
复制代码
让我们检查一下邮件是否被正常送到正确的收件箱了: - openssl s_client -crlf -connect cloud.jhausse.net:993
- 1 login roudy@jhausse.net "mypassword"
- 2 LIST "" "*"
- 3 SELECT INBOX
- * 2 EXISTS
- * 2 RECENT
- 4 LOGOUT
复制代码
到这里,我们已经拥有一个能正常工作的邮箱服务器了,能收发邮件。我们可以配置自己的设备来使用它。 PS:不要忘记再次试试通过端口25往自己架设的服务器上的帐号发送邮件,来验证你已经没有被postgrey阻挡了。
阻止垃圾邮件进入你的收件箱
为了过滤垃圾邮件,我们已经使用了实时黑名单(RBL)和灰名单(postgrey)。现在我们将增加自适应垃圾邮件过滤来让我们的垃圾邮件过滤能力提高一个等级。这意味着我们将为我们的邮件服务器增加人工智能,这样它就能从经验中学习哪些邮件是垃圾哪些不是。我们将使用来实现这个功能。
- apt-get install dspam dovecot-antispam postfix-pcre dovecot-sieve
复制代码
dovecot-antispam是一个安装包,可以在我们发现有邮件被dspam误分类了之后让dovecot重新更新垃圾邮件过滤器。基本上,我们所需要做的就只是把邮件放进或拿出垃圾箱。dovecot-antispam将负责调用dspam来更新过滤器。至于postfix-pcre和dovecot-sieve,我们将分别用它们来把接收的邮件传递给垃圾邮件过滤器以及自动把垃圾邮件放入用户的垃圾箱。
在配置文件/etc/dspam/dspam.conf里,为以下参数设置相应的值:
- TrustedDeliveryAgent "/usr/sbin/sendmail"
- UntrustedDeliveryAgent "/usr/lib/dovecot/deliver -d %u"
- Tokenizer osb
- IgnoreHeader X-Spam-Status
- IgnoreHeader X-Spam-Scanned
- IgnoreHeader X-Virus-Scanner-Result
- IgnoreHeader X-Virus-Scanned
- IgnoreHeader X-DKIM
- IgnoreHeader DKIM-Signature
- IgnoreHeader DomainKey-Signature
- IgnoreHeader X-Google-Dkim-Signature
- ParseToHeaders on
- ChangeModeOnParse off
- ChangeUserOnParse full
- ServerPID /var/run/dspam/dspam.pid
- ServerDomainSocketPath "/var/run/dspam/dspam.sock"
- ClientHost /var/run/dspam/dspam.sock
复制代码
然后,在配置文件/etc/dspam/default.prefs里,把以下参数改为:
- spamAction=deliver # { quarantine | tag | deliver } -> default:quarantine
- signatureLocation=headers # { message | headers } -> default:message
- showFactors=on
复制代码
现在我们需要把dspam连接到postfix和dovecot上,在配置文件/etc/postfix/master.cf最后添加这样两行:
- dspam unix - n n - 10 pipe
- flags=Ru user=dspam argv=/usr/bin/dspam --deliver=innocent,spam --user $recipient -i -f $sender -- $recipient
- dovecot unix - n n - - pipe
- flags=DRhu user=mail:mail argv=/usr/lib/dovecot/deliver -f ${sender} -d ${recipient}
复制代码
现在我们将告诉postfix通过dspam来过滤所有提交给服务器端口25(一般的SMTP通信)的新邮件,除非该邮件是从服务器本身发出(permit_mynetworks)。注意下我们通过SASL鉴权提交给postfix的邮件不会通过dspam过滤,因为我们在前面部分里为这种方式设定了独立的提交服务。编辑文件/etc/postfix/main.cf将选项**smtpd_client_restrictions**改为如下内容:
- smtpd_client_restrictions = permit_mynetworks, reject_rbl_client zen.spamhaus.org, check_policy_service inet:127.0.0.1:10023, check_client_access pcre:/etc/postfix/dspam_filter_access
复制代码
在文件末尾,还需要增加:
- # For DSPAM, only scan one mail at a time
- dspam_destination_recipient_limit = 1
复制代码
现在我们需要指定我们定义的过滤器。基本上,我们将告诉postfix把所有邮件(如下用 /./ 代表)通过unix套接字发给dspam。创建一个新文件/etc/postfix/dspam_filter_access并把下面一行写进去:
- /./ FILTER dspam:unix:/run/dspam/dspam.sock
复制代码
这是postfix部分的配置。现在让我们为dovecot设置垃圾过滤。在文件/etc/dovecot/conf.d/20-imap.conf里,修改imap mail_plugin插件参数为下面的方式:
- mail_plugins = $mail_plugins antispam
复制代码
并为lmtp增加一个部分:
- protocol lmtp {
- # Space separated list of plugins to load (default is global mail_plugins).
- mail_plugins = $mail_plugins sieve
- }
复制代码
我们现在设置dovecot-antispam插件。编辑文件/etc/dovecot/conf.d/90-plugin.conf并把以下内容添加到插件部分:
- plugin {
- ...
- # Antispam (DSPAM)
- antispam_backend = dspam
- antispam_allow_append_to_spam = YES
- antispam_spam = Junk;Spam
- antispam_trash = Trash;trash
- antispam_signature = X-DSPAM-Signature
- antispam_signature_missing = error
- antispam_dspam_binary = /usr/bin/dspam
- antispam_dspam_args = --user;%u;--deliver=;--source=error
- antispam_dspam_spam = --class=spam
- antispam_dspam_notspam = --class=innocent
- antispam_dspam_result_header = X-DSPAM-Result
- }
复制代码
然后在文件/etc/dovecot/conf.d/90-sieve.conf里指定默认的sieve脚本,这个将对服务器上所有用户有效:
- sieve_default = /etc/dovecot/default.sieve
复制代码
什么是sieve以及为什么我们需要为所有用户设置一个默认脚本?sieve可以在IMAP服务器上为我们自动处理任务。在我们的例子里,我们想让所有被确定为垃圾的邮件移到垃圾箱而不是收件箱里。我们希望这是服务器上所有用户的默认行为;这是为什么我们把这个脚本设为默认脚本。现在让我们来创建这个脚本,建立一个新文件/etc/dovecot/default.sieve并写入以下内容:
- require ["regex", "fileinto", "imap4flags"];
- # Catch mail tagged as Spam, except Spam retrained and delivered to the mailbox
- if allof (header :regex "X-DSPAM-Result" "^(Spam|Virus|Bl[ao]cklisted)$",
- not header :contains "X-DSPAM-Reclassified" "Innocent") {
- # Mark as read
- # setflag "\\Seen";
- # Move into the Junk folder
- fileinto "Junk";
- # Stop processing here
- stop;
- }
复制代码
现在我们需要编译这个脚本好让dovecot能运行它。我们也需要给它合适的权限。
- cd /etc/dovecot
- sievec .
- chown mail.dovecot default.siev*
- chmod 0640 default.sieve
- chmod 0750 default.svbin
复制代码
最后,我们需要修改dspam需要读取的两个postfix配置文件的权限:
- chmod 0644 /etc/postfix/dynamicmaps.cf /etc/postfix/main.cf
复制代码
就这些!让我们重启dovecot和postfix服务:
- service dovecot restart
- service postfix restart
复制代码
测试
然后通过从远程主机(比如我们用来设定服务器的电脑)连接服务器来测试一下反垃圾邮件:
- openssl s_client -connect cloud.jhausse.net:25 -starttls smtp
- EHLO cloud.jhausse.net
- MAIL FROM:youremail@domain.com
- rcpt to:roudy@jhausse.net
- DATA
- Subject: DSPAM test
- Hi Roudy, how'd you like to eat some ham tonight? Yours, J
- .
- QUIT
复制代码
让我们检查一下邮件是否已经送到:
- openssl s_client -crlf -connect cloud.jhausse.net:993
- 1 login roudy@jhausse.net "mypassword"
- 2 LIST "" "*"
- 3 SELECT INBOX
- 4 UID fetch 3:3 (UID RFC822.SIZE FLAGS BODY.PEEK[])
复制代码
这个应该返回SPAM为邮件增加了一组标记的数据,看上去像这样:
- X-DSPAM-Result: Innocent
- X-DSPAM-Processed: Sun Oct 5 16:25:48 2014
- X-DSPAM-Confidence: 1.0000
- X-DSPAM-Probability: 0.0023
- X-DSPAM-Signature: 5431710c178911166011737
- X-DSPAM-Factors: 27,
- Received*Postfix+with, 0.40000,
- Received*with+#+id, 0.40000,
- like+#+#+#+ham, 0.40000,
- some+#+tonight, 0.40000,
- Received*certificate+requested, 0.40000,
- Received*client+certificate, 0.40000,
- Received*for+roudy, 0.40000,
- Received*Sun+#+#+#+16, 0.40000,
- Received*Sun+#+Oct, 0.40000,
- Received*roudy+#+#+#+Oct, 0.40000,
- eat+some, 0.40000,
- Received*5+#+#+16, 0.40000,
- Received*cloud.jhausse.net+#+#+#+id, 0.40000,
- Roudy+#+#+#+to, 0.40000,
- Received*Oct+#+16, 0.40000,
- to+#+#+ham, 0.40000,
- Received*No+#+#+requested, 0.40000,
- Received*jhausse.net+#+#+Oct, 0.40000,
- Received*256+256, 0.40000,
- like+#+#+some, 0.40000,
- Received*ESMTPS+id, 0.40000,
- how'd+#+#+to, 0.40000,
- tonight+Yours, 0.40000,
- Received*with+cipher, 0.40000
- 5 LOGOUT
复制代码
很好!你现在已经为你服务器上的用户配置好自适应垃圾邮件过滤。当然,每个用户将需要在开始的几周里培训过滤器。要标记一则信息为垃圾,只需要在你的任意设备(电脑,平板,手机)上将它移动到叫“垃圾箱”或“废纸篓”的目录里。否则它将被标记为有用。
相关内容:
国外个人作品介绍:构建个人私有云案例,保护数据隐私的控制权(1)
国外个人作品介绍:构建个人私有云案例,保护数据隐私的控制权(2)
国外个人作品介绍:构建个人私有云案例,保护数据隐私的控制权(3)
国外个人作品介绍:构建个人私有云案例,保护数据隐私的控制权(4)
|