Linux · 2022年4月1日

利用Docker-Compose搭建私人邮件服务器

邮件服务器简介

1.常见邮局端口&&协议:

发邮件的协议有SMTP,收邮件的协议有POP3和IMAP。

  • SMTP:明文使用25端口。加密后使用25/587/465端口。
  • IMAP:明文使用143端口。加密后使用143/993端口。
  • POP3:明文使用110端口。加密后使用110/995端口。
  • sendmail:用于发邮件。资格最老的邮局,所有Linux发行版基本都带。但是配置麻烦。
  • postfixWietse Venema觉得sendmail配置太麻烦了,就开发了一个“简化配置版sendmail”,即postfix。支持smtp协议。
  • dovecot:用于收邮件,支持imap/pop3。
  • spamassasin:垃圾邮件过滤器。可以自订规则。
  • clamav:邮件杀毒工具。
  • opendkim:生成dkim签名。有什么用?详见下面的“反垃圾邮件技术”。
  • fail2ban:防止别人暴力破解用户名密码的工具。

2.常见邮局软件和安全软件:

3.反垃圾邮件技术:

假设我要在1.1.1.2这台机器上配置best.pm、best.nl这两个域名用于发邮件。1.1.1.2的主机名是mail1.wangchenyu.net.cn。那么我们需要

  1. 设置rDNS,将1.1.1.2映射到mail1.wangchenyu.net.cn。DNS是域名->IP的解析。rDNS即IP->域名的解析。有了这个rDNS记录,收到邮件的服务器就能确认mail1.wangchenyu.net.cn可以被用在1.1.1.2这个IP上。一般在主机商后台可以添加rdns记录,找不到的话提交一个工单即可。
  2. 设置best.pm和best.nl的MX记录,记录名为@,值为mail1.wangchenyu.net.cn,优先级为10。MX记录用于别人向best.pm这个域发送邮件时查找收信服务器。不设置的话无法收到别人发的邮件,并且自己发出的邮件的“可信度”也会大大降低。优先级
  3. 设置DKIM签名。DKIM先由发件服务器生成,之后每封邮件都会带上这个签名。接着,还要在best.pm和best.nl上各添加一条TXT记录,记录名和值在发件服务器生成DKIM时都会提供。收到邮件后会对比邮件中的DKIM签名和DNS中的TXT记录是否一致。
  4. 设置SPF记录。这个记录规定了可以用这个域发邮件的主机。在best.pm和best.nl上各添加一条TXT记录,记录名为@,值为v=spf1 mx ~all即可允许所有IP使用此域。
  5. 设置DMARC记录。这个记录指出他们的地址被 SPF 和/或 DKIM/或别的方法保护。在best.pm和best.nl上各添加一条TXT记录,记录名为_dmarc,值为v=DMARC1; p=none

准备工作

1.安装环境

由于docker-mailserver.yml文件使用3.8版本,因此需要更高版本的docker-compose才可以,需要docker-compose版本为1.29.2

2.https证书

可以到freessl.cn申请免费证书。

3.创建相应的文件夹

mkdir -p /opt/mailserver
mkdir -p /opt/mailserver/ssl

4.把https证书放到 /opt/mailserver/ssl文件夹下

5.有关域名的解析(以阿里云设置DNS解析记录)

这里 设置的 DNS 未包含 DKIM 签名记录。这个记录需要在后面,使用脚本进行生成。

DNS类型记录名记录值TTL
Amail000.000.000.00010分钟
MX@mail.yuzhongit.com10分钟
TXT@v=spf1 mx ~all10分钟
TXT_dmarcv=DMARC1; p=quarantine; rua=mailto:dmarc.report@yuzhongit.com; ruf=mailto:dmarc.report@yuzhongit.com; fo=0; adkim=r; aspf=r; pct=100; rf=afrf; ri=86400; sp=quarantine10分钟
表中yuzhongit.com注意替换成自己的域名

部署docker-mailserver容器镜像工作

1.镜像及相关配置文件的拉取

DMS_GITHUB_URL='https://raw.githubusercontent.com/docker-mailserver/docker-mailserver/master'
wget "${DMS_GITHUB_URL}/docker-compose.yml"
wget "${DMS_GITHUB_URL}/mailserver.env"
wget "${DMS_GITHUB_URL}/setup.sh"
chmod a+x ./setup.sh

2.修改docker-compose.yml文件

version: '3.8'

