在 Ubuntu 上使用 Docker 部署带 DKIM 的仅发送 Postfix
本指南介绍如何在 Ubuntu 22.04(1 GB 内存,1 vCPU)上部署 boky/postfix Docker 容器,启用 OpenDKIM 和 TLS。该服务器仅通过认证会话或来自本地主机的 587 端口发送邮件。支持自动 DKIM 密钥生成,并挂载 Let's Encrypt 证书。前提条件:一个在 Cloudflare 管理的域名,以及主机提供商允许出站 25 端口的 VPS。
服务器准备
更新软件包:
apt update && apt upgrade -y
移除旧 Docker 软件包:
for pkg in docker.io docker-doc docker-compose docker-compose-v2 podman-docker containerd runc; do sudo apt-get remove $pkg; done
安装官方 Docker:
apt update
apt install ca-certificates curl
install -m 0755 -d /etc/apt/keyrings
curl -fsSL https://download.docker.com/linux/ubuntu/gpg -o /etc/apt/keyrings/docker.asc
chmod a+r /etc/apt/keyrings/docker.asc
echo \
"deb [arch=$(dpkg --print-architecture) signed-by=/etc/apt/keyrings/docker.asc] https://download.docker.com/linux/ubuntu \
$(. /etc/os-release && echo "${UBUNTU_CODENAME:-$VERSION_CODENAME}") stable" | \
sudo tee /etc/apt/sources.list.d/docker.list > /dev/null
apt update && apt install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin
安装 Certbot:
apt install certbot
在 Cloudflare 添加 A 记录:mail → VPS IP,并禁用代理。颁发证书:
certbot certonly --standalone -d mail.yourdomain.com
创建续期钩子以重启容器:
nano /etc/letsencrypt/renewal-hooks/post/restart-postfix.sh
内容:
#!/bin/bash
docker restart postfix
使其可执行:chmod +x /etc/letsencrypt/renewal-hooks/post/restart-postfix.sh。
创建用户和 docker-compose
创建非特权用户:
useradd -m emailuser -G docker -s /bin/bash
passwd emailuser
su emailuser
创建 docker-compose.yml:
services:
postfix:
image: boky/postfix
container_name: postfix
restart: unless-stopped
ports:
- "587:587"
volumes:
- ./dkim:/etc/opendkim/keys
- /etc/letsencrypt/live/mail.yourdomain.com/fullchain.pem:/etc/opendkim/keys/mail.crt:ro
- /etc/letsencrypt/live/mail.yourdomain.com/privkey.pem:/etc/opendkim/keys/mail.key:ro
environment:
HOSTNAME: mail.yourdomain.com
DOMAIN: yourdomain.com
DKIM_SELECTOR: mail
DKIM_DOMAINS: yourdomain.com
DKIM_KEY_LENGTH: 2048
ENABLE_DKIM: 1
ENABLE_TLS: 1
TLS_KEY: /etc/opendkim/keys/mail.key
TLS_CERT: /etc/opendkim/keys/mail.crt
SMTP_USER: [email protected]|password
RELAY_NETWORKS: 127.0.0.1/32
FORCE_HELO: 1
LOG_TO_STDOUT: 1
ALLOWED_SENDER_DOMAINS: mail.yourdomain.com
DKIM_AUTOGENERATE: "true"
运行:docker compose up -d。密钥生成后,移除 DKIM_AUTOGENERATE。
DNS 配置
在 ./dkim 目录中,找到包含公钥的 .txt 文件。提取类似这样的行:
v=DKIM1; h=sha256; k=rsa; s=email; p=MNOGO_SIMVOLOV
(将密钥部分连接起来,不带括号/引号)。在 Cloudflare 添加 TXT 记录:
- 名称:
mail._domainkey - 内容:密钥字符串
域的 SPF 记录:
- 名称:
yourdomain.com - 内容:
v=spf1 a mx ip4:YOUR_VPS_IP -all
rDNS 和 25 端口
联系您的主机提供商:
- 开放出站 25 端口。
- 为
mail.yourdomain.com设置 rDNS → VPS IP。
测试
在 mail-tester.com 或 appmaildev.com 上测试。进入容器:
docker exec -it postfix bash
echo -e "Subject: DKIM Test\n\nThis is a test message" | sendmail -f [email protected] [email protected]
预期结果:测试得分 10/10,邮件进入 Gmail 收件箱。
- DKIM:自动生成 2048 位密钥。
- SPF:通过 IP 限制发送。
- TLS:Let's Encrypt 带自动续期。
- 认证:SMTP_USER 用于中继。
关键点
- boky/postfix 容器开箱即用包含 Postfix + OpenDKIM。
- 为密钥和证书挂载卷时使用
:ro以增强安全性。 - RELAY_NETWORKS=127.0.0.1/32 阻止未经认证的外部发送。
- DKIM 生成后禁用 AUTOGENERATE。
- rDNS 对主要提供商的可投递性至关重要。
— Editorial Team
暂无评论。