如何使用 DKIM 設置 Postfix 郵件服務器

郵件服務器(Mail Transfer Agent,MTA)的安裝和配置是任何系統管理員面臨的典型任務之一。 在這裡,我們將介紹該任務,到文章結尾時,CentOS 7 將配備 Postfix 郵件服務器,該服務器偵聽 25 端口 (SMTP) 並將所選域的郵件發送到用戶郵箱。

首先,我們需要正確配置域的 DNS 記錄。 這是在 2 個地方完成的:

A、TXT 和 MX 記錄存儲在您域的註冊商 GoDaddy 中 example.

使用’dig’命令以記錄名稱和域名作為參數檢查記錄。 在我們的 example,我的域andreybondarenko.com配置如下:

  ┌[root@andreybondarenko]─[~]
  └─10/09 08:37:08-# dig mx andreybondarenko.com
  [...]
  ;; ANSWER SECTION:
  andreybondarenko.com. 1800 IN MX 1 andreybondarenko.com.
  [...]

這表明整個 andreybondarenko.com 域的郵件由名為“andreybondarenko.com”的主機提供服務,因為我只有一台主機。 如果我們有更多,我們可以創建 mx1.andreybondarenko.com 和 mx2.andreybondarenko.com,它們將發送客戶端隨機選擇的郵件。 這對於穩定性、冗餘和負載平衡很有用。

PTR 記錄是在主機提供商端設置的。 您可以在控制面板中找到該記錄,或者技術支持服務會為您執行此操作。如果託管服務提供商拒絕更改它,您的郵件將被大多數大型郵件服務器(包括 Google)拒絕。 此記錄稱為“反向”,允許任何人檢查用於啟動連接的 IP 地址是否具有有效域名。 這是檢測垃圾郵件機器人的一種快速簡便的方法:它使用不受其控制的 IP 地址,因此無法正確設置 PTR 記錄。

其次,應該安裝 Postfix 本身。 我建議將其用作郵件服務器,因為它高度靈活、安全、可擴展,並且可以在大型安裝中為您提供高性能。 在 CentOS 上運行:

yum install postfix

並且數據包管理器將安裝它以及所需的所有依賴項。 目前 2.10.1 版本是 CentOS 存儲庫中可用的最新版本,因此我將使用它。
Postfix 有 2 個配置文件。 /etc/postfix/master.cf 控制進程計數,它們的行為,它們是否使用 chrooted 環境,並且在大多數情況下默認值是可以的。 /etc/postfix/main.cf 控制其他一切,我們需要更改以下內容:

  myhostname = andreybondrenko.com
  mydomain = andreybondarenko.com

這兩個變量應該設置為主機本身的有效主機名以及他為其提供郵件服務的域。 就我而言,它們是相同的。

  myorigin = $myhostname

myorigin 參數指定本地發布的郵件似乎來自的域。 默認是附加 $myhostname,這對於小型站點來說是可以的。 如果您運行具有多個郵件服務器的域,您應該將其更改為 $mydomain 並設置一個域範圍的別名數據庫,為每個用戶 [email protected] 設置別名。 為了保持發件人和收件人地址之間的一致性,myorigin 還指定了附加到沒有@domain 部分的收件人地址的默認域名。 我們將使用默認設置。

  inet_interfaces = all
  inet_protocols = all

這兩個設置將告訴 smtpd 在所有接口上偵聽 IPv4 和 IPv6。

  mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain, myotherdomainihave.com

此變量設置我們將接受郵件的所有域。 在本例中,它是 andreybondarenko.com、myotherdomainihave.com 和 localhost。

中繼域 = $mydestination
如果收件人不在我們的主機上,此變量設置我們將中繼郵件的所有域。
這基本上就是我們需要的所有初始配置:它告訴 smtpd 偵聽所有接口上的 25 端口,接受發送到 andreybondarenko.com、localhost 和 myotherdomainihave.com 的郵件。 默認情況下,它會將​​郵件發送到 /var/mail 中的用戶郵箱,以後我們可以將 dovecot 設置為 IMAP 服務器並提供 SASL 身份驗證,然後我們可以對 Postfix 進行垃圾郵件加固,設置灰名單和 DKIM。 我們需要做的最後一件事是告訴 Systemd 在啟動時啟動 Postfix 並立即運行它:

  systemctl enable postfix
  systemctl start postfix

我們現在可以看到它正在進程列表中運行:

   ┌[root@andreybondarenko]─[~]
   └─10/09 09:16:44-# ps ax|grep postfix
   1764 ? Ss 0:02 /usr/libexec/postfix/master -w

我們可以連接到 25 端口並使用 telnet 發送消息:

  ┌[root@andreybondarenko]─[~]
  └─10/09 09:19:13-# telnet localhost 25
  Trying ::1...
  Connected to localhost.
  Escape character is '^]'.
  220 andreybondrenko.com ESMTP Postfix
  helo andreybondarenko.com
  250 andreybondrenko.com
  mail from:
  250 2.1.0 Ok
  rcpt to:
  250 2.1.5 Ok
  data
  354 End data with .
  test
  .
  250 2.0.0 Ok: queued as EBA0881589
  quit
  221 2.0.0 Bye

  Connection closed by foreign host.

