我在 Linode 上運行 postfix。
Linux redacted 5.3.11-x86_64-linode131 #1 SMP PREEMPT Wed Nov 13 18:51:32 UTC 2019 x86_64 x86_64 x86_64 GNU/Linux
amavisd-new-postfix/xenial,xenial,now 1:2.10.1-2ubuntu1 all [installed]
postfix/xenial-updates,now 3.1.0-3ubuntu0.3 amd64 [installed]
postfix-mysql/xenial-updates,now 3.1.0-3ubuntu0.3 amd64 [installed]
postfix-pcre/xenial-updates,now 3.1.0-3ubuntu0.3 amd64 [installed]
postfix-policyd-spf-python/xenial,xenial,now 1.3.2-1 all [installed,automatic]
我將 postfix 安裝配置為拒絕 RBL 和 SPFFAIL 電子郵件,而不是搞亂隔離區。不幸的是,我需要從一家公司接收電子郵件,該公司的 SPF 記錄不正確,這種情況已經存在了一段時間。因此,我得到的不是電子郵件,而是這樣的日誌:
4 月1 日10:41:42 編輯postfix/smtpd[18833]:NOQUEUE:拒絕:來自us-smtp-delivery-134.mimecast.com[216.205.24.134] 的RCPT:550 5.7.1 收件人地址被拒絕:訊息被拒絕至:SPF 失敗 - 未授權。請參見http://www.openspf.net/Why?s=mfrom;id=redacted;ip=216.205.24.134;r=redacted; from=< 已編輯> 到=< 已編輯> proto=ESMTP helo=< us-smtp-delivery-134.mimecast.com>
該公司沒有可能在其網站或 WHOIS 資訊中解決此問題的聯絡人(我假設註冊者 @dnstinations.com [某些第三方供應商] 會忽略來自第三方的電子郵件,其中表示: DNS配置錯誤) 。
當我第一次收到此日誌而不是電子郵件時,我嘗試將 *.mimecast.com 列入白名單,但這沒有什麼區別,所以今天,我看了一下我的 main.cf。我看到 SPF 配置與我的白名單位於不同的行,所以我想也許我可以單獨建立一個特定於 SPF 的白名單。這是我的 main.cf 之前的樣子:
smtpd_client_restrictions = permit_sasl_authenticated, permit_mynetworks, check_client_access regexp:/etc/postfix/rbl_client_regex, check_client_access hash:/etc/postfix/rbl_client_override, reject_rbl_client zen.spamhaus.org, reject_rbl_client bl.spamcop.net, reject_rbl_client dnsbl.sorbs.net
smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination, check_policy_service unix:private/policy-spf
smtpd_sender_restrictions = permit_mynetworks, permit_sasl_authenticated, check_sender_access hash:/etc/postfix/access, reject_unknown_sender_domain
這是現在的樣子:
smtpd_client_restrictions = permit_sasl_authenticated, permit_mynetworks, check_client_access regexp:/etc/postfix/rbl_client_regex, check_client_access hash:/etc/postfix/rbl_client_override, reject_rbl_client zen.spamhaus.org, reject_rbl_client bl.spamcop.net, reject_rbl_client dnsbl.sorbs.net
smtpd_recipient_restrictions = permit_sasl_authenticated, permit_mynetworks, reject_unauth_destination, regexp:/etc/postfix/spf_client_regex, check_policy_service unix:private/policy-spf
smtpd_sender_restrictions = permit_mynetworks, permit_sasl_authenticated, check_sender_access hash:/etc/postfix/access, reject_unknown_sender_domain
基本上,我對 main.cf 所做的就是添加“正規表示式:/etc/postfix/spf_client_regex,“ 前 ”check_policy_service unix:private/policy-spf“ 在裡面 ”smtpd_收件者限制“ 部分。
我還使用此條目創建了 /etc/postfix/spf_client_regex (這似乎足夠安全,因為 mimecast 是反垃圾郵件供應商):
/.*\.mimecast\.com$/ OK
我使用 postmap -q 進行了測試,得到了預期的“OK”結果,運行“postmap /etc/postfix/spf_client_regex”來更新所有更新,並重新載入 postfix。不幸的是,來自該寄件者的郵件仍因 SPF 失敗而被封鎖。
因此,我預期上述步驟是正確的,因為它們與 smtpd_client_restrictions 部分中的白名單規則所採取的步驟基本上相同,導致拒絕_rbl_client 規則被忽略,但它不起作用。如本文標題所述:我可以使用白名單來覆蓋 SPF 策略嗎?如何?
答案1
好的,所以我在評論後閱讀了手冊克里夫·阿姆斯特朗,我想我已經找到了解決方案。首先,我發現雖然 smtpd_client_restrictions 和 smtpd_sender_restrictions 都允許解析表,但都不允許處理策略。接下來,我發現客製化政策可以創建,但這似乎不需要我學習程式語言來解決,所以我做了一個搜索,導致我這個帖子對某個特定的 spf 政策代表有一些合理的抱怨,並解釋瞭如何將目前可用的兩個 spf 政策代表列入白名單。
幸運的是,我已經安裝了「更好」的策略委託,所以我不必更改它:
~$ apt list | grep policyd-spf
WARNING: apt does not have a stable CLI interface. Use with caution in scripts.
postfix-policyd-spf-perl/xenial,xenial 2.010-2 all
postfix-policyd-spf-python/xenial,xenial,now 1.3.2-1 all [installed,automatic]
接下來,我查看了註釋檔案(嗯,在我的情況下它是 gzip 的,所以我複製到了gunzip,然後在完成後刪除了該副本)並找到了這些相關註釋:
# Whitelist: CIDR Notation list of IP addresses not to check SPF for.
# Example (default is no whitelist):
# Whitelist = 192.168.0.0/31,192.168.1.12
# Domain_Whitelist: List of domains whose sending IPs (defined by passing
# their SPF check should be whitelisted from SPF.
# Example (default is no domain whitelist):
# Domain_Whitelist = pobox.com,trustedforwarder.org
基於此,聽起來像是網域白名單對我不起作用,因為評論說“通過 SPF 檢查定義的應該被列入 SPF 白名單”。這看起來很奇怪(如果寄件者通過了網域的 spf 檢查,我就不需要加入白名單),但我仍然有白名單選項,所以我發現mimecast spf 文檔然後使用 nslookup 收集 IP:
~$ nslookup
> set type=txt
> us._extnetblocks.mimecast.com
;; Truncated, retrying in TCP mode.
Server: 50.116.58.5
Address: 50.116.58.5#53
Non-authoritative answer:
us._extnetblocks.mimecast.com text = "v=spf1 ip4:207.211.30.40 ip4:207.211.30.41 ip4:207.211.30.42 ip4:207.211.30.43 ip4:207.211.30.44 ip4:207.211.30.45 ip4:207.211.30.46 ip4:207.211.30.47 ip4:207.211.30.48 ip4:207.211.30.49 ip4:205.139.111.40 ip4:205.139.111.41 ip4:205.139.111.42 " "ip4:205.139.111.43 ip4:205.139.111.44 ip4:205.139.111.45 ip4:205.139.111.46 ip4:205.139.111.47 ip4:205.139.111.48 ip4:205.139.111.49 ~all"
Authoritative answers can be found from:
mimecast.com nameserver = dns02.mimecast.net.
mimecast.com nameserver = dns03.mimecast.net.
mimecast.com nameserver = dns04.mimecast.net.
mimecast.com nameserver = dns01.mimecast.net.
然後我將這些結果放入設定檔中:
Whitelist = 207.211.30.40, 207.211.30.41, 207.211.30.42, 207.211.30.43, 207.211.30.44, 207.211.30.45, 207.211.30.46, 207.211.30.47, 207.211.30.48, 207.211.30.49, 205.139.111.40, 205.139.111.41, 205.139.111.42, 205.139.111.43, 205.139.111.44, 205.139.111.45, 205.139.111.46, 205.139.111.47, 205.139.111.48, 205.139.111.49
這並不理想,因為它會自動允許這些 IP 從其他網域發送,並且 IP 可能會易手,但對於我的私人實作來說已經足夠了。因此,我不會嘗試學習創建自己的代表或僱用某人為我創建一個代表。儘管進行了這些更改,如果我得到另一個類似的 NOQUEUE 結果,我會為此答案添加註釋。