做全球視頻網(wǎng)站賺錢嗎英文網(wǎng)站推廣
使用 Docker Compose 部署郵件服務器
很多時候為了方便, 我們都直接使用第三方郵箱進行收發(fā)郵件。 但第三方郵箱有些要求定期修改密碼,有些限制發(fā)郵箱的次數(shù), 對于一些個人和企業(yè)來說, 有自己的域名和服務器為什么不自己搭建一個郵件服務器呢?因此, 筆者在這記錄自己學習并且搭建郵箱服務器的步驟與過程。 本文主要使用
docker-mailserver
進行搭建, 其中一些資料和鏈接, 有需要詳細了解的, 請查看參考文獻
。
博主博客
- https://blog.uso6.com
- https://blog.csdn.net/dxk539687357
注: 如果有需要查看
docker
和docker compose
的安裝, 可在筆者博客中搜索相關教程, 在這里就不進行贅述。
一、安裝 docker-mailserver
1.1 創(chuàng)建目錄文件
位置自己定, 我這里指定 ~/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:latestcontainer_name: mailserver# Provide the FQDN of your mail server here (Your DNS MX record should point to this value)hostname: mail.uso6.comenv_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:roenvironment:- ENABLE_RSPAMD=1- ENABLE_CLAMAV=1- ENABLE_FAIL2BAN=1restart: alwaysstop_grace_period: 1m# Uncomment if using `ENABLE_FAIL2BAN=1`:cap_add:- NET_ADMINhealthcheck:test: "ss --listening --tcp | grep -P 'LISTEN.+:smtp' || exit 1"timeout: 3sretries: 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"
具體參數(shù)配置可以查看 這里。
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 <CONTAINER NAME> setup help
比如我上面的 ID
是 318bbf389f9c
[nukix@nukixPC mailserver]# docker exec -it 318bbf389f9c setup help
SETUP(1)NAMEsetup - 'docker-mailserver' Administration & Configuration CLISYNOPSISsetup [ OPTIONS... ] COMMAND [ help | ARGUMENTS... ]COMMAND := { email | alias | quota | dovecot-master | config | relay | debug } SUBCOMMANDDESCRIPTIONThis 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]COMMANDSCOMMAND email :=setup email add <EMAIL ADDRESS> [<PASSWORD>]setup email update <EMAIL ADDRESS> [<PASSWORD>]setup email del [ OPTIONS... ] <EMAIL ADDRESS> [ <EMAIL ADDRESS>... ]setup email restrict <add|del|list> <send|receive> [<EMAIL ADDRESS>]setup email listCOMMAND alias :=setup alias add <EMAIL ADDRESS> <RECIPIENT>setup alias del <EMAIL ADDRESS> <RECIPIENT>setup alias listCOMMAND quota :=setup quota set <EMAIL ADDRESS> [<QUOTA>]setup quota del <EMAIL ADDRESS>COMMAND dovecot-master :=setup dovecot-master add <USERNAME> [<PASSWORD>]setup dovecot-master update <USERNAME> [<PASSWORD>]setup dovecot-master del [ OPTIONS... ] <USERNAME> [ <USERNAME>... ]setup dovecot-master listCOMMAND config :=setup config dkim [ ARGUMENTS... ]COMMAND relay :=setup relay add-auth <DOMAIN> <USERNAME> [<PASSWORD>]setup relay add-domain <DOMAIN> <HOST> [<PORT>]setup relay exclude-domain <DOMAIN>COMMAND fail2ban :=setup fail2ban setup fail2ban ban <IP>setup fail2ban unban <IP>setup fail2ban logsetup fail2ban statusCOMMAND debug :=setup debug fetchmailsetup debug login <COMMANDS>setup debug show-mail-logsEXAMPLESsetup email add test@example.comAdd the email account test@example.com. You will be promptedto 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 helpThis 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 <CONTAINER NAME> 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
三、常用的郵箱協(xié)議和端口
3.1 發(fā)送郵件協(xié)議和端口
3.1.1 非加密端口
25端口(SMTP)
:25 端口為 SMTP(Simple Mail Transfer Protocol,簡單郵件傳輸協(xié)議)
服務所開放的,是用于發(fā)送郵件。如今絕大多數(shù)郵件服務器都使用該協(xié)議。當你給別人發(fā)送郵件時,你的機器的某個動態(tài)端口(大于1024)就會與郵件服務器的 25 端口建立一個連接,你發(fā)送的郵件就會通過這個連接傳送到郵件服務器上,保存起來。
3.1.2 加密端口
465端口(SMTP SSL)
:465 端口是為 SMTP SSL(SMTP-over-SSL)
協(xié)議服務開放的,這是 SMTP
協(xié)議基于 SSL
安全協(xié)議之上的一種變種協(xié)議,它繼承了 SSL
安全協(xié)議的非對稱加密的高度安全可靠性,可防止郵件泄露。SMTPS
和 SMTP
協(xié)議一樣,也是用來發(fā)送郵件的,只是更安全些,防止郵件被黑客截取泄露,還可實現(xiàn)郵件發(fā)送者抗抵賴功能。防止發(fā)送者發(fā)送之后刪除已發(fā)郵件,拒不承認發(fā)送過這樣一份郵件。
587端口
是 STARTTLS
協(xié)議的 屬于 TLS
通訊協(xié)議 只是他是在 STARTTLS
命令執(zhí)行后才對之后的原文進行保護的。
3.2 接收郵件協(xié)議和端口
3.2.1 非加密端口
143端口(IMAP)
:143 端口是為 IMAP(INTERNET MESSAGE ACCESS PROTOCOL)
服務開放的,是用于接收郵件的。
110端口(POP3)
:110 端口是為 POP3(Post Office Protocol Version 3,郵局協(xié)議3)
服務開放的,是用于接收郵件的。
3.2.2 加密端口
993端口(IMAP SSL)
:993 端口是為 IMAP SSL(IMAP-over-SSL)
協(xié)議服務開放的,這是 IMAP
協(xié)議基于 SSL
安全協(xié)議之上的一種變種協(xié)議,它繼承了 SSL
安全協(xié)議的非對稱加密的高度安全可靠性,可防止郵件泄露。 IMAPS
和 IMAP
協(xié)議一樣,也是用來接收郵件的,只是更安全些,防止郵件被黑客截取泄露,還可實現(xiàn)郵件接收方抗抵賴功能。防止收件者收件之后刪除已收郵件,拒不承認收到過這樣一封郵件。
995端口(POP3 SSL)
:995 端口是為 POP3 SSSL(POP3-over-SSL)
協(xié)議服務開放的,這是 POP3
協(xié)議基于 SSL
安全協(xié)議之上的一種變種協(xié)議,它繼承了 SSL
安全協(xié)議的非對稱加密的高度安全可靠性,可防止郵件泄露。 POP3S
和 POP3
協(xié)議一樣,也是用來接收郵件的,只是更安全些,防止郵件被黑客截取泄露,還可實現(xiàn)郵件接收方抗抵賴功能。防止收件者收件之后刪除已收郵件,拒不承認收到過這樣一封郵件。
3.3 IMAP 與 POP3 的區(qū)別
POP3
協(xié)議允許電子郵件客戶端下載服務器上的郵件, 但是在客戶端的操作(如移動郵件、標記已讀等), 不會反饋到服務器上。
IMAP
協(xié)議提供 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 <CONTAINER NAME> setup config dkim
使用下面命令獲取簽名公鑰, 記得路徑中的域名替換成你自己的
[nukix@nukixPC mailserver]# cat ~/mailserver/docker-data/dms/config/opendkim/keys/uso6.com/mail.txtmail._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 地址發(fā)送郵件- SoftFail 和 HardFail 是兩種策略,用于指定未經授權的發(fā)件人郵件如何處理
~all
寬容策略。如果發(fā)件人的 IP 地址不在 SPF 記錄中指定的允許列表中,那么收件方的郵件服務器不會拒絕該郵件,而是將該郵件標記為“軟失敗”,并將其放入接收方的垃圾郵件文件夾或者標記為垃圾郵件。-all
嚴格策略。如果發(fā)件人的IP地址不在 SPF 記錄中指定的允許列表中,那么收件方的郵件服務器會拒絕該郵件,并將其退回給發(fā)件人或者直接刪除
更多的 SPF 語法規(guī)則可以看這里 http://www.open-spf.org/SPF_Record_Syntax/。
設置 PTR
記錄(或者叫 rDNS
),可以通過 IP 地址反向解析出郵箱域名。 不設置也沒關系,但是會被某些服務器標記為垃圾郵件。
rDNS
主要在控制臺進行配置, 比如我用的是 CloudCone
的 VPS
, 如下圖所示。
DNS添加DMARC記錄(可選)
DMARC(Domain-based Message Authentication, Reporting, and Conformance)是一種郵件驗證技術,它可以幫助域名所有者控制其域名下的郵件發(fā)送,防止電子郵件被偽造和濫用。DMARC 是 SPF 和 DKIM 的補充,可以對 SPF 和 DKIM 的驗證結果進行匯總和分析,并指定如何處理未經驗證或驗證失敗的郵件。
1.DMARC生成器
2.rua
和ruf
的郵箱地址要正確,用于接收郵件頭和郵件體等相信信息以及郵件被拒絕的原因,并進行必要的調整。
郵件相關DNS配置規(guī)范
關于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/<your-folder>/:/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
八、注意
阿里云 安全違規(guī)行為類型說明 里面規(guī)定要稍微注意一下。
未經阿里云授權報備,不得將云產品用作郵箱服務器或用于連接第三方郵箱服務器。違規(guī)具體情形:未經阿里云授權報備,不得將云產品(包括但不限于ECS,彈性Web托管,云虛擬主機等)用作郵箱服務器或用于連接第三方郵箱服務器。
九、在線測試網(wǎng)站
1.MX Toolbox
2.DMARC Analyzer
3.mail-tester.com
4.multiRBL.valli.org
5.internet.nl
十、發(fā)送/接收郵件
docker-mailserver
沒有提供圖形化界面進行發(fā)送與接收郵件, 所以需要借助第三方郵箱。在這推薦使用 eM Client, 用這個郵件客戶端的主要原因在于如果連接有問題,它會給出一些提示。
參考文獻
- docker-mailserver GitHub 地址
- docker-mailserver 官網(wǎng)
- 目前為止最詳細的教程:搭建自己的郵箱服務器|Docker-Mailserver詳細教程|避坑指南
- docker-mailserver 搭建郵件服務器