並在 /var/log/maillog 中查看

  Sep 10 09:19:18 andreybondarenko postfix/smtpd[10889]: connect from localhost[::1]
  Sep 10 09:19:47 andreybondarenko postfix/smtpd[10889]: EBA0881589: client=localhost[::1]
  Sep 10 09:19:54 andreybondarenko postfix/cleanup[10895]: EBA0881589: message-id=
  Sep 10 09:19:54 andreybondarenko postfix/qmgr[1770]: EBA0881589: from=, size=352, nrcpt=1

現在是設置 DKIM 的時候了(請參閱 https://en.wikipedia.org/wiki/DomainKeys_Identified_Mail)。 事實上,Domain Key技術提供的唯一信息就是控制DNS的人也控制了郵件服務器。 這意味著我們應該同時設置兩個地方:DNS TXT 記錄和服務器端的特殊守護進程。

首先,安裝 opendkim 包:

  yum install opendkim

二、跑

┌[root@andreybondarenko]─[~]
└─10/09 18:46:11-# opendkim-default-keygen
Generating default DKIM keys:
Default DKIM keys for freshdaymall.com created in /etc/opendkim/keys.

在 /etc/opendkim/keys 中將有 2 個包含公鑰和私鑰的文件。 檢查私鑰的以下權限(只有 opendkim 用戶可以讀取):

  ┌[root@andreybondarenko]─[/etc/opendkim/keys]
  └─10/09 18:50:52-# ll default.private
  -r--------. 1 opendkim opendkim 887 Oct 2 2016 default.private

現在我們需要更正設置。

  • /etc/opendkim.conf – opendkim 的配置文件
  • /etc/opendkim/keytable — 定義域私鑰的路徑
  • /etc/opendkim/signingtable – 告訴 OpenDKIM 如何應用密鑰。
  • /etc/opendkim/TrustedHosts – 定義允許哪些主機使用密鑰。

我已將我的公鑰和私鑰複製到 /etc/opendkim

  ┌[root@andreybondarenko]─[/etc/opendkim]
  └─10/09 18:53:40-# ls -la
  total 48K
  drwxr-xr-x. 3 root opendkim 4.0K Jan 9 2017 .
  drwxr-xr-x. 96 root root 12K Sep 8 07:28 ..
  -r--------. 1 opendkim opendkim 887 Oct 2 2016 andreybondarenko.com.private
  -rw-r-----. 1 root opendkim 333 Oct 2 2016 andreybondarenko.com.txt
  drwxr-x---. 2 opendkim opendkim 4.0K Dec 21 2016 keys
  -rw-r--r--. 1 root root 106 Oct 3 2016 keytable
  -rw-r--r--. 1 root root 60 Oct 3 2016 signingtable
  -rw-r-----. 1 opendkim opendkim 378 Dec 21 2016 TrustedHosts

在 /etc/opendkim.conf 中,我們需要以下參數:

  • 模式 sv – 簽署和驗證傳出的消息
  • Socket inet:8891@localhost – 使用 localhost 的 8891 端口進行通信
  • ReportAddress “andreybondarenko.com Postmaster” – 郵政局長的地址。
  • 域 andreybondarenko.com – 我的域
  • 選擇器郵件 – 查看密鑰的 TXT 記錄的部分。

默認情況下可以使用其他參數。

然後設置 /etc/opendkim/keytable 如下:

  mail._domainkey.andreybondarenko.com andreybondarenko.com:mail:/etc/opendkim/andreybondarenko.com.private

和 /etc/opendkim/signingtable

  *@andreybondarenko.com mail._domainkey.andreybondarenko.com

第一個文件定義在何處查找域的私鑰(請記住,現實生活中的服務器可以有很多),第二個文件定義所有郵件都應使用此密鑰進行簽名。 TrustedHosts 是微不足道的默認值:

  127.0.0.1
  ::1

現在我們可以運行 opendkim:

  systemctl enable opendkim
  systemctl start opendkim

主機的最後一部分是告訴 Postfix 首先通過添加本地 milter 將所有郵件轉發到 opendkim:

  smtpd_milters = inet:127.0.0.1:8891
  non_smtpd_milters = inet:127.0.0.1:8891

而已! 重新啟動 Postfix 以獲取新配置:

  systemctl restart postfix

現在是最後也是非常重要的部分:我們需要向公眾公開具有 DNS TXT 記錄的世界密鑰的開放部分。 您需要按如下方式創建記錄:

  • 名稱 – mail._domainkey
  • 類型:TXT
  • TTL:1小時
  • 值:v=DKIM1; k=rsa; P = MIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQCvGRWfWPPZVIg0fy7Pr0 + rsBsoL6Imt1GBE / QRd3X5Izv1iAJFUsOteaf9TI9EO / YFwoLLahzuoZM1aUU4ED3fHlItEnqXCKQhX8Zripi7cfIO + DRFEhGuQtG6OIuA6 + c3ivao7DTPk / IFqY7MG5M3wMvAfV + eIBf1VjmajSwe3wIDAQABLast一部分,“值”是棘手的,並可能導致錯誤。 您需要閱讀 /etc/opendkim/your_domain.txt 或 /etc/opendkim/keys/default.txt 並複制刪除所有引號符號(即所有“)的值。

郵件服務器是一種常見但複雜的服務,因為它與外部世界交互並且必須遵循最佳實踐,所以郵件會被接受並且不會丟失。