Ubuntu 系统系列 | 第 21 天:邮件服务器基础——Postfix + Dovecot 配置入门

第 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 系统审计框架。你将学会如何配置应用隔离策略、监控系统调用、以及审计关键文件访问。敬请期待!

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享
评论 抢沙发
头像
欢迎您留下宝贵的见解!
提交
头像

昵称

取消
昵称表情代码图片快捷回复

    暂无评论内容