Administrator
Published on 2024-12-03 / 29 Visits
0
0

快速部署docker mailserver邮件服务器

自建邮件服务器能提高隐私性和控制权。本文详细讲解如何从零开始使用 Docker Compose 部署一个功能完善的邮件服务器,涵盖 DNS 配置、SSL 证书生成、DKIM 设置及国内服务器 25 端口屏蔽的解决方案。

1. 环境准备

系统要求

操作系统:CentOS 7.9 或其他主流 Linux 发行版

Docker:20.10.24 或更高

Docker Compose:2.2.3 或更高

硬件配置:最低 2 核 CPU,1GB 内存

域名:一个有效的域名(如 example.com)

2. 安装 Docker 和 Docker Compose

安装 Docker

1. 更新系统包:

sudo yum update -y

2. 安装依赖项:

sudo yum install -y yum-utils device-mapper-persistent-data lvm2

3. 添加 Docker 仓库并安装:

sudo yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo

sudo yum install -y docker-ce docker-ce-cli containerd.io

4. 启动 Docker 并设置开机自启:

sudo systemctl start docker

sudo systemctl enable docker

5. 验证 Docker 安装:

docker --version

安装 Docker Compose

1. 下载并安装 Docker Compose:

sudo curl -L "https://github.com/docker/compose/releases/download/v2.2.3/docker-compose-$(uname -s)-$(uname -m)" -o /usr/local/bin/docker-compose

sudo chmod +x /usr/local/bin/docker-compose

2. 验证 Docker Compose 安装:

docker-compose --version

3. 配置 DNS 记录

DNS 记录说明

使用域名 example.com 和服务器 IP 地址 123.45.67.89,需要配置以下 DNS 记录:

1. A 记录

主机名:@

:123.45.67.89

2. MX 记录

主机名:@

:mail.example.com

优先级:10

3. SPF 记录

主机名:@

:v=spf1 ip4:123.45.67.89 -all

4. DKIM 记录

主机名:default._domainkey

:通过 DKIM 工具生成的公钥(详见后文)

5. DMARC 记录

主机名:_dmarc

:v=DMARC1; p=none; rua=mailto:admin@example.com

配置 DKIM(详细步骤)

1. 生成 DKIM 密钥

在 docker-mailserver 容器中执行以下命令生成 DKIM 密钥:

docker exec -it mailserver setup config dkim keysize 2048

生成的密钥文件会存储在 ./data/config/opendkim/keys/ 目录下。

2. 提取 DKIM 公钥

进入生成的密钥目录,找到 default.txt 文件并打开:

cat ./data/config/opendkim/keys/example.com/mail.txt

文件内容类似于:

mail._domainkey IN      TXT     ( "v=DKIM1; h=sha256; k=rsa; "
          "p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ojqOcyeDlOn6TcpXCsU92xul6d54wlx/UwPTuE0aywFc+ihyKGAm9D8nmroneN7gf82qTtDbJiHghzRlf6JdpR3kM4ipWKaNRSlUL/64HQqrMeEWx5ErpcgwrXxKWI/rcQ7Rjg2BliP6ayJiEflH0FOtxfgLHnYEcSKupmCV8znM4rZ/LHx9RDwc7o8jWujey6h9zrYPXyqim"
          "obGSB0PZGNQhe7mWRefMraFGgnNq+PrtEnmaOFxH2rG1Qh2hhMkeqJsH56yx9f1mxWYTX7r9FtvweGRb+GJNfi6a4vpDrTCffxx6XvGrq032i7VqHpmiaUUuM3j2x1DwHrIbpWTQIDAQAB" )  ; ----- DKIM key mail for example.com

提取 p= 后的字符串(即公钥部分),用于添加到 DNS。

3. 添加 DKIM 到 DNS

在域名注册商的管理后台中,添加如下 TXT 记录:

主机名:mail._domainkey (按实际情况录入)

记录值

