Debian Postfix + Dovecot 基础配置:DNS、Maildir、IMAP 与邮件队列验证

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 记录;正式环境还应准备反向解析。

• 软件包:postfixdovecot-coredovecot-imapddovecot-pop3dmailutilsopensslca-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。myhostnamemydomain、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 -pmailq 查看;日志通常位于 /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、备份和最小权限策略。

相关推荐
陳10301 小时前
Linux:网络基础
网络
weixin_446260851 小时前
PromptMatic:通过多阶段提示优化提升大模型的指令遵循能力
运维·服务器
吴声子夜歌1 小时前
Shell脚本——数组
linux·运维·shell
HY小宝F1 小时前
腾讯云 × 树莓派摄像头四周实战学习路线 第 2 周 · 第 14 天 · RTSP 实验 — 学习小结
网络
天行健,君子而铎1 小时前
数据分类分级的范式转换:从规则匹配到模型持续优化规模化前瞻算法
大数据·网络·数据库·安全·分类
Web极客码1 小时前
GPT-6 Astra 上手体验:如何让编码代理真正提速
服务器·gpt·ai·大模型·astra
yuewell_ai1 小时前
具身机器人一多服务器就崩-告别轮询上事件驱动
运维·服务器·机器人
whysoft1 小时前
创意新用法-把老磁带转录成mp3-第2部分
linux·计算机外设
道尔柯南1 小时前
【Linux】进程信号----1
linux·运维·服务器