Postfix 郵件伺服器新增 SPF、DKIM

 

當初要幫自己的主機架設mail server搞了很多有的沒有的,但是設定完之後不是信發不出去就是被分配到垃圾信件中,如果要讓信件不被分配到垃圾信要做以下認證

  • SPF
  • DKIM

SPF還算好設定網路上其實爬一爬在DNS設定一下就OK了,但是依照GMail的規則只有SPF還是不能保證其安全所以還是會被分配到 spam 信箱中

以下指令皆用藍色,內文用橘色,相關標註參考等用灰色

SPF設定可以先隨便寄一封信到GMail,因為我們都還沒設定SPF跟DKIM所以一定會在垃圾信箱裡,開啟信件之後在左上角回復的旁邊有個小倒三角,點下去選擇查看原始信件,裡面是全文字可以用ctrl+F在頁面中搜尋

  • Received: from 

後面會接著你主機的IP,所以在DNS中新增一個SPF跟TXT紀錄

  • v=spf1 ip4:(ipv4的IP) ~all

設定完成後等到DNS更新後再寄一封信到GMail測試,當然只有SPF一樣會被判定為spam,所以還是得要到垃圾信箱找信,一樣查看原始信件,看看有沒有一個內容是

  • Received-SPF: pass (google.com: domain of apache@(你的主機名稱) designates (發信主機IP) as permitted sender) client-ip=(發信主機IP);

如果不是pass而是其他的要查看原因,有可能的原因是主機名稱為對應到DNS,用本網域來作例子,假如我的主機名是kttsite.com但是我的DNS的SPF紀錄是mail.kttsite.com 那當然對應不上會錯誤,而我本人遇到是發信主機的IP不是ipv4而是ipv6,而我們新增的SPF紀錄只有ipv4對不上就錯誤了,這種只要在紀錄上加ipv6:(信中看到的ipv6 IP)等待DNS更新再寄就應該是pass了

那當然有SPF還是一樣會被判定是spam,所以我們還要再加一個DKIM來確定這個就是這台主機發送的

以下是使用CentOS 6.8作範例,不同的系統有不同的指令操作,請自行更換,有些操作有參考他人的做法

首先先安裝opendkim

  • yum install opendkim -y

安裝完先不要執行,因為執行一樣會報錯誤

編輯 /etc/postfix/opendkim.conf

(這部分之後嘗試使用opendkim原本的conf檔做設定,因為用這樣設定可能重新啟動 postfix 會有 port 8891 占用的情況發生,如果這樣的話要先把 postfix stop 並把所有的 opendkim 程序都給 kill 掉在 restart postfix就沒問題了,這些都要看系統紀錄檔maillog除錯!)

  • vi /etc/postfix/opendkim.conf

插入以下內容:

  • Domain kttsite.com
  • KeyFile /etc/postfix/rsa.private
  • InternalHosts /etc/postfix/ilist
  • Selector dk
  • Socket inet:8891@localhost
  • Syslog Yes
  • UserID postfix

 

  • Domain : 就是我們要 sign 的 domain 上述的kttsite.com請自行更換!
  • KeyFile : 由於 DKIM 或者 Domainkeys 都是靠非對稱加解密方式作驗證,所以需要一把 private/public key,這裡填入的是 sign 需要的 private key
  • InternalHosts:這個檔案就是告訴 DKIM 從哪些 ip 來的 relay 我們都要 sign mail
  • Selector:這個是驗證時候要用的 subdomain,就隨便定一個名稱吧。
  • Socket:由於 opendkim 是一個 daemon,這是他要 listen 的 socket (unix domain socket 也是 ok 的)
  • Syslog:要不要使用 syslog 來記錄,會被歸類在 maillog裡面。
  • UserID:daemon 的 UID

InternalHosts檔要自己建立一個名為 ilist 的檔案

  • vi /etc/postfix/ilist

並寫入以下內容

  • 127.0.0.1

因為只有本機要傳送郵件,所以只允許本機囉,如果要允許其他主機就再添加該主機的IP位置!

