Debian Postfix + Dovecot 基础配置:DNS、Maildir、IMAP 与邮件队列验证
1. 服务介绍
Postfix 负责 SMTP 邮件接收、发送、排队和本地投递;Dovecot 负责通过 IMAP/POP3 让客户端读取邮箱,并提供邮箱认证。两者组合适合内网实验、小型站点和邮件客户端联调。
本文聚焦基础邮件系统:先准备邮件主机 DNS 和 FQDN,再安装 Postfix/Dovecot,配置 Maildir 和本地用户,最后用服务状态、端口、邮件队列、日志和 IMAP/TLS 命令验证。生产环境还需要补充证书、反垃圾、SPF、DKIM、DMARC、备份和账号生命周期管理。
2. 准备运行环境
• 操作系统:Debian 10;其他 Debian 版本按软件包和 systemd 服务名调整。
• 权限:root 或具备 sudo 权限的管理员账号。
• 主机名:邮件服务器使用稳定 FQDN,例如 mail.example.test;客户端访问名称必须与 TLS 证书 SAN 一致。
• DNS:准备邮件主机 A/AAAA 记录和域名 MX 记录;正式环境还应准备反向解析。
• 软件包:postfix、dovecot-core、dovecot-imapd、dovecot-pop3d、mailutils、openssl、ca-certificates。
• 端口:25 用于服务器间 SMTP;465/587 用于客户端提交;993 用于 IMAPS。按用途开放,禁止开放匿名中继。
• 邮箱目录:本文使用本地系统用户和 Maildir;生产环境可改用虚拟邮箱和数据库后端。
• 凭据:用户密码只交互输入,不写入配置、日志、截图或文章。
3. 相关知识
3.1 Postfix 与 Dovecot 分工
Postfix 是 MTA,负责 SMTP 和邮件队列;Dovecot 是邮件访问服务,负责 IMAP/POP3 和认证。发信成功不代表收信配置正确,必须分别检查 SMTP 投递、Dovecot 登录和 Maildir 文件。
3.2 DNS 和邮件域
MX 记录指向邮件主机名,邮件主机名再解析到服务器 IP。myhostname、mydomain、MX 目标和证书 SAN 应保持一致。DNS 错误常表现为连接超时、退信或 TLS 名称不匹配。
3.3 Maildir 和本地投递
home_mailbox = Maildir/ 让 Postfix 将本地邮件写入用户家目录;Dovecot 使用 mail_location = maildir:~/Maildir 读取同一目录。两边路径不一致时,邮件可能已投递但客户端看不到。
3.4 认证和安全
客户端应使用 993 IMAPS 或 465/587 加密提交,账号认证通过 Dovecot SASL Socket 提供给 Postfix。reject_unauth_destination 用于防止开放中继。不要让客户端在明文 143/25 端口上传递密码。
3.5 日志与队列
Postfix 队列用 postqueue -p 或 mailq 查看;日志通常位于 /var/log/mail.log;Dovecot 可通过 journalctl -u dovecot 查看。排错顺序:DNS → 端口 → 服务状态 → TLS → 认证 → Maildir → 队列/日志。
4. 实验步骤
4.1 设置 DNS 和 FQDN
使用实际实验域名替换示例值。MX 目标必须是可解析主机名,不能直接写 IP。
text
mail.example.test. IN A 邮件服务器IP
example.test. IN MX 10 mail.example.test.
bash
sudo hostnamectl set-hostname mail.example.test
hostname --fqdn
getent hosts mail.example.test
dig example.test MX +short

4.2 安装 Postfix 和 Dovecot
安装邮件传输、邮件访问和测试工具。Postfix 安装向导选择 Internet Site,系统邮件名填写实际邮件域名。
bash
sudo apt update
sudo apt install -y postfix dovecot-core dovecot-imapd dovecot-pop3d \
mailutils openssl ca-certificates
sudo systemctl enable --now postfix dovecot
sudo systemctl is-active postfix
sudo systemctl is-active dovecot

确认版本和监听状态:
bash
postconf mail_version
dovecot --version
sudo ss -lntp | grep -E ':25|:143|:993'
4.3 配置 Postfix
设置主机名、本地域、Maildir 和基本中继限制。已有业务配置时只修改对应项,不要覆盖整份 main.cf。
bash
sudo postconf -e 'myhostname = mail.example.test'
sudo postconf -e 'mydomain = example.test'
sudo postconf -e 'myorigin = $mydomain'
sudo postconf -e 'inet_interfaces = all'
sudo postconf -e 'inet_protocols = ipv4'
sudo postconf -e 'mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain'
sudo postconf -e 'home_mailbox = Maildir/'
sudo postconf -e 'smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination'
sudo postfix check

