配置自己的 CentOS 邮件服务器 | 基础篇

/ 0评 / 0

本文章是用于配置一个邮件服务器的。如果只是希望能够在安装了 CentOS 的电脑上收发邮件的话,请使用 Thunderbird 等邮件客户端;如果没有图形界面,则可以考虑使用 mutt 等字符邮件客户端。

注意:本方案不适用于阿里云和腾讯云等。由于服务器使用条款限制,不可能为其配置完整的邮件服务器。推荐将服务部署在国内服务器并使用 Vultr 作为邮件服务器。使用国外服务器时,请遵守相关法律法规,避免造成损失。请不要使用邮件服务器发送垃圾邮件或广告邮件,否则可能会遭到永久封禁。

配置 DNS

如果没有域名的话,大多数的邮件服务器会拒绝通信。这就比较痛苦了。不过好在并不是所有域名都特别贵,所以——。接下来我们以 example.commail.example.com 为例,当你遇到这两个域名的时候,请自行替换成你的对应值。

首先,配置 MX 记录使得自己的域名作为邮件地址时可以找到实际邮件地址:

Type    Host    Destination        Priority   TTL
MX      @       mail.example.com   10         3600

然后再配置一个 A 记录指向自己的邮件服务器:

Type    Host    Destination        Priority   TTL
MX      @       mail.example.com   10         3600
A       mail    ?.?.?.?                       3600

记得把 ?.?.?.? 替换成为邮件服务器的实际 IP 地址。什么?你说这个邮件服务器没有固定 IP 地址?那么,请找一个有固定 IP 地址的服务器作为穿透机,谢谢。

然后,将邮件服务器的主机名设置成 mail.exaple.com 以便和其他服务器交换邮件数据:

# hostname mail.example.com

安装软件

一句话安装:

# yum install postfix dovecot openssl cyrus-sasl cyrus-sasl-plain

配置服务

我们希望这个邮件服务器可以接收从外部发往本机的邮件,也可以从本机向外部发送邮件,但不接受从外部发往外部的邮件。而要收取信件或者发送信件,必须登录该服务器才能够进行。而登录过程也应受到 SSL/TLS 保护。

那么,先自签一份证书用于登录加密。

# mkdir -p /etc/postfix/ssl
# cd /etc/postfix/ssl
# openssl req -x509 -nodes -newkey rsa:4096 -keyout server.key -out server.crt -days 365

签证书的过程中会询问一些问题,按照屏幕提示输入即可。对于不想回答或者暂无答案的问题,可以输入句点 (.) 表示留空。

注意到由于我们使用的是自签名证书,所以会触发邮件客户端的不信任提示。在邮件客户端内选择添加信任即可。

完成后,配置 SASL 服务,编辑 /etc/sysconfig/saslauthd, 更改为如下内容

MECH="rimap -r"
FLAGS="-O <邮件服务器域名>"

之后,启动 SASL 服务:

# systemctl enable saslauthd --now

现在,我们配置 postfix 作为邮件服务端。

编辑 /etc/postfix/main.cf, 将如下内容追加到文件末尾:

myhostname = mail.example.com # 记得改成对应值
mydomain = example.com # 改成对应值
myorigin = $mydomain
home_mailbox = mail/
mynetworks = 127.0.0.0/16
inet_interfaces = all
inet_protocols = ipv4
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
smtpd_sasl_type = cyrus
smtpd_sasl_local_domain =
smtpd_sasl_security_options = noanonymous # 不允许匿名登录
smtpd_sasl_tls_security_options = $smtpd_sasl_security_options
broken_sasl_auth_clients = yes
smtpd_sasl_auth_enable = yes
# 入站限制:允许接收邮件、拒绝文件中指定的域名
smtpd_sender_restrictions = permit_mynetworks,permit_sasl_authenticated,check_sender_access hash:/etc/postfix/sender_access,permit
# 出站限制:允许已登录、允许子网、允许文件中指定的收件人、拒绝其他
smtpd_recipient_restrictions = permit_sasl_authenticated,permit_mynetworks,check_recipient_access hash:/etc/postfix/recipient_access,reject_unauth_destination,reject
smtp_tls_security_level = may
smtpd_tls_security_level = may
smtp_tls_note_starttls_offer = yes
smtpd_tls_loglevel = 1
smtpd_tls_key_file = /etc/postfix/ssl/server.key
smtpd_tls_cert_file = /etc/postfix/ssl/server.crt
smtpd_tls_received_header = yes
smtpd_tls_session_cache_timeout = 3600s
tls_random_source = dev:/dev/urandom

诚然,你也可以手动将散落在文件各处的配置值一一解注释并改成合适的值。

然后,创建 /etc/postfix/sender_access, 输入以下内容:

<根域名> REJECT

这表示拒绝发信人为该域名的邮件,也可以填写多行拒绝多个域名(比如拒绝一些开放邮件中继的发信)。这是为了防止伪造邮件进入该邮件服务器,因为子网内和登录的用户是允许作为该域名的发信人的。

