9102年,再玩一次郵件系統: 安裝篇

原文發佈於個人站點: GitDiG.com, 原文鏈接: 9102年,再玩一次郵件系統: 安裝篇

本文主要原本打算作爲9102年,再玩一次郵件系統系列文章的中篇寫的,卻是最早完成的。本系列文章將包括以下三篇:

因爲是中篇先發,但是爲了幫助讀者快速對郵件系統有個全局概念,先提供一張原理圖:

以下篇幅記錄整個郵件系統完整的安裝過程,採用postfix + dovecot最簡化安裝方案,不使用數據庫。

1. 雲服務商選擇

目前國內的雲服務,ECS虛機默認均不提供25端口,即smtp服務無法正常使用。當然阿里雲、騰訊雲均提供申請入口,可以申請開放25端口。問題不在這,在於25端口的進包解封了,25端口的出包仍然是受限的。國外雲服務也有禁用25端口限制的,也有不限制的,權衡之後選擇Linode提供的虛機服務。而且Linode提供了非常詳細的郵件系統部署方案:

因爲需要集成自己的賬號系統,所以省去MySQL數據庫,進行最簡化配置。

2. 系統環境配置

選擇Linode 4G方案,操作系統選擇ubuntu 19.04

2.1 主機防火牆設置

開啓主機後,首先進行主機安全防火牆的設置。在ubuntu 19.04中,使用ufw工具進行防火牆設置,默認情況下,是關閉的。

$: ufw status
Status: inactive
# 查看當前監聽端口
$: netstat -ltpn

ufw可以在關閉狀態下設置相關安全策略,完成配置以後,再開啓防火牆。安全策略設置如下:

# 當前機器監聽SSH端口號: 1122
$: ufw allow 1122/tcp
# 默認進出
$: ufw default allow outgoing
$: ufw default deny incoming
# HTTP/HTTPS端口 設置證書
$: ufw allow http/tcp
$: ufw allow https/tcp
# 郵件端口
$: ufw allow smtp/tcp
$: ufw allow smtps/tcp
$: ufw allow imap/tcp
$: ufw allow imaps/tcp
$: ufw allow 995/tcp
$: ufw allow 587/tcp
# 啓用防火牆, 確認SSH端口打開
$: ufw enable 
# 查詢防火牆狀態
$: ufw status
Status: active

To                         Action      From
--                         ------      ----
1122/tcp                   ALLOW       Anywhere
80/tcp                     ALLOW       Anywhere
443/tcp                    ALLOW       Anywhere
25/tcp                     ALLOW       Anywhere
465/tcp                    ALLOW       Anywhere
143/tcp                    ALLOW       Anywhere
993/tcp                    ALLOW       Anywhere
995/tcp                    ALLOW       Anywhere
587/tcp                    ALLOW       Anywhere
1122/tcp (v6)              ALLOW       Anywhere (v6)
80/tcp (v6)                ALLOW       Anywhere (v6)
443/tcp (v6)               ALLOW       Anywhere (v6)
25/tcp (v6)                ALLOW       Anywhere (v6)
465/tcp (v6)               ALLOW       Anywhere (v6)
143/tcp (v6)               ALLOW       Anywhere (v6)
993/tcp (v6)               ALLOW       Anywhere (v6)
995/tcp (v6)               ALLOW       Anywhere (v6)
587/tcp (v6)               ALLOW       Anywhere (v6)

2.2 域名服務設置

因爲郵件服務對與DNS服務對深度依賴,建議將具體的域名通過設置ns記錄的方式,將域名記錄的管理代理到Linode上進行。完成域名代理管理後,首先設置主機域名, 樣例:mail.example.org.

在主機上驗證域名A記錄解析到這臺機器的IP上。

# 驗證A記錄解析
$: systemd-resolve mail.example.org

解析正確後,繼續設置相應的MX記錄:example.org MX 10 mail.example.org

# 驗證MX記錄解析
$: systemd-resolve -t mx example.org
example.org IN MX 10 mail.example.org

2.3 Host主機設置

首先,通過hostnamectl命令設置主機名。

$: hostnamectl set-hostname mail

再修改/etc/hosts文件, 內容如下:

127.0.0.1 localhost.localdomain localhost
xx.xx.xx.xx mail.example.org mail

其中xx.xx.xx.xx是主機的公網IP.