如果需要客户端安全提交,再配置证书和 465/587;不要只开放端口而不启用 TLS 和 SMTP AUTH。证书私钥权限只允许 root 读取。
bash
sudo postconf myhostname mydomain mydestination home_mailbox
sudo postconf smtpd_recipient_restrictions
sudo ls -l /etc/ssl/private /etc/ssl/certs
4.4 配置 Dovecot Maildir、IMAP 和 TLS
配置 Maildir 路径和 IMAP 协议:
bash
sudo sed -i 's|^#\?mail_location.*|mail_location = maildir:~/Maildir|' \
/etc/dovecot/conf.d/10-mail.conf
sudo sed -i 's|^#\?protocols.*|protocols = imap|' \
/etc/dovecot/dovecot.conf
sudo sed -i 's|^#\?disable_plaintext_auth.*|disable_plaintext_auth = yes|' \
/etc/dovecot/conf.d/10-auth.conf
sudo sed -i 's|^#\?auth_mechanisms.*|auth_mechanisms = plain login|' \
/etc/dovecot/conf.d/10-auth.conf

配置 Dovecot 证书。路径替换为实际证书;私有 CA 证书需要在客户端导入根证书。
bash
sudo sed -i 's|^#\?ssl[[:space:]]*=.*|ssl = required|' \
/etc/dovecot/conf.d/10-ssl.conf
sudo sed -i 's|^#\?ssl_cert[[:space:]]*=.*|ssl_cert = </etc/ssl/certs/mail.example.test.fullchain.pem|' \
/etc/dovecot/conf.d/10-ssl.conf
sudo sed -i 's|^#\?ssl_key[[:space:]]*=.*|ssl_key = </etc/ssl/private/mail.example.test.key.pem|' \
/etc/dovecot/conf.d/10-ssl.conf
sudo doveconf -n | grep -E '^(mail_location|protocols|ssl|auth_mechanisms)'

让 Postfix 通过 Dovecot Socket 认证:
text
service auth {
unix_listener /var/spool/postfix/private/auth {
mode = 0660
user = postfix
group = postfix
}
}

检查 Dovecot 配置和认证 Socket:
bash
sudo doveconf -n >/tmp/dovecot-effective.conf
sudo ls -l /var/spool/postfix/private/auth
sudo grep -A8 -B2 'private/auth' /tmp/dovecot-effective.conf
sudo systemctl restart dovecot postfix
4.5 创建用户和 Maildir
创建实验用户,密码交互输入。不要把真实密码放进文章或截图。
bash
sudo adduser mailuser1
sudo adduser mailuser2
sudo install -d -o mailuser1 -g mailuser1 -m 700 /home/mailuser1/Maildir
sudo install -d -o mailuser2 -g mailuser2 -m 700 /home/mailuser2/Maildir
sudo find /home/mailuser1/Maildir /home/mailuser2/Maildir \
-maxdepth 1 -type d -printf '%M %u:%g %p\n'

使用本地邮件命令测试投递,再用队列和 Maildir 查看结果:
bash
printf 'Subject: local test\n\nPostfix and Dovecot test.\n' \
| sudo -u mailuser1 sendmail mailuser2@example.test
sudo postqueue -p
sudo find /home/mailuser2/Maildir -type f | tail

5. 验证结果
5.1 服务状态和端口
bash
systemctl is-active postfix
systemctl is-active dovecot
ss -lntp | grep -E ':25|:143|:993'
sudo postfix check
sudo doveconf -n >/dev/null
预期结果:Postfix、Dovecot 均为 active;配置检查无错误;993 监听存在时,客户端才能使用 IMAPS。
5.2 IMAPS TLS 和认证
bash
openssl s_client -connect mail.example.test:993 \
-servername mail.example.test \
-CAfile /etc/ssl/certs/ca-certificates.crt \
-verify_return_error </dev/null 2>&1 \
| grep -E 'subject=|issuer=|Verify return code'
sudo doveadm auth test mailuser1@example.test
5.3 Maildir、队列和日志
bash
sudo find /home/mailuser1/Maildir /home/mailuser2/Maildir -type f | tail -n 20
sudo postqueue -p
sudo tail -n 100 /var/log/mail.log
sudo journalctl -u dovecot -n 100 --no-pager
预期结果:本地测试邮件进入目标用户 Maildir;队列无持续 deferred;日志没有持续认证、权限或 TLS 错误。
6. 常见问题
6.1 IMAP 连接失败
检查 DNS、993 监听、防火墙、证书路径和 ssl = required。客户端不能把 IMAPS 993 配成明文 IMAP。
6.2 登录失败
检查 Linux 用户是否存在、密码是否正确、Dovecot auth_mechanisms、Maildir 权限和日志。doveadm auth test 比反复点击客户端重试更快定位。
6.3 邮件已投递但客户端看不到
检查 Postfix home_mailbox 和 Dovecot mail_location 是否都使用 Maildir,确认用户家目录和 Maildir 属主正确。
6.4 外部中继被拒绝
确认客户端连接了正确 SMTP 提交端口,并配置 SMTP AUTH。不要删除 reject_unauth_destination;该限制用于防止开放中继。
6.5 日志和队列检查
bash
sudo postqueue -p
sudo grep -Ei 'reject|deferred|auth|tls|status=sent' /var/log/mail.log | tail -n 100
7. 实验结论
本实验完成 Postfix、Dovecot、DNS/FQDN、Maildir、IMAP、TLS、用户创建和本地投递验证。最终以服务状态、端口、TLS、Dovecot 认证、Maildir、队列和日志共同确认配置生效。生产环境还需补充 SMTPS/SMTP AUTH、证书生命周期、反垃圾、SPF/DKIM/DMARC、备份和最小权限策略。