使用 Docker Compose 部署邮件服务器
很多时候为了方便, 我们都直接使用第三方邮箱进行收发邮件。 但第三方邮箱有些要求定期修改密码,有些限制发邮箱的次数, 对于一些个人和企业来说, 有自己的域名和服务器为什么不自己搭建一个邮件服务器呢?因此, 笔者在这记录自己学习并且搭建邮箱服务器的步骤与过程。 本文主要使用 docker-mailserver 进行搭建, 其中一些资料和链接, 有需要详细了解的, 请查看参考文献。
博主博客
- https://blog.uso6.com
- https://blog.csdn.net/dxk539687357
注: 如果有需要查看 docker 和 docker compose 的安装, 可在笔者博客中搜索相关教程, 在这里就不进行赘述。
一、安装 docker-mailserver
1.1 创建目录文件
位置自己定, 我这里指定 ~/mailserver/ 目录。
mkdir ~/mailserver/
目录结构图是这样, 其中 compose.yaml 和 mailserver.env 文件需要准备好, docker-data 是运行容器后自动生成的, 不需要管。
mailserver ├─compose.yaml ├─mailserver.env └─docker-data
1.2 compose.yaml 配置文件
使用 wget 下载 compose.yaml 文件
wget -P ~/mailserver/ "https://raw.githubusercontent.com/docker-mailserver/docker-mailserver/master/compose.yaml"
把文件中的 hostname 修改为自己的域名, 比如我的是 mail.uso6.com
services: mailserver: image: ghcr.io/docker-mailserver/docker-mailserver:latest container_name: mailserver # Provide the FQDN of your mail server here (Your DNS MX record should point to this value) hostname: mail.uso6.com env_file: mailserver.env # More information about the mail-server ports: # https://docker-mailserver.github.io/docker-mailserver/latest/config/security/understanding-the-ports/ # To avoid conflicts with yaml base-60 float, DO NOT remove the quotation marks. ports: - "25:25" # SMTP (explicit TLS => STARTTLS, Authentication is DISABLED => use port 465/587 instead) - "143:143" # IMAP4 (explicit TLS => STARTTLS) - "465:465" # ESMTP (implicit TLS) - "587:587" # ESMTP (explicit TLS => STARTTLS) - "993:993" # IMAP4 (implicit TLS) volumes: - ./docker-data/dms/mail-data/:/var/mail/ - ./docker-data/dms/mail-state/:/var/mail-state/ - ./docker-data/dms/mail-logs/:/var/log/mail/ - ./docker-data/dms/config/:/tmp/docker-mailserver/ - /etc/localtime:/etc/localtime:ro environment: - ENABLE_RSPAMD=1 - ENABLE_CLAMAV=1 - ENABLE_FAIL2BAN=1 restart: always stop_grace_period: 1m # Uncomment if using `ENABLE_FAIL2BAN=1`: cap_add: - NET_ADMIN healthcheck: test: "ss --listening --tcp | grep -P 'LISTEN.+:smtp' || exit 1" timeout: 3s retries: 0
- ENABLE_CLAMAV 病毒扫描。默认关闭。会占用大量的服务器资源,默认关闭。0:关闭 1:开启
- ENABLE_FAIL2BAN 封锁尝试暴力破解的IP地址。默认关闭。0:关闭 1:开启 如果启用 Fail2Ban
1.3 mailserver.env 配置文件
使用 wget 下载 mailserver.env 文件
wget -P ~/mailserver/ "https://raw.githubusercontent.com/docker-mailserver/docker-mailserver/master/mailserver.env"
具体参数配置可以查看 这里。
1.4 运行
进入 ~/mailserver/ 目录, 然后启动容器。
# 启动容器 docker compose up -d # 关闭容器 docker compose down
二、对 docker-mailserver 进行管理
在启动容器时, 使用 docker ps 查看容器的 ID。
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES 318bbf389f9c ghcr.io/docker-mailserver/docker-mailserver:latest "/usr/bin/dumb-init …" 31 seconds ago Up 30 seconds (healthy) 0.0.0.0:25->25/tcp, :::25->25/tcp, 0.0.0.0:143->143/tcp, :::143->143/tcp, 0.0.0.0:465->465/tcp, :::465->465/tcp, 0.0.0.0:587->587/tcp, :::587->587/tcp, 110/tcp, 995/tcp, 0.0.0.0:993->993/tcp, :::993->993/tcp, 4190/tcp mailserver
可以使用下面命令查看帮助。
docker exec -it
setup help 比如我上面的 ID 是 318bbf389f9c
[nukix@nukixPC mailserver]# docker exec -it 318bbf389f9c setup help SETUP(1) NAME setup - 'docker-mailserver' Administration & Configuration CLI SYNOPSIS setup [ OPTIONS... ] COMMAND [ help | ARGUMENTS... ] COMMAND := { email | alias | quota | dovecot-master | config | relay | debug } SUBCOMMAND DESCRIPTION This is the main administration command that you use for all your interactions with 'docker-mailserver'. Initial setup, configuration, and much more is done with this CLI tool. Most subcommands can provide additional information and examples by appending 'help'. For example: 'setup email add help' [SUB]COMMANDS COMMAND email := setup email add
[ ] setup email update [ ] setup email del [ OPTIONS... ] [ ... ] setup email restrict [ ] setup email list COMMAND alias := setup alias add setup alias del setup alias list COMMAND quota := setup quota set [ ] setup quota del COMMAND dovecot-master := setup dovecot-master add [ ] setup dovecot-master update [ ] setup dovecot-master del [ OPTIONS... ] [ ... ] setup dovecot-master list COMMAND config := setup config dkim [ ARGUMENTS... ] COMMAND relay := setup relay add-auth [ ] setup relay add-domain [ ] setup relay exclude-domain COMMAND fail2ban := setup fail2ban setup fail2ban ban setup fail2ban unban setup fail2ban log setup fail2ban status COMMAND debug := setup debug fetchmail setup debug login setup debug show-mail-logs EXAMPLES setup email add test@example.com Add the email account test@example.com. You will be prompted to input a password afterwards since no password was supplied. setup config dkim keysize 2048 domain 'example.com,not-example.com' Creates keys of length 2048 for the domains in comma-seperated list. This is necessary when using LDAP as the required domains cannot be inferred. setup config dkim help This will provide you with a detailed explanation on how to use the config dkim command, showing what arguments can be passed and what they do. 可以看出添加账号使用命令
docker exec -it
setup email add user@example.com 那么, 我需要添加一个 test@uso6.com 密码为 12345678 的邮箱则使用
docker exec -it 318bbf389f9c setup email add test@uso6.com 12345678
查看邮箱列表
docker exec -it 318bbf389f9c setup email list
三、常用的邮箱协议和端口
3.1 发送邮件协议和端口
3.1.1 非加密端口
25端口(SMTP):25 端口为 SMTP(Simple Mail Transfer Protocol,简单邮件传输协议) 服务所开放的,是用于发送邮件。如今绝大多数邮件服务器都使用该协议。当你给别人发送邮件时,你的机器的某个动态端口(大于1024)就会与邮件服务器的 25 端口建立一个连接,你发送的邮件就会通过这个连接传送到邮件服务器上,保存起来。
3.1.2 加密端口
465端口(SMTP SSL):465 端口是为 SMTP SSL(SMTP-over-SSL) 协议服务开放的,这是 SMTP 协议基于 SSL 安全协议之上的一种变种协议,它继承了 SSL 安全协议的非对称加密的高度安全可靠性,可防止邮件泄露。SMTPS 和 SMTP 协议一样,也是用来发送邮件的,只是更安全些,防止邮件被黑客截取泄露,还可实现邮件发送者抗抵赖功能。防止发送者发送之后删除已发邮件,拒不承认发送过这样一份邮件。
587端口 是 STARTTLS 协议的 属于 TLS 通讯协议 只是他是在 STARTTLS 命令执行后才对之后的原文进行保护的。
3.2 接收邮件协议和端口
3.2.1 非加密端口
143端口(IMAP):143 端口是为 IMAP(INTERNET MESSAGE ACCESS PROTOCOL) 服务开放的,是用于接收邮件的。
110端口(POP3):110 端口是为 POP3(Post Office Protocol Version 3,邮局协议3) 服务开放的,是用于接收邮件的。
3.2.2 加密端口
993端口(IMAP SSL):993 端口是为 IMAP SSL(IMAP-over-SSL) 协议服务开放的,这是 IMAP 协议基于 SSL 安全协议之上的一种变种协议,它继承了 SSL 安全协议的非对称加密的高度安全可靠性,可防止邮件泄露。 IMAPS 和 IMAP 协议一样,也是用来接收邮件的,只是更安全些,防止邮件被黑客截取泄露,还可实现邮件接收方抗抵赖功能。防止收件者收件之后删除已收邮件,拒不承认收到过这样一封邮件。
995端口(POP3 SSL):995 端口是为 POP3 SSSL(POP3-over-SSL) 协议服务开放的,这是 POP3 协议基于 SSL 安全协议之上的一种变种协议,它继承了 SSL 安全协议的非对称加密的高度安全可靠性,可防止邮件泄露。 POP3S 和 POP3 协议一样,也是用来接收邮件的,只是更安全些,防止邮件被黑客截取泄露,还可实现邮件接收方抗抵赖功能。防止收件者收件之后删除已收邮件,拒不承认收到过这样一封邮件。
3.3 IMAP 与 POP3 的区别
POP3 协议允许电子邮件客户端下载服务器上的邮件, 但是在客户端的操作(如移动邮件、标记已读等), 不会反馈到服务器上。
IMAP 协议提供 webmail 与电子邮件客户端之间的双向通信, 客户端的操作都会反馈到服务器上, 对邮件进行的操作, 服务器上的邮件也会做相应的动作。
四、防火墙配置(这里针对 iptables)
建议放行 25、587、465、993 端口。
[nukix@nukixPC mailserver]# vim /etc/sysconfig/iptables -A INPUT -p tcp --dport 25 -j ACCEPT -A INPUT -p tcp --dport 587 -j ACCEPT -A INPUT -p tcp --dport 465 -j ACCEPT -A INPUT -p tcp --dport 993 -j ACCEPT
使用 systemctl restart iptables 重启 iptables 防火墙。
五、生成 DKIM 签名
使用下面命令进行生成签名
docker exec -it
setup config dkim 使用下面命令获取签名公钥, 记得路径中的域名替换成你自己的
[nukix@nukixPC mailserver]# cat ~/mailserver/docker-data/dms/config/opendkim/keys/uso6.com/mail.txt mail._domainkey IN TXT ( "v=DKIM1; h=sha256; k=rsa; " "p=MIIBIjANBgkqhkiG9w0BAQEFACAQ8AMIIBCgKCAQEAaH5KuPYPSF3Ppkt466BDMAFGOA4mgqn4oPjZ5BbFlYA9l5jU3bgzRj3l6/Q1n5a9lQs5fNZ7A/HtY0aMvs3nGE4oi+LTejt1jblMhV/OfJyRCunQBIGp0s8G9kIUBzyKJpDayk2+KJSJt/lxL9Iiy0DE5hIv62ZPP6AaTdHBAsJosLFeAzuLFHQ6USyQRojefqFQtgYqWQ2JiZQ3" "iqq3bD/BVlwKRp5gH6TEYEmx8EBJUuDxrJhkWRUk2VDl1fqhVBy8A9O7Ah+85nMrlOHIFsTaYo9o6+cDJ6t1i6G1gu+bZD0d3/3bqGLPBQV9LyEL1Rona5V7TJBGg099NQkTz1IwIDAQAB" ) ; ----- DKIM key mail for uso6.com
六、配置域名 DNS 解析
x.x.x.x 代表部署邮件服务器的 IP, DKIM 不会拼接的可以看我上面跟下面怎么拼接成即可。
Type Name IPv4 address A mail x.x.x.x MX @ mail.uso6.com TXT @ v=spf1 mx -all TXT mail._domainkey v=DKIM1; h=sha256; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFACAQ8AMIIBCgKCAQEAaH5KuPYPSF3Ppkt466BDMAFGOA4mgqn4oPjZ5BbFlYA9l5jU3bgzRj3l6/Q1n5a9lQs5fNZ7A/HtY0aMvs3nGE4oi+LTejt1jblMhV/OfJyRCunQBIGp0s8G9kIUBzyKJpDayk2+KJSJt/lxL9Iiy0DE5hIv62ZPP6AaTdHBAsJosLFeAzuLFHQ6USyQRojefqFQtgYqWQ2JiZQ3iqq3bD/BVlwKRp5gH6TEYEmx8EBJUuDxrJhkWRUk2VDl1fqhVBy8A9O7Ah+85nMrlOHIFsTaYo9o6+cDJ6t1i6G1gu+bZD0d3/3bqGLPBQV9LyEL1Rona5V7TJBGg099NQkTz1IwIDAQAB
其中 MX 记录需要指向 A 地址。
- v=spf1 表示这是 SPF 记录的版本号,目前只有一个版本
- mx 表示授权由域名对应的 MX 记录中列出的 IP 地址发送邮件
- SoftFail 和 HardFail 是两种策略,用于指定未经授权的发件人邮件如何处理
- ~all 宽容策略。如果发件人的 IP 地址不在 SPF 记录中指定的允许列表中,那么收件方的邮件服务器不会拒绝该邮件,而是将该邮件标记为“软失败”,并将其放入接收方的垃圾邮件文件夹或者标记为垃圾邮件。
- -all 严格策略。如果发件人的IP地址不在 SPF 记录中指定的允许列表中,那么收件方的邮件服务器会拒绝该邮件,并将其退回给发件人或者直接删除
更多的 SPF 语法规则可以看这里 http://www.open-spf.org/SPF_Record_Syntax/。
设置 PTR 记录(或者叫 rDNS),可以通过 IP 地址反向解析出邮箱域名。 不设置也没关系,但是会被某些服务器标记为垃圾邮件。
rDNS 主要在控制台进行配置, 比如我用的是 CloudCone 的 VPS, 如下图所示。
DNS添加DMARC记录(可选)
DMARC(Domain-based Message Authentication, Reporting, and Conformance)是一种邮件验证技术,它可以帮助域名所有者控制其域名下的邮件发送,防止电子邮件被伪造和滥用。DMARC 是 SPF 和 DKIM 的补充,可以对 SPF 和 DKIM 的验证结果进行汇总和分析,并指定如何处理未经验证或验证失败的邮件。
1.DMARC生成器
2.rua 和 ruf 的邮箱地址要正确,用于接收邮件头和邮件体等相信信息以及邮件被拒绝的原因,并进行必要的调整。
邮件相关DNS配置规范
关于DNS解析配置一些深入理解,尤其针对邮件服务器的配置,上述提到的spf, dkim, dmarc等, 有兴趣可以查看:
- dns mx: https://www.cloudflare.com/learning/dns/dns-records/dns-mx-record/
- dns txt: https://www.cloudflare.com/learning/dns/dns-records/dns-txt-record/
- dns dkim: https://www.cloudflare.com/learning/dns/dns-records/dns-dkim-record/
- dns dmarc: https://www.cloudflare.com/learning/dns/dns-records/dns-dmarc-record/
- dns spf: https://www.cloudflare.com/learning/dns/dns-records/dns-spf-record/
- dns: https://www.cloudflare.com/learning
七、SSL 证书配置
这里就放一段官方的配置, 跟 nginx 的 SSL 配置差不多, 看不懂的话可以先看看我另外一篇文章 通过阿里云域名服务让 nginx 配置 SSL
volumes: - /usr/syno/etc/certificate/_archive/
/:/tmp/dms/custom-certs/ environment: - SSL_TYPE=manual - SSL_CERT_PATH=/tmp/dms/custom-certs/fullchain.pem - SSL_KEY_PATH=/tmp/dms/custom-certs/privkey.pem 八、注意
阿里云 安全违规行为类型说明 里面规定要稍微注意一下。
未经阿里云授权报备,不得将云产品用作邮箱服务器或用于连接第三方邮箱服务器。 违规具体情形:未经阿里云授权报备,不得将云产品(包括但不限于ECS,弹性Web托管,云虚拟主机等)用作邮箱服务器或用于连接第三方邮箱服务器。
九、在线测试网站
1.MX Toolbox
2.DMARC Analyzer
3.mail-tester.com
4.multiRBL.valli.org
5.internet.nl
十、发送/接收邮件
docker-mailserver 没有提供图形化界面进行发送与接收邮件, 所以需要借助第三方邮箱。在这推荐使用 eM Client, 用这个邮件客户端的主要原因在于如果连接有问题,它会给出一些提示。
参考文献
- docker-mailserver GitHub 地址
- docker-mailserver 官网
- 目前为止最详细的教程:搭建自己的邮箱服务器|Docker-Mailserver详细教程|避坑指南
- docker-mailserver 搭建邮件服务器
还没有评论,来说两句吧...