3. 證書安裝

證書的安裝通過Let’s Encrypt提供的自動化工具安裝,參考安裝指南:

這裏快速記錄一下過程:

# 安裝工具
$: apt install certbot python-certbot-nginx
# 自動化配置證書, 確認 http 端口在防火牆中打開
$: certbot --nginx

安裝過程中,設置域名: example.org, 選擇Y,自動化安裝。安裝完成後,證書存放於: /etc/letsencrypt/live/example.org/ 目錄。

4. 郵件系統

最簡化安裝方案Postfix + Dovecot,主要是利用:

  • postfix 服務主要提供 smtp 服務,將接收的郵件投遞到指定用戶賬號對應的maildir格式的目錄中;
  • dovecot 服務主要提供 imap 服務,通過讀取指定用戶賬號對應的maildir格式的目錄中的郵件,通過imap協議的方式與用戶客戶端進行交互;
  • 同時,用戶客戶端在收發階段的認證,均通過dovecot sasl提供的認證方式進行認證。

4.1 服務安裝

安裝必要的工具包:

$: apt-get install postfix dovecot-core dovecot-imapd dovecot-pop3d dovecot-lmtpd

具體安裝包的版本信息可以通過apt show [pkgname]進行查詢。在安裝 Postfix 過程中,按提示選擇郵件服務器類型: internet site, 同時設置主機FQDN域名: example.org即可。

安裝完成後,PostfixDovecot 相關服務就全啓動了。可以通過netstat -ltpn查看監聽端口信息。

4.2 maildir 準備

maildir 作爲 postfixdovecot 服務的存儲中介,提供郵件的存儲功能。最簡化配置不考慮多MTA所需要的分佈式存儲方案。在本機設置maildir存儲目錄與相關權限設置即可。

# 創建目錄
$: mkdir -p /var/mail/vhosts/example.org

# 權限設置
$: groupadd -g 5000 vmail
$: useradd -g vmail -u 5000 vmail -d /var/mail
$: chown -R vmail:vmail /var/mail

4.3 郵箱賬號

除了郵件存儲以外,另外一個關鍵數據的準備就是郵箱賬號了.無論是postfix還是dovecot都提供了靈活的訪問接口,方便不同的使用者集成自己的郵箱賬號體系。

4.3.1 postfix 數據準備

postfix 中如何集成外部數據,其提供了一二十種集成方式。具體支持的集成方式,可以通過如下命令查詢:

$: postconf -m
btree
cidr
environ
fail
hash
inline
internal
memcache
nis
pipemap
proxy
randmap
regexp
socketmap
static
tcp
texthash
unionmap
unix

這些集成方式,如何集成,則可以參考文檔: Postfix Lookup Table Overview

這裏我們使用最簡單的集成方式:hash,也即文件的方式進行賬號數據準備。需要準備虛擬郵箱賬號數據包括:

  • 虛擬域名列表
  • 虛擬郵箱賬號列表
  • 虛擬郵箱別名列表

現在分別準備最簡單的數據:

# 切換到 /etc/postfix 目錄
$: cd /etc/postfix

# 虛擬域名列表 格式: <domain><space><value>
$: cat <<EOF > /etc/postfix/virtual_domains
example.org OK
EOF

# 虛擬郵箱賬號列表 格式: <mailbox><space><maildir path> 
$: cat <<EOF > /etc/postfix/virtual_mailboxes
[email protected] example.org/admin/
[email protected] example.org/foo/
[email protected] example.org/bar/
EOF

# 虛擬郵箱別名列表 格式: <alias-mailbox><space><mailbox>
$: cat <<EOF > /etc/postfix/virtual_aliases
[email protected]  [email protected]
EOF

數據準備完了,現在對以上文件進行hash處理。處理命令如下:

$: cd /etc/postfix
$: postmap /etc/postfix/virtual_domains
$: postmap /etc/postfix/virtual_mailboxes
$: postmap /etc/postfix/virtual_aliases

完成後,目錄下增加了三個文件: virtual_domains.db,virtual_mailboxes.db,virtual_aliases.db.
再通過postmap命令進行查詢驗證,

$: cd /etc/postfix
$: postmap -q "[email protected]" virtual_mailboxes
example.org/foo/