KeyFile所需要用到的Private key & Public key也要製作出來,在Google的說明中有提到,Key的長度未超過1024就算有通過DKIM也是會被丟到垃圾信件中哦!所以這邊的範例是使用2048

  • openssl genrsa -out /etc/postfix/rsa.private 2048
  • openssl rsa -in /etc/postfix/rsa.private -out /etc/postfix/rsa.public -pubout -out rsa.public

設定也好了之後我們就來啟動 daemon 吧!指令很簡單

  • opendkim -x /etc/postfix/opendkim.conf -A -l

搞定收工。這樣 opendkim 就會 listen 在 port 8891 了。

然後我們要設定讓 postfix 吃到這個 milter,在 /etc/postfix/main.cf 加入下列資訊:

  • smtpd_milters = inet:localhost:8891
  • non_smtpd_milters = inet:localhost:8891

然後重新啟動 postfix

  • service postfix retsart

 就完成了 主機端 postfix & opendkim 的設置

別忘了上面製作兩個金鑰,一個是 private 一個是 public

一樣要在 DNS 設定 DKIM 的紀錄,上面設定opendkim.conf中的 Selector 就要用到拉

上面的 Selector 我們是設定成 dk 所以在DNS中要設定成

  • dk._domainkey.kttsite.com TXT v=DKIM1; k=rsa;s=email;p=(Public Key)

Public Key 就是我們上面製作的 rsa.public 用下方的指令顯示出 Public Key整個檔案內容

  • cat /etc/postfix/rsa.public

內容大概為這樣

—–BEGIN PUBLIC KEY—–

IQWIRHj23992ejiih……==

—–END PUBLIC KEY—–

就要從 IQ 開始複製到 == 全部都要寫到 DNS 中

等 DNS 更新完成後再寄信看原始內容就會看到開頭是

  • DKIM-Signature: v=1; a=rsa-sha256; c=simple/simple;

然後看一下 SPF 跟 DKIM 有沒有通過驗證

  • Authentication-Results: mx.google.com;
    dkim=pass header.i=@????;
    spf=pass (google.com: domain of ????@????? designates ???.???.???.??? as permitted sender) smtp.mailfrom=???@?????

有這些就表示 SPF 跟 DKIM 都通過驗證囉,這樣會不會再被丟到垃圾信件裡,答案是有可能,因為還有信件內容的設定,當然這是很嚴格很嚴格的設定,基本上 SPF 跟 DKIM 有 pass 就不會被 GMail 丟到垃圾信箱中,如果真的很龜毛在做下列的設定….基本上是用線上免費的檢查機制,但本人試過同內容同設定寄的信在不同檢查網頁中一個說我的 DKIM 無效,另一個跟 Google 一樣是pass ,所以….各位就參考看看囉XD

以下為檢查的線上服務

 

可能遇到的問題有以下:

Q1: SPF 跟 DKIM 都設定好了 SPF 是 PASS 但是 DKIM 是 dkim=neutral (body hash did not verify)

  • 這問題當初我也苦惱很久不管怎麼弄都一直這樣,實問題不是出在 postfix 跟 DKIM 設定錯誤,是出在信件格式,如果寄信的標頭中有這段” Content-type:text/html;charset=utf-8 ,表示信件是以HTML格式顯示給收件者,那在信件內容可以包含<head><meta><title><body>,當你發現有<html>把它跟</html>都移除掉,或者斷行很多人習慣使用 \r\n 都改為 \n 在寄一次看看,這個問題應該就解決了。

Q2: SPF 跟 DKIM 都是 pass 還是被判定為 spam

  • 當兩個都是 pass 時在 GMail 信件標題下方的 “寄給我” 旁邊的倒三角點下去應該會有個 “簽署者”,如果確定都 OK 這時候就要用到上面的線上服務查看 SpamAssassin Score ,我遇到的是問題有 PHP_ORIG_SCRIPTRCVD_IN_SBL_CSS,第一個好解決只要設定 php.ini 將 mail.add_x_header = On 改為 Off ,第二個就很麻煩,我自己有中獎但是不理他GMail還是沒有把信判斷成 spam ,這個是眾多域名、IP黑名單的提供商之一,這種只能寫信去跟提供商反應,但要不要把你的域名或IP移除判斷權全都在他們手上,他們不想裡你你也拿他沒責,反正不把信丟到 spam 裡面就不理他了XD

發表迴響