今天我們使用tomav/docker-mailserver 所提供的Docker Image來快速的架設一個簡單的Mail Server。
基礎知識# 常見的郵局埠與通訊協議
發郵件的協議有SMTP,收郵件的協議有POP3和IMAP。
SMTP :明文使用25埠。加密後使用25/587/465埠。IMAP :明文使用143埠。加密後使用143/993埠。POP3:明文使用110埠。加密後使用110/995埠。 這次使用的Docker映像檔為:tvial/docker-mailserver
確保您有安裝Docker 、Docker-Compose 1.7 or higher
本服務所使用的連接埠:
Exposed ports# 25 receiving email from other mailservers 465 SSL Client email submission 587 TLS Client email submission 143 StartTLS IMAP client 993 TLS/SSL IMAP client 110 POP3 client 995 TLS/SSL POP3 client Note: Port 25 is only for receiving email from other mailservers and not for submitting email. You need to use port 465 or 587 for this.
Usage# 從Docker Hub pull 映像檔 1
$ docker pull tvial/docker-mailserver:latest
**Get tools, docker-compose.yml, the .env and the setup.sh files: ** 1
2
3
4
5
6
7
$ curl -o setup.sh https://raw.githubusercontent.com/tomav/docker-mailserver/master/setup.sh
$ chmod a+x ./setup.sh
$ curl -o docker-compose.yml https://raw.githubusercontent.com/tomav/docker-mailserver/master/docker-compose.yml.dist
$ curl -o .env https://raw.githubusercontent.com/tomav/docker-mailserver/master/.env.dist
在這裡我找到一個問題,docker-compose.yml 檔案中第20行引入了"env-mailserver",但在作者的README.md、參數說明文件中並未找到此檔案說明。
下載來的 docker-compose.yml:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
version: '2'
services:
mail:
image: tvial/docker-mailserver:latest
hostname: ${ HOSTNAME }
domainname: ${ DOMAINNAME }
container_name: ${ CONTAINER_NAME }
ports:
- "25:25"
- "143:143"
- "587:587"
- "993:993"
volumes:
- maildata:/var/mail
- mailstate:/var/mail-state
- maillogs:/var/log/mail
- ./config/:/tmp/docker-mailserver/
env_file:
- .env
- env-mailserver
cap_add:
- NET_ADMIN
- SYS_PTRACE
restart: always
volumes:
maildata:
driver: local
mailstate:
driver: local
maillogs:
driver: local
修改後的 docker-compose.yml:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
version: '2'
services:
mail:
image: tvial/docker-mailserver:latest
hostname: mail
domainname: mail.nemu.edu.tw
container_name: mail
ports:
- "25:25"
- "143:143"
- "587:587"
- "993:993"
volumes:
- /home/mail:/var/mail
- /home/mail-state:/var/mail-state
- /root/config/:/tmp/docker-mailserver/
- /etc/letsencrypt:/etc/letsencrypt
environment:
- ENABLE_SPAMASSASSIN = 0
- ENABLE_CLAMAV = 0
- ENABLE_FAIL2BAN = 1
- ONE_DIR = 1
- DMS_DEBUG = 0
- SSL_TYPE = letsencrypt
cap_add:
- NET_ADMIN
請注意修改後文件的6、7行,hostname+domainname=完整域名,另外,在本次修改的設定檔中,將兩個服務關閉了,分別是ENABLE_SPAMASSASSIN、ENABLE_CLAMAV,
Add mail server user account# 1
2
3
4
5
6
7
$ mkdir -p /root/config
$ touch /root/config/postfix-accounts.cf
$ docker run --rm \
-e MAIL_USER = [email protected] \
-e MAIL_PASS = 123456 \
-ti tvial/docker-mailserver:latest \
/bin/sh -c 'echo "$MAIL_USER|$(doveadm pw -s SHA512-CRYPT -u $MAIL_USER -p $MAIL_PASS)"' >> /root/config/postfix-accounts.cf
建立DKIM Key# 1
2
3
$ docker run --rm \
-v "/root/config" :/tmp/docker-mailserver \
-ti tvial/docker-mailserver:latest generate-dkim-config
執行完之後查看/root/config/opendkim/keys/mail.nemu.edu.tw /mail.txt的內容就是我們要設定的dns解析。我的內容是:
1
2
3
$ cat /root/config/opendkim/keys/mail.nemu.edu.tw/mail.txt
mail._domainkey IN TXT ( "v=DKIM1; k=rsa; "
"p=MIGfMA0GCSqGSIb3DPENNNNNNNNNNCBiQKBgQCy9JV3FnXjLjsRJs/N0fy1C233333IV7t3f7fWpv/lo4NsoPEtG693hTgApkhuLl9KeV233333DMTagtXN898lXenKFEIS4COi7X/RjbGuOoApg4qS23333333TfXsrjN3xVC78E9T/HrS6pJN5fX+1s+1s+1s+1s+1s+1sIDAQAB" ) ; ----- DKIM key mail for mail.nemu.edu.tw
因為是自己搭建的bind直接把這段複製到OS裡的hosts檔案內就行了,如下圖直接貼上儲存。
Ex. MacOS、Linux的檔案位置如下:
1
2
3
4
# MacOS:
/private/etc/hosts
# Linux(CentOS 7):
/etc/hosts
建立SSL# 1
2
$ cd ~/mail/docker-mailserver/
$ ./setup.sh config ssl
啟動Docker容器# 確認防火牆有開啟郵件伺服器所需的通訊埠號,在CentOS中使用firewalld作為預設防火牆。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
# 確認目前設定
$ firewall-cmd --list-all
# 加入自行指定的連接埠
$ firewall-cmd --add-port= 25/tcp --permanent
$ firewall-cmd --add-port= 143/tcp --permanent
$ firewall-cmd --add-port= 465/tcp --permanent
$ firewall-cmd --add-port= 587/tcp --permanent
$ firewall-cmd --add-port= 993/tcp --permanent
# 重新載入設定
$ firewall-cmd --reload
### 關閉防火牆服務(optional)
$ systemctl stop firewall
$ systemctl disable firewall
啟動Docker容器
1
2
# 背景執行
$ docker-compose up -d mail
or
1
2
# view process
$ docker-compose up mail
測試SSL設定是否成功 # 1
$ docker exec mail openssl s_client -connect 0.0.0.0:587 -starttls smtp -CApath /etc/letsencrypt/
和
1
$ docker exec mail openssl s_client -connect 0.0.0.0:993 -starttls imap -CApath /etc/letsencrypt/
若能看到以下結果,代表成功了。
Verify return code: 0 (ok)
Client端連線設定 # 收信:
Server domain name:mail.nemu.edu.tw Protocol:IMAP Port:993 Use SSL:是 發信:
Server domain name:mail.nemu.edu.tw Protocol:SMTP Port:587 Use SSL:是 測試結果 #