驗證成功。其它類型的數據集成方式也可以通過該命令進行查詢, 專門寫了一個小項目tcp-lookup,可以作爲本地進行tcp方式集成數據的基礎服務進行擴展。

4.3.2 dovecot 數據準備

dovecot 中,數據集成可以參考官方文檔:PasswordDatabase.既然是最簡安裝,就使用最簡單的方式集成數據。在 dovecot 中需要集成的數據有:

  • 虛擬賬號密碼信息
  • 虛擬賬號存儲信息

同樣,採用文件的方式進行數據準備。先準備賬號密碼數據,採用Passwd-file的方式進行準備:

$: cd /etc/dovecot
$: cat <<EOF > /etc/dovecot/virtal-mailbox-passwd
[email protected]:{PLAIN}admin::::::
[email protected]:{PLAIN}123456::::::
[email protected]:{PLAIN}654321::::::
EOF

至於賬號存儲數據,在dovecot中可以直接進行static靜態配置。具體參見dovecot 配置章節。

4.4 postfix 配置

postfix主要提供郵件接收服務,同時將本地郵件投遞到用戶賬號下的maildir格式的目錄中。由於歷史原因,postfix最開始是爲本機系統賬號Unix Account開發的,後來纔開始支持虛擬賬號Virtual Account, 即在本機沒有對應的系統賬號。官方最簡化配置請參考: virtual_mailbox

這裏還是使用Linode提供的配置,對於郵件系統而言更加完整,增加了必要的反垃圾策略並且加上了dovecot sasl認證功能,僅僅就MySQL用戶賬戶相關的數據進行重新配置。以下記錄下配置過程:

# 備份默認配置
$: cp /etc/postfix/main.cf /etc/postfix/main.cf.orig

編輯/etc/postfix/main.cf內容如下:

# See /usr/share/postfix/main.cf.dist for a commented, more complete version

# Debian specific:  Specifying a file name will cause the first
# line of that file to be used as the name.  The Debian default
# is /etc/mailname.
#myorigin = /etc/mailname

smtpd_banner = $myhostname ESMTP $mail_name (Ubuntu)
biff = no

# appending .domain is the MUA's job.
append_dot_mydomain = no

# Uncomment the next line to generate "delayed mail" warnings
#delay_warning_time = 4h

readme_directory = no

# TLS parameters
smtpd_tls_cert_file=/etc/letsencrypt/live/example.org/fullchain.pem
smtpd_tls_key_file=/etc/letsencrypt/live/example.org/privkey.pem
smtpd_use_tls=yes
smtpd_tls_auth_only = yes
smtp_tls_security_level = may
smtpd_tls_security_level = may
smtpd_sasl_security_options = noanonymous, noplaintext
smtpd_sasl_tls_security_options = noanonymous

# Authentication
smtpd_sasl_type = dovecot
smtpd_sasl_path = private/auth
smtpd_sasl_auth_enable = yes

# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
# information on enabling SSL in the smtp client.

# Restrictions
smtpd_helo_restrictions =
        permit_mynetworks,
        permit_sasl_authenticated,
        reject_invalid_helo_hostname,
        reject_non_fqdn_helo_hostname
smtpd_recipient_restrictions =
        permit_mynetworks,
        permit_sasl_authenticated,
        reject_non_fqdn_recipient,
        reject_unknown_recipient_domain,
        reject_unlisted_recipient,
        reject_unauth_destination
smtpd_sender_restrictions =
        permit_mynetworks,
        permit_sasl_authenticated,
        reject_non_fqdn_sender,
        reject_unknown_sender_domain
smtpd_relay_restrictions =
        permit_mynetworks,
        permit_sasl_authenticated,
        defer_unauth_destination

# See /usr/share/doc/postfix/TLS_README.gz in the postfix-doc package for
# information on enabling SSL in the smtp client.

myhostname = example.org
alias_maps = hash:/etc/aliases
alias_database = hash:/etc/aliases
mydomain = example.com
myorigin = $mydomain
mydestination = localhost
relayhost =
mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128
mailbox_size_limit = 0
recipient_delimiter = +
inet_interfaces = all
inet_protocols = all


# 虛擬 域名/賬號/別名 數據集成配置
virtual_mailbox_domains = hash:/etc/postfix/virtual_domains
virtual_mailbox_maps = hash:/etc/postfix/virtual_mailboxes
virtual_alias_maps = hash:/etc/postfix/virtual_aliases

