第 21/30 天
引言
电子邮件仍然是互联网上最基础、最广泛使用的通信协议之一。无论是企业内部的邮件系统,还是个人开发者搭建的邮件服务,Postfix 和 Dovecot 的组合都是 Linux 生态中最经典、最成熟的方案。Postfix 负责 SMTP 协议的邮件发送与转发,Dovecot 负责 POP3/IMAP 协议的邮件接收与存储。今天,我们将在 Ubuntu 上从零搭建一套完整的邮件服务器,涵盖域名配置、证书加密、用户认证以及安全加固。
一、邮件系统架构概述
一个完整的邮件服务器由以下组件构成:
| 组件 | 协议 | 作用 |
|---|---|---|
| MTA (Mail Transfer Agent) | SMTP (25/587) | 发送和转发邮件,代表:Postfix、Exim、Sendmail |
| MDA (Mail Delivery Agent) | — | 将邮件投递到用户邮箱,Postfix 内置或 Dovecot LMTP |
| MRA (Mail Retrieval Agent) | IMAP (143/993) / POP3 (110/995) | 用户读取邮件,代表:Dovecot、Courier |
| MUA (Mail User Agent) | — | 客户端软件,如 Outlook、Thunderbird、手机邮件 App |
我们的部署架构:
发送端 → DNS MX 查询 → Postfix (SMTP) → Dovecot (IMAP) → 用户收件箱
↑
本地 MUA 通过 Submission (587) 发送
二、环境准备与域名配置
2.1 前置条件
- 一台 Ubuntu 22.04/24.04 服务器(公网 IP)
- 一个域名(如
example.com),DNS 可管理 - 开放端口:25 (SMTP), 587 (Submission), 143/993 (IMAP), 110/995 (POP3)
2.2 DNS 记录配置
在域名 DNS 管理面板中添加以下记录:
| 记录类型 | 主机名 | 值 | 说明 |
|---|---|---|---|
| A | mail |
服务器公网 IP | 邮件服务器主机 |
| MX | @ |
mail.example.com. |
邮件交换记录(优先级 10) |
| TXT | @ |
v=spf1 mx ~all |
SPF 记录,声明哪些服务器可以发送本域邮件 |
| TXT | _dmarc |
v=DMARC1; p=quarantine; |
DMARC 策略 |
| TXT | mail._domainkey |
稍后生成 | DKIM 签名密钥 |
注意:MX 记录的值必须指向一个 A 记录,不能直接是 CNAME。末尾的
.表示完整域名(FQDN)。
2.3 设置主机名
# 设置完整的 FQDN 主机名
sudo hostnamectl set-hostname mail.example.com
# 编辑 /etc/hosts,确保主机名解析正确
echo "192.168.1.100 mail.example.com mail" | sudo tee -a /etc/hosts
# 验证
hostname -f
# 输出: mail.example.com
三、安装 Postfix(MTA)
3.1 安装与初始配置
# 安装 Postfix
sudo apt update
sudo apt install postfix -y
# 安装过程中选择 "Internet Site",然后输入域名 "example.com"
安装完成后,检查服务状态:
sudo systemctl status postfix
# 输出示例:
# ● postfix.service - Postfix Mail Transport Agent
# Loaded: loaded (/lib/systemd/system/postfix.service; enabled; vendor preset: enabled)
# Active: active (running) since Mon 2026-07-28 08:00:00 CST
3.2 Postfix 核心配置
Postfix 的主配置文件是 /etc/postfix/main.cf。以下是一个生产级配置示例:
# 备份原始配置
sudo cp /etc/postfix/main.cf /etc/postfix/main.cf.bak
# 编辑配置
sudo tee /etc/postfix/main.cf << 'EOF'
# 基本设置
myhostname = mail.example.com
mydomain = example.com
myorigin = $mydomain
inet_interfaces = all
inet_protocols = ipv4
# 允许接收的域名
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
# 允许通过本机中继的网络
mynetworks = 127.0.0.0/8, [::ffff:127.0.0.0]/104, [::1]/128
# 邮箱存储路径
home_mailbox = Maildir/
# 邮件大小限制(50MB)
message_size_limit = 52428800
# SMTP 认证(通过 Dovecot SASL)
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
smtpd_sasl_local_domain = $mydomain
# TLS 加密(用于 Submission 587)
smtpd_tls_cert_file = /etc/letsencrypt/live/mail.example.com/fullchain.pem
smtpd_tls_key_file = /etc/letsencrypt/live/mail.example.com/privkey.pem
smtpd_tls_security_level = may
smtpd_tls_loglevel = 1
smtpd_tls_session_cache_database = btree:${data_directory}/smtpd_scache
# Submission 端口(587)配置 - 需要客户端认证
smtpd_tls_security_level = encrypt
smtpd_tls_auth_only = yes
# 安全限制
smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination
smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, defer_unauth_destination
# DKIM 配置(稍后设置)
milter_default_action = accept
milter_protocol = 6
smtpd_milters = inet:localhost:8891
non_smtpd_milters = inet:localhost:8891
EOF
3.3 配置 Submission 端口(587)
编辑 /etc/postfix/master.cf,取消 Submission 端口的注释:
# 取消以下行的注释
sudo sed -i '/^#submission/s/^#//' /etc/postfix/master.cf
sudo sed -i '/^# -o syslog_name/s/^#//' /etc/postfix/master.cf
sudo sed -i '/^# -o smtpd_tls_security_level/s/^#//' /etc/postfix/master.cf
sudo sed -i '/^# -o smtpd_sasl_auth_enable/s/^#//' /etc/postfix/master.cf
sudo sed -i '/^# -o smtpd_relay_restrictions/s/^#//' /etc/postfix/master.cf
sudo sed -i '/^# -o milter_macro_daemon_name/s/^#//' /etc/postfix/master.cf
执行后,master.cf 中对应的部分应如下所示:
submission inet n - y - - smtpd
-o syslog_name=postfix/submission
-o smtpd_tls_security_level=encrypt
-o smtpd_sasl_auth_enable=yes
-o smtpd_relay_restrictions=permit_sasl_authenticated,reject
-o milter_macro_daemon_name=ORIGINATING
四、安装 Dovecot(IMAP/POP3)
4.1 安装 Dovecot
sudo apt install dovecot-core dovecot-imapd dovecot-pop3d -y
4.2 配置 Dovecot
编辑 /etc/dovecot/dovecot.conf:
sudo tee /etc/dovecot/dovecot.conf << 'EOF'
## Dovecot 主配置文件
# 启用协议
protocols = imap pop3
# 监听所有网络接口
listen = *
# 日志设置
log_path = /var/log/dovecot.log
info_log_path = /var/log/dovecot-info.log
debug_log_path = /var/log/dovecot-debug.log
auth_verbose = yes
auth_debug = yes
mail_debug = yes
# 认证配置
!include /etc/dovecot/conf.d/10-auth.conf
!include /etc/dovecot/conf.d/10-mail.conf
!include /etc/dovecot/conf.d/10-master.conf
!include /etc/dovecot/conf.d/10-ssl.conf
EOF
4.3 配置邮箱存储
编辑 /etc/dovecot/conf.d/10-mail.conf:
sudo tee /etc/dovecot/conf.d/10-mail.conf << 'EOF'
# 邮箱存储格式:Maildir(与 Postfix 的 home_mailbox 一致)
mail_location = maildir:~/Maildir
# 允许的邮箱命名空间
namespace inbox {
inbox = yes
}
EOF
4.4 配置 Dovecot SASL 认证(供 Postfix 使用)
编辑 /etc/dovecot/conf.d/10-master.conf:
sudo tee /etc/dovecot/conf.d/10-master.conf << 'EOF'
service imap-login {
inet_listener imap {
port = 143
}
inet_listener imaps {
port = 993
ssl = yes
}
}
service pop3-login {
inet_listener pop3 {
port = 110
}
inet_listener pop3s {
port = 995
ssl = yes
}
}
service auth {
# Postfix 通过 Unix socket 进行 SASL 认证
unix_listener /var/spool/postfix/private/auth {
mode = 0660
user = postfix
group = postfix
}
}
service auth-worker {
user = root
}
EOF
4.5 配置 SSL/TLS
编辑 /etc/dovecot/conf.d/10-ssl.conf:
sudo tee /etc/dovecot/conf.d/10-ssl.conf << 'EOF'
ssl = required
ssl_cert = </etc/letsencrypt/live/mail.example.com/fullchain.pem
ssl_key = </etc/letsencrypt/live/mail.example.com/privkey.pem
ssl_min_protocol = TLSv1.2
ssl_cipher_list = ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384
EOF
4.6 配置系统用户认证
编辑 /etc/dovecot/conf.d/10-auth.conf:
sudo tee /etc/dovecot/conf.d/10-auth.conf << 'EOF'
# 禁用明文认证(非加密连接不允许登录)
disable_plaintext_auth = yes
# 认证机制
auth_mechanisms = plain login
# 使用系统 PAM 认证
!include auth-system.conf.ext
EOF
五、创建邮件用户
我们使用系统用户来管理邮件账户。每个系统用户都可以接收邮件:
# 创建邮件用户(例如 admin 和 user1)
sudo useradd -m -s /bin/bash admin
sudo passwd admin
# 输入密码: ********
sudo useradd -m -s /bin/bash user1
sudo passwd user1
# 输入密码: ********
# 为每个用户创建 Maildir 目录
sudo mkdir -p /home/admin/Maildir/{new,cur,tmp}
sudo mkdir -p /home/user1/Maildir/{new,cur,tmp}
sudo chown -R admin:admin /home/admin/Maildir
sudo chown -R user1:user1 /home/user1/Maildir
sudo chmod -R 700 /home/*/Maildir
六、获取 SSL 证书(Let’s Encrypt)
# 安装 Certbot
sudo apt install certbot -y
# 获取证书(需要确保 80 端口可访问验证)
sudo certbot certonly --standalone -d mail.example.com
# 设置自动续期
sudo systemctl enable certbot.timer
sudo certbot renew --dry-run
七、安装 OpenDKIM(防止邮件被标记为垃圾)
DKIM(DomainKeys Identified Mail)通过数字签名验证邮件确实来自你的域名,是邮件送达率的关键。
# 安装 OpenDKIM
sudo apt install opendkim opendkim-tools -y
7.1 配置 OpenDKIM
编辑 /etc/opendkim.conf:
sudo tee /etc/opendkim.conf << 'EOF'
# 基本设置
Syslog yes
UMask 002
Socket inet:8891@localhost
PidFile /var/run/opendkim/opendkim.pid
# 域名与密钥
Domain example.com
KeyFile /etc/opendkim/keys/example.com/mail.private
Selector mail
# 签名设置
SignHeaders From,To,Subject,Date,Message-ID
Canonicalization relaxed/simple
Mode sv
SubDomains no
AutoRestart yes
AutoRestartRate 10/1h
EOF
7.2 生成 DKIM 密钥
# 创建密钥目录
sudo mkdir -p /etc/opendkim/keys/example.com
# 生成密钥对
sudo opendkim-genkey -D /etc/opendkim/keys/example.com/ -d example.com -s mail
# 设置权限
sudo chown -R opendkim:opendkim /etc/opendkim/keys
sudo chmod -R 700 /etc/opendkim/keys
# 查看公钥(用于 DNS TXT 记录)
sudo cat /etc/opendkim/keys/example.com/mail.txt
输出示例:
mail._domainkey IN TXT "v=DKIM1; h=sha256; k=rsa; p=MIGfMA0GCSqGSIb4DQEBAQUAA4GNADCBiQKBgQC..."
将这条记录添加到 DNS 中:
| 类型 | 主机名 | 值 |
|---|---|---|
| TXT | mail._domainkey |
上面的公钥字符串(去掉引号) |
7.3 配置 Postfix 与 OpenDKIM 集成
编辑 /etc/default/opendkim,确保 socket 配置正确:
SOCKET="inet:8891@localhost"
重启所有服务:
sudo systemctl restart opendkim
sudo systemctl restart postfix
sudo systemctl restart dovecot
八、配置 SPF 和 DMARC
8.1 SPF 记录
SPF(Sender Policy Framework)告诉其他邮件服务器哪些 IP 有权发送你的域名的邮件:
example.com. IN TXT "v=spf1 mx ~all"
mx:允许 MX 记录指向的服务器发送邮件~all:软拒绝(softfail),其他来源的邮件标记为可疑但不直接拒绝
如果你的邮件通过第三方服务发送(如 SendGrid、阿里云邮件),添加:
v=spf1 mx include:spf.sendgrid.net ~all
8.2 DMARC 记录
DMARC 告诉接收方如何处理 SPF/DKIM 验证失败的邮件:
_dmarc.example.com. IN TXT "v=DMARC1; p=quarantine; rua=mailto:admin@example.com"
p=quarantine:验证失败放入垃圾箱p=reject:直接拒绝(更严格)rua:接收聚合报告
九、防火墙与安全加固
# 开放邮件端口
sudo ufw allow 25/tcp # SMTP
sudo ufw allow 587/tcp # Submission
sudo ufw allow 143/tcp # IMAP
sudo ufw allow 993/tcp # IMAPS
sudo ufw allow 110/tcp # POP3
sudo ufw allow 995/tcp # POP3S
sudo ufw reload
# 防止 Postfix 被滥用为开放中继(测试)
sudo postfix check
echo "测试邮件" | mail -s "Postfix Test" admin@example.com
# 检查邮件队列
sudo mailq
十、客户端连接测试
10.1 命令行测试(本地)
# 发送测试邮件
echo "Hello from Ubuntu mail server!" | mail -s "Test Email" admin@example.com
# 查看邮件(本地)
sudo ls -la /home/admin/Maildir/new/
cat /home/admin/Maildir/new/xxxxxxxxx
10.2 远程客户端配置
使用 Thunderbird、Outlook 或手机邮件 App 配置:
| 设置 | 值 |
|---|---|
| 收件服务器 (IMAP) | mail.example.com,端口 993,SSL/TLS |
| 发件服务器 (SMTP) | mail.example.com,端口 587,STARTTLS |
| 用户名 | 系统用户名(如 admin) |
| 密码 | 系统用户密码 |
10.3 测试邮件送达率
# 安装 swaks(Swiss Army Knife for SMTP)
sudo apt install swaks -y
# 发送测试邮件
swaks --to test@gmail.com
--from admin@example.com
--server mail.example.com:587
--auth LOGIN
--auth-user admin
--auth-password "your-password"
--tls
--header "Subject: DKIM Test from Ubuntu"
--body "This is a test email with DKIM signature."
发送后,检查 Gmail 收件箱中的原始邮件头,确认 SPF、DKIM、DMARC 均显示 PASS。
十一、常见问题与排查
问题 1:邮件发送到 Gmail/QQ 被拒
原因:接收方服务器对 IP 声誉有要求。新服务器 IP 的邮件可能被拒。
解决:
– 确保 SPF/DKIM/DMARC 全部配置正确
– 检查 IP 是否被列入黑名单:https://mxtoolbox.com/blacklists.aspx
– 设置反向 PTR 记录(联系 VPS 提供商,将 IP 反解为 mail.example.com)
问题 2:Postfix 日志中看到 “connect to Milter service: Connection refused”
原因:OpenDKIM 未启动或 socket 配置不匹配。
解决:
sudo systemctl status opendkim
sudo journalctl -u opendkim -n 20
问题 3:Dovecot 无法启动
# 检查配置文件语法
sudo doveconf -n
# 查看日志
sudo tail -50 /var/log/dovecot.log
问题 4:邮件发送很慢或超时
原因:反向 DNS 查询超时或 DNS 解析慢。
解决:
# 在 main.cf 中禁用 DNS 黑名单查询(如果不需要)
# 注释掉或删除 smtpd_client_restrictions 中的 reject_rbl_client
总结
今天我们从零搭建了一套完整的邮件服务器,核心组件包括:
- Postfix:SMTP 邮件发送与中继
- Dovecot:IMAP/POP3 邮件接收
- OpenDKIM:邮件数字签名,提升送达率
- SPF/DMARC:发件人策略,防止伪造
这套配置可以运行在 Ubuntu 22.04/24.04 上,支持个人或小型团队的邮件服务需求。对于生产环境,还需要考虑:反垃圾邮件(SpamAssassin)、邮件队列监控、定时清理日志、以及 IP 信誉预热(新 IP 需要逐步增加发信量)。
📋 第 3 周回顾:Ubuntu 服务器实战
| 篇目 | 文章 | 链接 |
|---|---|---|
| 第 15 天 | SSH 远程管理与安全加固 | 阅读 |
| 第 16 天 | Web 服务器搭建 | 阅读 |
| 第 17 天 | 数据库服务器部署 | 阅读 |
| 第 18 天 | Docker 容器化管理 | 阅读 |
| 第 19 天 | 文件共享服务 | 阅读 |
| 第 20 天 | 监控与告警系统 | 阅读 |
| 第 21 天 | 邮件服务器基础 | 👈 本文 |
📋 完整系列目录
| 阶段 | 篇目 | 状态 |
|---|---|---|
| 第 1 周:基础入门 | 第 1-7 天 | ✅ 已发布 |
| 第 2 周:系统管理 | 第 8-14 天 | ✅ 已发布 |
| 第 3 周:服务器实战 | 第 15-21 天 | ✅ 第 21 天今日发布 |
| 第 4 周:进阶与生产 | 第 22-30 天 | 🔜 即将发布 |
🎯 下期预告
第 22 天:系统安全加固——AppArmor、SELinux、审计系统 auditd
进入第 4 周,我们将聚焦 Ubuntu 安全加固。第 22 天将深入 Ubuntu 的三大安全机制:AppArmor 强制访问控制、SELinux 安全增强模块、以及 auditd 系统审计框架。你将学会如何配置应用隔离策略、监控系统调用、以及审计关键文件访问。敬请期待!















暂无评论内容