这篇文章上次修改于 2449 天前,可能其部分内容已经发生变化,如有疑问可询问作者。 Linux 邮件服务器通常使用 sendmail,在网上 google 了 sendmail 的教程后,我决定知难而退, 改用 Postfix。 Postfix 是用来替代 sendmail 的,它的配置文件比 sendmail 简单得多,配置相 当容易。 在配置邮件服务器之前,先解释几个概念。我们通常使用 Email 都很容易,但是 Internet 的邮件系统是通过几个复杂的部分连接而成的,对于最终用户而言,我们熟悉的 Outlook, Foxmail 等都是用来收信和发信的,称之为 MUA:Mail User Agent,邮件用户代理。MUA 并非直接将邮件发送至收件人手中,而是通过 MTA:Mail Transfer Agent,邮件传输代理代 为传递,sendmail 和 Postfix 就是扮演 MTA 的角色。一封邮件从 MUA 发出后,可能通过一 个或多个 MTA 传递,最终到达 MDA:Mail Delivery Agent,邮件投递代理,邮件到达 MDA 后,就存放在某个文件或特殊的数据库里,我们将这个长期保存邮件的地方称之为邮箱。一 旦邮件到达邮箱,就原地不动了,等用户再通过 MUA 将其取走,就是用 Outlook,Foxmail 等软件收信的过程。所以一封邮件的流程是: 发件人:MUA --发送--> MTA -> ... -> MTA -> MDA <--收取-- MUA:收件人 MUA 到 MTA,以及 MTA 到 MTA 之间使用的协议就是 SMTP 协议,而收邮件时,MUA 到 MDA 之间使用的协议最常用的是 POP3 或 IMAP。 需要注意的是,专业邮件服务商都有大量的机器来为用户服务,所以通常 MTA 和 MDA 并不是同一台服务器,因此,在 Outlook 等软件里,我们需要分别填写 SMTP 发送服务器的 地址和 POP3 接收服务器的地址。 一:安装并配置 postfix 下面开始用 Postfix 搭建邮件服务器。 apt-get install postfix Postfix 只有一个/etc/postfix/main.cf 需要修改,其他配置文件可以直接使用默认设置。 第一个需要修改的参数是 myhostname,指向真正的域名,例如: myhostname =monitor.vm.stm.com mydomain 参数指向根域: mydomain = monitor.vm.stm.com myorigin 和 mydestination 都可以指向 mydomain: myorigin = $mydomain mydestination = $mydomainPostfix 默认只监听本地地址,如果要与外界通信,就需要监听网卡的所有 IP: inet_interfaces = all Postfix 默认将子网内的机器设置为可信任网络,多个网络使用空格隔开,支持掩码模式, 如果只信任本机,就设置为 host: #mynetworks = host Mynetworks = 127.0.0.1 10.0.0.2/32 10.0.0.4/32 配置哪些地址的邮件能够被 Postfix 转发,当然是 mydomain 的才能转发,否则其他人 都可以用这台邮件服务器转发垃圾邮件了: relay_domains = $mydomain 现在,Postfix 已经基本配置完成,接下来我们需要对邮件的发送进行控制: 二:配置 postfix 权限规则 对于外域到本域的邮件,必须接收,否则,收不到任何来自外部的邮件; 对于本域到外域的邮件,只允许从本机发出,否则,其他人通过伪造本域地址就可以向外域 发信; 对于外域到外域的邮件,直接拒绝,否则我们的邮件服务器就是 Open Relay,将被视为垃圾 邮件服务器。 先设置发件人的规则: smtpd_sender_restrictions = permit_mynetworks, check_sender_access hash:/etc/postfix/sender_access, permit 以上规则先判断是否是本域地址,如果是,允许,然后再从 sender_access 文件里检查 发件人是否存在,拒绝存在的发件人,最后允许其他发件人 然后设置收件人规则: smtpd_recipient_restrictions = permit_mynetworks, check_recipient_access hash:/etc/postfix/recipient_access, reject 以上规则先判断是否是本域地址,如果是,允许,然后再从 recipient_access 文件里检查 收件人是否存在,允许存在的收件人,最后拒绝其他收件人。 /etc/postfix/sender_access 的内容: @monitor.stm.com OK * REJECT /etc/postfix/recipient_access 的内容: @smalltreemedia.com OK *@smalltreemedia.com OK 因此,外域只能发送给以上两个 Email 地址,其他任何地址都将被拒绝。但本机到本机 发送不受影响。 最后用 postmap 生成 hash 格式的文件: # postmap sender_access# postmap recipient_access 启动 Postfix: # /etc/init.d/postfix start 现在就可以通过 telnet 来测试了:(红色是输入的命令) 220 mail.example.com ESMTP Postfix helo localhost 250 mail.example.com mail from:test@gmail.com 250 Ok rcpt to:webmaster@example.com 250 Ok data 354 End data with . hello!!!!!! . 250 Ok: queued as D68E41407D0 mail from:test@gmail.com 250 Ok rcpt to:haha@example.com 554 : Recipient address rejected: Access denied quit 221 Bye 如果配置了 SMTP 认证,就可以让用户远程发送时能通过认证后再发送邮件,目前还 没有配置,准备继续研究后再配置。需要注意的是,配置 SMTP 认证后,设置规则应该是: 外域->本域:不需认证,允许,否则将接受不到任何外部邮件;本域->外域:需要认证,否则拒绝。 因为我们作为发送服务器的 MTA 和转发的 MTA 实际上是由一个 MTA 完成的,所以需 要以上规则。对于大型邮件服务商,发送服务器的 MTA 和转发的 MTA 是分别部署的,例 如, sina 的发送服务器是 smtp.sina.com,需要经过用户认证,而转发服务器是 mx???.sina.com, 不需要认证,否则无法转发邮件。 最后不要忘了在 DNS 的 MX 记录中将域 monitor.stm.com 添上。 参考 http://ariyue.iteye.com/blog/457636 http://www.postfix.org/INSTALL.html https://help.ubuntu.com/community/Postfix
没有评论