原文發佈於個人站點: GitDiG.com, 原文鏈接: 9102年,再玩一次郵件系統: 安裝篇
本文主要原本打算作爲9102年,再玩一次郵件系統系列文章的中篇寫的,卻是最早完成的。本系列文章將包括以下三篇:
- [ ] 9102年,再玩一次郵件系統: 原理篇
- [x] 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
即可。
安裝完成後,Postfix
與 Dovecot
相關服務就全啓動了。可以通過netstat -ltpn
查看監聽端口信息。
4.2 maildir 準備
maildir
作爲 postfix
與 dovecot
服務的存儲中介,提供郵件的存儲功能。最簡化配置不考慮多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
服務的465
與587
端口, 即smtps
與 submission
服務端口.修改/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
配置, 關閉 pop3
與 imap
非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 域名再配置
現在開始可以使用自己的郵件客戶端,配置賬號,收發郵件了。但是發出郵件還需要進一步配置域名信息,增加郵件服務的信譽度。
這些配置如今已不是可選項,而是必選項,分別是spf
與dkim
配置。
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 驗證功能
- 打開配置
/etc/postfix-policyd-spf-python/policyd-spf.conf
修改以下配置:
...
HELO_reject = False
Mail_From_reject = False
...
- 打開配置
/etc/postfix/main.cf
增加以下配置:
...
policyd-spf_time_limit = 3600
...
smtpd_recipient_restrictions =
...
reject_unauth_destination,
check_policy_service unix:private/policyd-spf,
...
...
- 打開配置
/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 記錄前,需要首先生成記錄數據. 具體操作如下:
- 配置
/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
- 準備目錄及權限
$: 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
- 增加簽名配置
/etc/opendkim/signing.table
, 內容如下:
*@example.org example
- 增加密鑰配置
/etc/opendkim/key.table
, 內容如下:
example example.org:201907:/etc/opendkim/keys/example.private
- 新增信任主機
/etc/opendkim/trusted.hosts
, 內容如下:
127.0.0.1
::1
localhost
mail
mail.example.org
example.org
- 生成 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 工具的具體步驟如下:
- 創建 UNIX 本地通信套接字文件
$: mkdir /var/spool/postfix/opendkim
$: chown opendkim:postfix /var/spool/postfix/opendkim
- 修改 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
...
- 在 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 的郵件原文驗證所有配置生效。