services:
  mailserver:
    image: docker.io/mailserver/docker-mailserver:latest
    container_name: mailserver
    # If the FQDN for your mail-server is only two labels (eg: example.com),
    # you can assign this entirely to `hostname` and remove `domainname`.
    hostname: mail
    domainname: yuzhongit.com
    env_file: mailserver.env
    dns: 223.5.5.5
    # More information about the mail-server ports:
    # https://docker-mailserver.github.io/docker-mailserver/edge/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)
      - "110:110"
      - "143:143"  # IMAP4 (explicit TLS => STARTTLS)
      - "465:465"  # ESMTP (implicit TLS)
      - "587:587"  # ESMTP (explicit TLS => STARTTLS)
      - "993:993"  # IMAP4 (implicit TLS)
    volumes:
      - /opt/mailserver/mail-data/:/var/mail/
      - /opt/mailserver/mail-state/:/var/mail-state/
      - /opt/mailserver/mail-logs/:/var/log/mail/
      - /opt/mailserver/config/:/tmp/docker-mailserver/
      - /etc/localtime:/etc/localtime:ro
      - /opt/mailserver/ssl:/tmp/ssl:ro
    restart: always
    stop_grace_period: 1m
    cap_add:
      - NET_ADMIN
      - SYS_PTRACE

3.设置mailserver.env配置

主要修改以下几个参数即可

DMS_DEBUG=1
SSL_TYPE=manual
SSL_CERT_PATH=/tmp/ssl/fullchain1.crt
SSL_KEY_PATH=/tmp/ssl/privkey1.key

4.添加邮件账户

mkdir -p /opt/mailserver/config
touch /opt/mailserver/config/postfix-accounts.cf
docker run --rm \
 -e MAIL_USER=user1@yuzhongit.com \
 -e MAIL_PASS=mypassword \
 -ti docker.io/mailserver/docker-mailserver:latest \
 /bin/sh -c 'echo "$MAIL_USER|$(doveadm pw -s SHA512-CRYPT -u $MAIL_USER -p $MAIL_PASS)"' >> /opt/mailserver/config/postfix-accounts.cf

5.启动容器 (要在/opt/mailserver/下)

docker-compose up -d `# 启动容器`

docker-compose logs -f `# 观察容器 相关日志`

6.添加 email user

在CentOS 7下运行./setup.sh可能会出错,删除setup.sh 第29行shopt -s inherit_errexit 即可。

./setup.sh email add admin@yuzhongit.com "xxx" `# 添加 邮件账号及密码`

./setup.sh email update admin@yuzhongit.com "xxx" `# 更新 邮件账号及密码`

7.创建DKIM key:

注意下面的配置中,设置了 keysize 参数。原因是默认使用的 keysize 大小为 4096 ,在 aliyun中 无法进行正常的添加。

./setup.sh config dkim keysize 2048
cat config/opendkim/keys/treesir.pub/mail.txt  `# 查看 DKIM 签名记录`
mail._domainkey IN      TXT     ( "v=DKIM1; h=sha256; k=rsa; "
          "p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ojqOcyeDlOn6TcpXCsU92xul6d54wlx/UwPTuE0aywFc+ihyKGAm9D8nmroneN7gf82qTtDbJiHghzRlf6JdpR3kM4ipWKaNRSlUL/64HQqrMeEWx5ErpcgwrXxKWI/rcQ7Rjg2BliP6ayJiEflH0FOtxfgLHnYEcSKupmCV8znM4rZ/LHx9RDwc7o8jWujey6h9zrYPXyqim"
          "obGSB0PZGNQhe7mWRefMraFGgnNq+PrtEnmaOFxH2rG1Qh2hhMkeqJsH56yx9f1mxWYTX7r9FtvweGRb+GJNfi6a4vpDrTCffxx6XvGrq032i7VqHpmiaUUuM3j2x1DwHrIbpWTQIDAQAB" )  ; ----- DKIM key mail for treesir.pub
将括弧内的双引号""去掉,合并成一条。
v=DKIM1; h=sha256; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ojqOcyeDlOn6TcpXCsU92xul6d54wlx/UwPTuE0aywFc+ihyKGAm9D8nmroneN7gf82qTtDbJiHghzRlf6JdpR3kM4ipWKaNRSlUL/64HQqrMeEWx5ErpcgwrXxKWI/rcQ7Rjg2BliP6ayJiEflH0FOtxfgLHnYEcSKupmCV8znM4rZ/LHx9RDwc7o8jWujey6h9zrYPXyqimobGSB0PZGNQhe7mWRefMraFGgnNq+PrtEnmaOFxH2rG1Qh2hhMkeqJsH56yx9f1mxWYTX7r9FtvweGRb+GJNfi6a4vpDrTCffxx6XvGrq032i7VqHpmiaUUuM3j2x1DwHrIbpWTQIDAQAB

添加 DKIM 记录值至 阿里云DNS

添加一条TXT记录,记录名是mail._domainkey,记录值是将两段引号内的字符串拼接起来即可

验证测试

证书验证测试

在进行邮件测试前,可以使用 此链接 中的工具,测试 是否支持 tls 验证。

tls测试1
tls测试2

邮件客户端配置

服务器配置好了,如何连接?

在任一个邮件客户端中这么配置:

收信:

  • 服务器地址:mail1.yuzhongit.com
  • 协议:IMAP
  • 端口:993
  • 用户名:user1@yuzhongit.com
  • 密码:mypassword
  • 使用SSL:是

发信:

  • 服务器地址:mail1.yuzhongit.com
  • 协议:SMTP
  • 端口:587
  • 用户名密码同上
  • 使用SSL:是