Debian 下用 Exim 搭建简易 SMTP 服务
debian吧
全部回复
仅看楼主
level 14
IronWard 楼主
一楼留念。
2013年11月10日 07点11分 1
level 14
IronWard 楼主
Debian 下用 Exim 搭建简易 SMTP 服务
1. 准备
首先你得有一台服务器,VPS或实体机都行,要有域名和公网IP。
安装 Debian 时会默认安装 Exim 作为邮件收发程序 (MTA)。软件包叫作 exim4。
2. 配置 Exim4
为了将 Exim 配置为 Internet Site,用 root 身份执行下面命令:
# dpkg-reconfigure exim4-config
选择 'Internet Site' 那一项。
'System mail name:' 填你的邮件服务器的域名,就是邮件地址中 @ 后面那部分。
配置过程中其它填空的项都不用填,选择的项都用默认即可。
配置完成后 debconf 会根据前述的选择和 /etc/exim4 下的配置模板自动生成 Exim 的
配置写在 /var/lib/exim4/config.autogenerated 文件里。
现在收邮件应该没问题了,你可以试着从别的邮箱比如 Gmail 给自己服务器上的某个用户发邮件
了。但是发邮件还不行,发出去的邮件会被绝大多数邮件服务器拒绝掉,因为邮件被当作垃圾邮件
了。下面来解决这个问题。
3. 为你的邮件服务 IP 设置反向 DNS 解析
你的邮件服务器的 IP 地址应该能通过 DNS 反解析出一个主机名,该主机名经过 DNS 解析应该
得到你的邮件服务器的 IP。这个一般不是你自己可以设置的,要联系你的 IP 地址提供商了。
查看 IP 地址的反向 DNS :
$ host -t ptr <IP地址>
4. 为你的邮件服务域名设置 SPF
在你的邮件域名的 DNS 设置中,添加一条 TXT 记录,内容的具体格式请参考 RFC4408。一个
比较简单有效的设置是:
v=spf1 +mx -all
意思是仅允许你的域名下的 MX 记录中的服务器以你的域名发送邮件。
查看某域名的 MX 记录和 TXT 记录:
$ host -t mx <你的域名>
$ host -t txt <你的域名>
经过上面 3 和 4,你发出去的邮件就不会再被 Gmail 等当作垃圾邮件了。
随之而来的一个你会问的问题:“那我的邮件服务器怎么反垃圾?”
5. 对收到的邮件进行反向 DNS 检查
创建文件 /etc/exim4/exim4.conf.localmacros,内容为下面一行:
CHECK_RCPT_REVERSE_DNS = 1
Debian 下的 Exim 在检查反向 DNS 失败时,默认只会给个警告,邮件仍会被接收。个人觉得
这个设置太宽松了,下面通过修改配置模板使 Exim 只接收反向 DNS 成功的邮件。
编辑 /etc/exim4/exim4.conf.template
找到 'REVERSE_DNS'
把整个 warn 段落改成下面的 deny 段落:
.ifdef CHECK_RCPT_REVERSE_DNS
deny
message = Reverse DNS lookup failed for $sender_host_address
log_message = Reverse DNS lookup failed for $sender_host_address
condition = ${if and{{def:sender_host_address}\
{!def:sender_host_name}}\
{yes}{no}}
.endif
然后更新 Exim4 配置:
# update-exim4.conf && service exim4 restart
6. 对收到的邮件进行 SPF 检查
先安装 spfquery:
# aptitude install spf-tools-perl
然后在 /etc/exim4/exim4.conf.localmacros 里添加一行:
CHECK_RCPT_SPF = 1
介绍下 SPF 检查的几种返回结果:
0 pass - 对方域名的 SPF 明确指定该 IP 可以发送邮件
1 fail - 对方域名的 SPF 明确指定该 IP 不能发送邮件
2 softfail - 对方域名的 SPF 明确指定该 IP 不能发送邮件,但比 fail 弱
3 neutral - 对方域名的 SPF 未指明该 IP 能否发送邮件
4 permerror - 对方域名的 SPF 设置不符合协议
5 temperror - 查询对方域名的 SPF 时出现 DNS 错误
6 none - 对方域名未设置 SPF
Debian 下 Exim 的默认设置里对 SPF 的要求并不严格,它只会拒绝 SPF 'fail'
的情况,其它非 'pass' 的情况下只会给个警告,邮件仍会被接收。
提醒: Gmail 会返回 softfail,收到从 Gmail 发来的垃圾别怪我没提醒你 :)
下面通过修改配置模板使 Exim 只接收 SPF pass 的邮件,对 temperror 的情况做延后
处理,其它情况统统拒绝。
打开 /etc/exim4/exim4.conf.template 找到 'SPF';
关于 SPF 的第一个配置段落是 deny,我们要修改这个 deny 段里的 condition 语句里的
最后一个 if :
${if eq {$runrc}{1}{yes}{no}}
改为:
${if !eq {$runrc}{5}{yes}{no}}
deny 段后面跟着一个 defer 段,是处理 temperror 的,不改;
后面跟了两个 warn 段,都注释掉。
最后更新 Exim4 配置:
# update-exim4.conf && service exim4 restart
另外有一种更技术化的反垃圾手段叫 DKIM,但除了 Gmail 好像还没有其它邮件服务商支持,
这里就不介绍了。参考 RFC4871。
为了使你的邮件服务器为你转发你从别的机器上发来的邮件,需要设置 SMTP 身份认证。纯文本
的身份认证方式用得最多,但出于安全考虑,Exim 要求纯文本认证必须通过 TLS 加密。
7. 开启 TLS
先用 /usr/share/doc/exim4/examples/exim-gencert 脚本制作好证书和密钥,默认的
存放位置在 /etc/exim4/exim.crt 和 /etc/exim4/exim.key。
# bash /usr/share/doc/exim4/examples/exim-gencert
注意 'Server name' 必须填你的邮件服务器的 DNS 全称,比如 smtp.<domain>.xxx。
其它都不用填的。
然后在 /etc/exim4/exim4.conf.localmacros 里加一行:
MAIN_TLS_ENABLE = 1
更新一下 Exim4 配置:
# update-exim4.conf && service exim4 restart
如何检查 TLS 是否开启成功?
$ openssl s_client -connect <服务地址>:25 -starttls smtp
8. 纯文本身份认证 (AUTH PLAIN)
一个简单又比较安全的方法是使用单独的 passwd 文件:
# echo '账号:'$(mkpasswd 密码)':' >>/etc/exim4/passwd
# chown root:Debian-exim /etc/exim4/passwd
# chmod 640 /etc/exim4/passwd
然后修改配置模板:
打开 /etc/exim4/exim4.conf.template 找到 'authenticators';
把 plain_server 段落前面的注释'#'去掉即可。
更新一下 Exim4 配置:
# update-exim4.conf && service exim4 restart
如果你的服务器提供 POP 服务,建议用 POP 服务的用户名和密码来做 SMTP 认证。
配置模板里提供了一个 plain_courier_authdaemon 段,如果你使用 courier 邮局套件
把这段去掉注释即可。(我没用过。)
9. 参考文档
/usr/share/doc/exim4/README.Debian.gz
exim.org/docs.html
RFC4408 - SPF
RFC4616 - PLAIN SASL
RFC4871 - DKIM
RFC4954 - SMTP AUTH
RFC5321 - SMTP
2013年11月10日 07点11分 2
level 7
好麻烦的样子...
有没简单的办法利用已有的邮箱? 这样就不用理反垃圾什么的了
2013年11月10日 13点11分 3
用Gmail, 网易邮箱什么的…
2013年11月10日 13点11分
回复 IronWard :我的意思是比如已有Gmail, 然后希望在本地敲个命令就可以用Gmail收/发邮件, 而不必登录web界面或用thunderbird之类的带GUI的软件.
2013年11月10日 14点11分
回复 1mHuman :试试 mutt…
2013年11月10日 14点11分
我印象中前几年,我随便搭一个exim4,配置一下,mail就可以发到我的qq邮箱了。尼玛今天再试,就被当垃圾群发邮件屏蔽了。不知道qq邮箱是搞了域名反解还是spf,好麻烦啊,搭个自high网站,简单点发送注册邮件都不行了。
2014年11月16日 05点11分
level 7
mark
2013年11月15日 13点11分 5
1