# 本地投遞 - 採用 dovecot 提供的本地投遞服務
# virtual_transport = lmtp:unix:private/dovecot-lmtp

# 本地投遞 - 採用自定義的投遞程序
# virtual_transport = maildrop

# 默認本地投遞 - 採用 postfix 提供的本地投遞服務, 需以下配置
virtual_mailbox_base = /var/mail/vhosts
virtual_minimum_uid = 100
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000

# Even more Restrictions and MTA params
disable_vrfy_command = yes
strict_rfc821_envelopes = yes
#smtpd_etrn_restrictions = reject
#smtpd_reject_unlisted_sender = yes
#smtpd_reject_unlisted_recipient = yes
smtpd_delay_reject = yes
smtpd_helo_required = yes
smtp_always_send_ehlo = yes
#smtpd_hard_error_limit = 1
smtpd_timeout = 30s
smtp_helo_timeout = 15s
smtp_rcpt_timeout = 15s
smtpd_recipient_limit = 40
minimal_backoff_time = 180s
maximal_backoff_time = 3h

# Reply Rejection Codes
invalid_hostname_reject_code = 550
non_fqdn_reject_code = 550
unknown_address_reject_code = 550
unknown_client_reject_code = 550
unknown_hostname_reject_code = 550
unverified_recipient_reject_code = 550
unverified_sender_reject_code = 550

開啓,smtpd服務的465587端口, 即smtpssubmission服務端口.修改/etc/postfix/master.cf配置如下:

# Postfix master process configuration file.  For details on the format
# of the file, see the master(5) manual page (command: "man 5 master" or
# on-line: http://www.postfix.org/master.5.html).
#
# Do not forget to execute "postfix reload" after editing this file.
#
# ==========================================================================
# service type  private unpriv  chroot  wakeup  maxproc command + args
#               (yes)   (yes)   (yes)    (never) (100)
# ==========================================================================
smtp      inet  n       -       n       -       -       smtpd
#smtp      inet  n       -       -       -       1       postscreen
#smtpd     pass  -       -       -       -       -       smtpd
#dnsblog   unix  -       -       -       -       0       dnsblog
#tlsproxy  unix  -       -       -       -       0       tlsproxy
submission inet n       -       y      -       -       smtpd
  -o syslog_name=postfix/submission
  -o smtpd_tls_security_level=encrypt
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_sasl_type=dovecot
  -o smtpd_sasl_path=private/auth
  -o smtpd_reject_unlisted_recipient=no
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING
smtps     inet  n       -       -       -       -       smtpd
  -o syslog_name=postfix/smtps
  -o smtpd_tls_wrappermode=yes
  -o smtpd_sasl_auth_enable=yes
  -o smtpd_sasl_type=dovecot
  -o smtpd_sasl_path=private/auth
  -o smtpd_client_restrictions=permit_sasl_authenticated,reject
  -o milter_macro_daemon_name=ORIGINATING
...省略...

配置完成後,重新啓動服務: systemctl restart postfix

4.5 dovecot 配置

dovecot服務配置的風格有點類似nginx,將不同類型的配置放到不同文件中,通過主配置文件進行引用。
就本次安裝而言,首先對相關配置進行備份,再依次配置。

# 備份待修改配置
$: sudo cp /etc/dovecot/dovecot.conf /etc/dovecot/dovecot.conf.orig
$: sudo cp /etc/dovecot/conf.d/10-mail.conf /etc/dovecot/conf.d/10-mail.conf.orig
$: sudo cp /etc/dovecot/conf.d/10-auth.conf /etc/dovecot/conf.d/10-auth.conf.orig
$: sudo cp /etc/dovecot/conf.d/15-mailboxes.conf /etc/dovecot/conf.d/15-mailboxes.conf.orig
$: sudo cp /etc/dovecot/conf.d/auth-passwdfile.conf.ext /etc/dovecot/conf.d/auth-passwdfile.conf.ext.orig
$: sudo cp /etc/dovecot/conf.d/10-master.conf /etc/dovecot/conf.d/10-master.conf.orig
$: sudo cp /etc/dovecot/conf.d/10-ssl.conf /etc/dovecot/conf.d/10-ssl.conf.orig

4.5.1 開啓服務