创建 /etc/postfix/recipient_access, 输入以下内容:

someone@example.com OK

这表示允许收件人为 someone@example.com 的邮件进入服务器,你应该按照需求更改地址,也可以填写多行允许多个收件人。考虑到有很多蛋疼的要死的垃圾邮件群发,仅允许少部分非常用用户名收信是一个比较好的策略(如果你懒得配置邮件过滤器的话)。

完成编辑后,使用这两个命令生成 postfix 使用的过滤文件:

# postmap /etc/postfix/sender_access
# postmap /etc/postfix/recipient_access

然后,编辑 /etc/postfix/master.cf, 将以下行解注释:

    smtp      inet  n       -       n       -       -       smtpd
    submission     inet  n       -       n       -       -       smtpd
      -o syslog_name=postfix/submission
      -o smtpd_sasl_auth_enable=yes
      -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
      -o milter_macro_daemon_name=ORIGINATING
    smtps     inet  n       -       n       -       -       smtpd
      -o syslog_name=postfix/smtps
      -o smtpd_sasl_auth_enable=yes
      -o smtpd_recipient_restrictions=permit_sasl_authenticated,reject
      -o milter_macro_daemon_name=ORIGINATING

之后编辑 /etc/dovecot/conf.d/10-master.conf, 找到对应段落并编辑为:

# Postfix smtp-auth
unix_listener /var/spool/postfix/private/auth {
	mode = 0660
	user = postfix
	group = postfix
}

之后编辑 /etc/dovecot/conf.d/10-auth.conf, 找到对应段落并编辑为:

auth_mechanisms = plain login

最后编辑 /etc/dovecot/conf.d/10-mail.conf, 找到对应段落并编辑为:

mail_location = maildir:~/mail

如果还希望额外启用 POP3, 则仍需要编辑 /etc/dovecot/conf.d/20-pop3.conf 并解注释该行:

pop3_uidl_format = %08Xu%08Xv

完成上述编辑后,启动邮件服务:

# systemctl start dovecot
# systemctl enable dovecot
# systemctl start postfix
# systemctl enable postfix

邮件服务器启动后即可开放防火墙对应端口:

# firewall-cmd --permanent --add-service=smtp
# firewall-cmd --permanent --add-port=587/tcp
# firewall-cmd --permanent --add-port=465/tcp
# firewall-cmd --permanent --add-port=110/tcp
# firewall-cmd --permanent --add-service=pop3s
# firewall-cmd --permanent --add-port=143/tcp
# firewall-cmd --permanent --add-service=imaps
# firewall-cmd --permanent --add-service=http
# firewall-cmd --reload

之后,可以尝试向自己的邮件服务器发送一封邮件来测试其是否正常工作。

解锁端口

这一部分就是为什么国内的大多数服务供应商不适合作为邮件服务器的原因。默认情况下,SMTP 服务间通信端口 (25) 是不能出站的。这就意味着你的服务器将只能收到来信而无法向外发信。

好在 Vultr 可以解锁。截至发稿时,解锁 25 端口只需要向客服说明用途并承诺遵守无垃圾邮件条约即可,无需提供其他资料。阿里云虽然也提供了 25 端口解锁,但是要求不得直接向外发信而是必须借助第三方邮件中继向外发信。

具体的解锁方法为进入客服 (Support), 创建新工单 (Open new ticket), 选择自己的服务器实例并在标题中填写 Request on unblocking SMTP port, 内容中……你过了四级了对吧?书信会写不?

Hi,

I am writing to request for unblocking of port 25 of this server instance.

<说明使用邮件的理由>.

Thanks for your attention. I am looking forward to your reply.

Regards.

之后客服会先回复该情况不属于技术支持而是账户管理,已经转发到账户管理客服。一段时间后(账户管理客服是早上 9 点上班,下午 5 点下班,而且人家过的是美国东部时间,对应到国内应该是晚上 9 点到次日凌晨 5 点,或者由于夏令时可能会挪动一小时?)账户管理客服会回复并再次询问使用邮件的理由(尽管之前你已经陈述过了,但这大概是流程的一部分,所以再来一把)。回复工单如下:

<使用邮件的理由,包括邮件在什么情况下发送>.

<估计邮件的发送频率, 如 The estimated traffic will be 5 mails per day at most.>.

如果一切顺利,客服会告知 SMTP 端口已经开放,通过面板重启服务器实例即可。注意一定要通过面板重启,在 SSH 中敲 reboot 是不行的。

现在,我们就得到了自己的邮件服务器。可以配置你的邮件客户端登录并使用了。用户名和密码与你通过 SSH 登录服务器时使用的用户名和密码一致。你也可以建立不可登录用户作为专用的邮件账户。

发表回复

您的电子邮箱地址不会被公开。 必填项已用 * 标注

Your comments will be submitted to a human moderator and will only be shown publicly after approval. The moderator reserves the full right to not approve any comment without reason. Please be civil.