v=DKIM1; h=sha256; k=rsa; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0ojqOcyeDlOn6TcpXCsU92xul6d54wlx/UwPTuE0aywFc+ihyKGAm9D8nmroneN7gf82qTtDbJiHghzRlf6JdpR3kM4ipWKaNRSlUL/64HQqrMeEWx5ErpcgwrXxKWI/rcQ7Rjg2BliP6ayJiEflH0FOtxfgLHnYEcSKupmCV8znM4rZ/LHx9RDwc7o8jWujey6h9zrYPXyqimobGSB0PZGNQhe7mWRefMraFGgnNq+PrtEnmaOFxH2rG1Qh2hhMkeqJsH56yx9f1mxWYTX7r9FtvweGRb+GJNfi6a4vpDrTCffxx6XvGrq032i7VqHpmiaUUuM3j2x1DwHrIbpWTQIDAQAB

请仔细观察文件内容中"需要去除合并

4. 验证 DKIM 配置

使用在线工具(如 MXToolbox DKIM)验证 DKIM 是否生效。

4. 生成 SSL 证书

使用 Certbot 进行 DNS 验证

如果服务器无法开放 80 和 443 端口,推荐使用 DNS 验证生成证书。

1. 安装 Certbot:

sudo yum install -y certbot

2. 使用 DNS 验证生成证书:

certbot certonly --manual --preferred-challenges dns -d mail.example.com

3. 按提示添加 TXT 记录,例如:

记录名称:_acme-challenge.mail

记录值:Certbot 提供的随机字符串

4. 验证通过后,Certbot 会生成以下证书文件:

• /etc/letsencrypt/live/mail.example.com/fullchain.pem

• /etc/letsencrypt/live/mail.example.com/privkey.pem

5. 配置 Docker Compose 文件

创建 docker-compose.yml 文件,内容如下:

version: '3.8'

services:

  mailserver:

    image: mailserver/docker-mailserver:latest

    container_name: mailserver

    hostname: mail

    domainname: example.com

    env_file: mailserver.env

    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:

      - ./data/maildata:/var/mail

      - ./data/mailstate:/var/mail-state

      - ./data/config:/tmp/docker-mailserver

      - /etc/letsencrypt/live/mail.example.com/fullchain.pem:/etc/ssl/certs/ssl-cert-snakeoil.pem:ro

      - /etc/letsencrypt/live/mail.example.com/privkey.pem:/etc/ssl/private/ssl-cert-snakeoil.key:ro

    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

6. 配置环境变量文件

创建 .env-mailserver 文件,用于配置邮件服务器:

SSL_TYPE=manual

SSL_CERT_PATH=/etc/ssl/certs/ssl-cert-snakeoil.pem

SSL_KEY_PATH=/etc/ssl/private/ssl-cert-snakeoil.key


# 若你使用的服务器供应商禁用 25 端口 可配置以下操作
# 中继服务器配置

RELAY_HOST=smtp.qq.com

RELAY_PORT=465

RELAY_USER=your-email@qq.com

RELAY_PASSWORD=your-auth-code



# 启用额外功能

ENABLE_SPAMASSASSIN=1

ENABLE_CLAMAV=1

ENABLE_FAIL2BAN=1

7. 启动邮件服务器

1. 启动容器:

docker-compose up -d

2. 添加用户:

docker exec -it mailserver setup email add user@example.com

3. 测试邮件发送:

echo "Test Email" | mail -s "Hello" user@example.com

8. 自动更新证书

为了确保证书长期有效,可配置自动更新:

certbot renew --deploy-hook "docker restart mailserver"

将上述命令添加到 crontab 中,每月自动运行。

9. 总结

通过本教程,你可以成功部署一个功能完善、安全可靠的邮件服务器,并解决国内 25 端口屏蔽问题。本教程详细介绍了 DKIM 配置、DNS 设置、SSL 证书生成等关键步骤,适合初学者和有经验的开发者使用。


Comment