修改 /etc/dovecot/dovecot.conf 主配置文件,打開imap,pop3,lmtp協議服務。

...
# Enable installed protocols
!include_try /usr/share/dovecot/protocols.d/*.protocol
protocols = imap pop3 lmtp

...

4.5.2 郵件存儲

修改 /etc/dovecot/conf.d/10-mail.conf 配置郵件存儲。

...
mail_location = maildir:/var/mail/vhosts/%d/%n/
...
mail_privileged_group = mail
...

4.5.3 認證配置

修改 /etc/dovecot/conf.d/10-auth.conf配置認證設置。

...
disable_plaintext_auth = yes
...
auth_mechanisms = plain login
...
!include auth-system.conf.ext
...
!include auth-passwdfile.conf.ext
...

因爲是最簡化配置,使用/etc/dovecot/conf.d/auth-passwdfile.conf.ext進行用戶認證配置。修改如下:

...
passdb {
  driver = passwd-file
  args = /etc/dovecot/virtal-mailbox-passwd
}

userdb {
  driver = static
  args = uid=5000 gid=5000 home=/var/mail/vhosts/%d/%n
}
...

這個配置,即配置了用戶認證數據,又配置用戶存儲路徑配置。

4.5.4 目錄權限設置

設置/etc/dovecot目錄的權限。

$: sudo chown -R vmail:dovecot /etc/dovecot
$: sudo chmod -R o-rwx /etc/dovecot

4.5.5 關閉不安全端口

打開/etc/dovecot/conf.d/10-master.conf配置, 關閉 pop3imap 非SSL端口。

...
service imap-login {
  inet_listener imap {
    port = 0
  }
  inet_listener imaps {
    port = 993
    ssl = yes
  }
  ...
}
...
service pop3-login {
  inet_listener pop3 {
    port = 0
  }
  inet_listener pop3s {
    port = 995
    ssl = yes
  }
}
...

4.5.6 開啓 dovecot 本地投遞

這裏先配置起來,雖然在postfix中,我們使用的是默認的本地投遞程序。打開/etc/dovecot/conf.d/10-master.conf配置,修改如下:

...
service lmtp {
  unix_listener /var/spool/postfix/private/dovecot-lmtp {
    #mode = 0666i
    mode = 0600
    user = postfix
    group = postfix
  }
...
}

4.5.7 開啓 dovecot SASL 認證

打開/etc/dovecot/conf.d/10-master.conf配置,修改如下:

...
service auth {
  ...
  unix_listener /var/spool/postfix/private/auth {
    mode = 0660
    user = postfix
    group = postfix
  }

  unix_listener auth-userdb {
    mode = 0600
    user = vmail
  }
...
  user = dovecot
}
...

service auth-worker {
  ...
  user = vmail
}
...

配置 SSL 證書, 打開/etc/dovecot/conf.d/10-ssl.conf配置,修改如下:

...
# SSL/TLS support: yes, no, required. <doc/wiki/SSL.txt>
ssl = required
...
ssl_cert = </etc/letsencrypt/live/example.org/fullchain.pem
ssl_key = </etc/letsencrypt/live/example.org/privkey.pem

4.5.8 設置郵箱默認文件夾

打開/etc/dovecot/conf.d/15-mailboxes.conf配置, 修改如下:

...
namespace inbox {
  
  mailbox Drafts {
    auto = subscribe
    special_use = \Drafts
  }
  mailbox Junk {
    auto = subscribe
    special_use = \Junk
  }
  mailbox Trash {
    auto = subscribe
    special_use = \Trash
  }
  mailbox Archive {
    auto = subscribe
    special_use = \Archive
  }

  # For \Sent mailboxes there are two widely used names. We'll mark both of
  # them as \Sent. User typically deletes one of them if duplicates are created.
  mailbox Sent {
    auto = subscribe
    special_use = \Sent
  }
  mailbox "Sent Messages" {
    special_use = \Sent
  }
...
}
  

完成以上配置後,重啓服務, systemctl restart dovecot

5. DNS 域名再配置

現在開始可以使用自己的郵件客戶端,配置賬號,收發郵件了。但是發出郵件還需要進一步配置域名信息,增加郵件服務的信譽度。
這些配置如今已不是可選項,而是必選項,分別是spfdkim配置。

5.1 工具安裝

在配置之前,首先要對郵件服務器的功能進行擴展,安裝必要的工具包:

$: apt-get install opendkim opendkim-tools postfix-policyd-spf-python postfix-pcre
# 增加 postfix 用戶到 opendkim 組
$: adduser postfix opendkim

5.2 spf 配置

5.2.1 增加 spf 記錄

在域名服務器上,增加一條TXT記錄到example.org, 內容爲:v=spf1 a:mail.example.org -all

5.2.2 打開 spf 驗證功能

  1. 打開配置/etc/postfix-policyd-spf-python/policyd-spf.conf修改以下配置:
...
HELO_reject = False
Mail_From_reject = False
...
  1. 打開配置/etc/postfix/main.cf增加以下配置:
...
policyd-spf_time_limit = 3600
...
smtpd_recipient_restrictions =
    ...
    reject_unauth_destination,
    check_policy_service unix:private/policyd-spf,
    ...
...
  1. 打開配置/etc/postfix/master.cf增加以下配置:
...
policyd-spf  unix  -       n       n       -       0       spawn
    user=policyd-spf argv=/usr/bin/policyd-spf

完成配置後,重新啓動服務: systemctl restart postfix

5.3 dkim 配置

5.3.1 生成 dkim

在添加 dkim 記錄前,需要首先生成記錄數據. 具體操作如下:

  1. 配置/etc/opendkim.conf,內容如下(可直接拷貝):
# This is a basic configuration that can easily be adapted to suit a standard
# installation. For more advanced options, see opendkim.conf(5) and/or
# /usr/share/doc/opendkim/examples/opendkim.conf.sample.

# Log to syslog
Syslog          yes
# Required to use local socket with MTAs that access the socket as a non-
# privileged user (e.g. Postfix)
UMask           002
# OpenDKIM user
# Remember to add user postfix to group opendkim
UserID          opendkim

# Map domains in From addresses to keys used to sign messages
KeyTable        /etc/opendkim/key.table
SigningTable        refile:/etc/opendkim/signing.table

# Hosts to ignore when verifying signatures
ExternalIgnoreList  /etc/opendkim/trusted.hosts
InternalHosts       /etc/opendkim/trusted.hosts

# Commonly-used options; the commented-out versions show the defaults.
Canonicalization    relaxed/simple
Mode            sv
SubDomains      no
#ADSPAction     continue
AutoRestart     yes
AutoRestartRate     10/1M
Background      yes
DNSTimeout      5
SignatureAlgorithm  rsa-sha256

# Always oversign From (sign using actual From and a null From to prevent
# malicious signatures header fields (From and/or others) between the signer
# and the verifier.  From is oversigned by default in the Debian package
# because it is often the identity key used by reputation systems and thus
# somewhat security sensitive.
OversignHeaders     From

# Define the location of the Socket and PID files
Socket              local:/var/spool/postfix/opendkim/opendkim.sock
PidFile             /var/run/opendkim/opendkim.pid
  1. 準備目錄及權限
$: chmod u=rw,go=r /etc/opendkim.conf
$: mkdir /etc/opendkim
$: mkdir /etc/opendkim/keys
$: chown -R opendkim:opendkim /etc/opendkim
$: chmod go-rw /etc/opendkim/keys
  1. 增加簽名配置/etc/opendkim/signing.table, 內容如下:
*@example.org   example
  1. 增加密鑰配置/etc/opendkim/key.table, 內容如下:
example     example.org:201907:/etc/opendkim/keys/example.private
  1. 新增信任主機/etc/opendkim/trusted.hosts, 內容如下:
127.0.0.1
::1
localhost
mail
mail.example.org
example.org
  1. 生成 dkim 數據
$: chown -R opendkim:opendkim /etc/opendkim
$: chmod -R go-rwx /etc/opendkim/keys

$: cd /etc/opendkim/keys
$: opendkim-genkey -b 2048 -h rsa-sha256 -r -s 201907 -d example.org -v
$: mv 201907.private example.private
$: mv 201907.txt example.txt

$: cd /etc
$: chown -R opendkim:opendkim /etc/opendkim
$: chmod -R go-rw /etc/opendkim/keys

此時,生成的 dkim 記錄就已經在 /etc/opendkim/keys/example.txt 中了。

重新啓動 opendkim 服務: systemctl restart opendkim

5.3.2 DNS 配置 dkim

DNS 配置 dkim 很簡單,就是一條 TXT 記錄。不過該記錄的內容來自上一步生成的內容:

以官網爲例,生成的 /etc/opendkim/keys/example.txt 內容如下:

201907._domainkey  IN  TXT ( "**v=DKIM1; h=rsa-sha256; k=rsa; s=email; "
    "p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu5oIUrFDWZK7F4thFxpZa2or6jBEX3cSL6b2TJdPkO5iNn9vHNXhNX31nOefN8FksX94YbLJ8NHcFPbaZTW8R2HthYxRaCyqodxlLHibg8aHdfa+bxKeiI/xABRuAM0WG0JEDSyakMFqIO40ghj/h7DUc/4OXNdeQhrKDTlgf2bd+FjpJ3bNAFcMYa3Oeju33b2Tp+PdtqIwXR"
    "ZksfuXh7m30kuyavp3Uaso145DRBaJZA55lNxmHWMgMjO+YjNeuR6j4oQqyGwzPaVcSdOG8Js2mXt+J3Hr+nNmJGxZUUW4Uw5ws08wT9opRgSpn+ThX2d1AgQePpGrWOamC3PdcwIDAQAB**" )  ; ----- DKIM key 201510 for example.com

實際配置DNS時,TXT 記錄需要稍微編輯,主要是 h=rsa-sha256 修改成 h=sha256. 實際配置記錄是:

v=DKIM1; h=sha256; k=rsa; s=email; p=MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAu5oIUrFDWZK7F4thFxpZa2or6jBEX3cSL6b2TJdPkO5iNn9vHNXhNX31nOefN8FksX94YbLJ8NHcFPbaZTW8R2HthYxRaCyqodxlLHibg8aHdfa+bxKeiI/xABRuAM0WG0JEDSyakMFqIO40ghj/h7DUc/4OXNdeQhrKDTlgf2bd+FjpJ3bNAFcMYa3Oeju33b2Tp+PdtqIwXRZksfuXh7m30kuyavp3Uaso145DRBaJZA55lNxmHWMgMjO+YjNeuR6j4oQqyGwzPaVcSdOG8Js2mXt+J3Hr+nNmJGxZUUW4Uw5ws08wT9opRgSpn+ThX2d1AgQePpGrWOamC3PdcwIDAQAB

等待 DNS 記錄生效後,可以通過以下命令驗證 dkim 配置是否成功:

$: opendkim-testkey -d example.org -s 201907

沒有任何輸出,即成功。

5.3.3 啓用 dkim

dkim 主要是通過 milter 擴展的方式,增加到 postfix 中的。具體原理可以參考: MILTER_README.

集成 dkim 工具的具體步驟如下:

  1. 創建 UNIX 本地通信套接字文件
$: mkdir /var/spool/postfix/opendkim
$: chown opendkim:postfix /var/spool/postfix/opendkim
  1. 修改 opendkim 配置: /etc/default/opendkim, 如下:
...
# Uncomment to specify an alternate socket
# Note that setting this will override any Socket value in opendkim.conf
SOCKET="local:/var/spool/postfix/opendkim/opendkim.sock"
#SOCKET="inet:54321" # listen on all interfaces on port 54321
#SOCKET="inet:12345@localhost" # listen on loopback on port 12345
#SOCKET="inet:[email protected]" # listen on 192.0.2.1 on port 12345
...
  1. 在 postfix 中增加 milter 配置, 修改 /etc/postfix/main.cf 如下:
# Milter configuration
# OpenDKIM
milter_default_action = accept
# Postfix ≥ 2.6 milter_protocol = 6, Postfix ≤ 2.5 milter_protocol = 2
milter_protocol = 6
smtpd_milters = local:opendkim/opendkim.sock
non_smtpd_milters = local:opendkim/opendkim.sock

完成配置後,重新啓動服務:

$: systemctl restart opendkim
$: systemctl restart postfix

5.4 可選配置

完成 spf 與 dkim 配置後,還可以進行進一步的 DNS 配置,不過這些屬於可選配置。具體配置很簡單,可以直接參考Linode文檔中的 ADSP 與 DMARC 配置.

6. 小結

以上配置親測有效,唯一需要修改的地方就是具體的郵件域名example.org替換成目標域名即可。通過發給 gmail 的郵件原文驗證所有配置生效。

參考

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章