如何使用 Postfix 進行垃圾郵件陷阱?
如何使用 Postfix 設置垃圾郵件陷阱,以防止發送到被困地址的客戶端向我發送更多垃圾郵件?
概述
貝氏過濾器和模式匹配以及 RBL 都是打擊垃圾郵件的一部分。此設置旨在增強而不是替換這些設置。
請注意,我沒有列入灰名單。灰名單在理論上很棒,但在實踐中它對您的使用者來說非常煩人。有些人在這方面取得了巨大的成功。我不是那些人中的一員。
我所做的是設置一些電子郵件地址(我有大約 10,000 個,但你可以用幾百個)作為垃圾郵件陷阱。這些地址的列表與各種高流量站點分開連結,機器人會在這些站點找到它們,但人們不會。這些地址被收集,賣給垃圾郵件發送者,現在我知道垃圾郵件會從哪裡進來。
Postfix 被配置為將消息重定向到這些地址中的任何一個到我的垃圾郵件陷阱腳本,該腳本將它們添加到 PF 中的一個表中,以便來自該客戶端的任何進一步的消息最終在我的 tarpit 中。
優點:
- 零誤報率(或至少盡可能接近)
- 資源便宜
- 在第一次違規後在防火牆層阻止垃圾郵件發送者
- 自我修復(被困地址在 24 小時後過期)
缺點:
- 非即插即用
- 相當多的活動元件
如何?
您的郵件伺服器必須能夠執行 PF 和 spamd。據我所知,這意味著 OpenBSD 或 FreeBSD。我確信這些說明可以適應 Linux 及其防火牆的風格,但這超出了我的回答範圍。
我已經為 FreeBSD 編寫了這個。OpenBSD 使用者應該能夠主要通過更改路徑來適應這些步驟。
最後,這一切都適用於 Postfix 2.5+
- 啟用 PF ( http://www.freebsd.org/doc/en/books/handbook/firewalls-pf.html )
- 添加到 PF:
表 <spamd> 持久化 表 <local-whitelist> 持久化文件“/usr/local/etc/spamd/local-whitelist.txt”
- 從埠安裝 spamd
- 創建 /usr/local/etc/spamd/local-whitelist.txt。PF 將讀取該文件以生成 <local-whitelist> 表。我建議參考http://www.greylisting.org/whitelisting.shtml以獲取永遠不應該被緩送的地址。一個範例文件:
127.0.0.1 10.0.0.0/8 # 亞馬遜 207.171.168.0/24 207.171.180.0/24 207.171.187.0/24 207.171.188.0/24 207.171.190.0/24 #美國線上 64.12.137.0/24 64.12.138.0/24 152.163.225.0/24 205.188.139.0/24 205.188.144.0/24 205.188.156.66 205.188.157.0/24 205.188.159.7 # 蘋果 17.254.6.0/24 #易趣 66.135.197.0/24 66.135.209.0/24 # 郵箱 64.68.80.0/21 64.233.160.0/19 64.233.162.192/28 64.233.170.192/28 64.233.182.192/28 64.233.184.192/28 66.249.82.192/28 66.249.92.192/28 66.249.64.0/19 66.102.0.0/20 70.89.39.152/29 70.90.219.48/29 70.90.219.72/29 72.14.192.0/18 74.125.0.0/16 209.85.128.0/17 216.239.32.0/19 216.239.56.240/28 #postini 63.146.199.13/32 63.146.199.14/32 63.71.11.123/32 63.71.11.124/32 64.18.0.0/20 67.114.133.222/32 68.123.185.46/32 74.125.148.0/22 204.14.232.0/22 207.126.144.0/20 208.111.151.5/32 208.74.204.5/32 # skynet.be 195.238.2.0/24 195.238.3.0/24 #雅虎 64.94.237.0/24 66.163.160.0/19 66.196.64.0/18 66.218.64.0/19 66.218.66.0/24 66.218.67.0/24 66.218.69.0/24 69.147.92.0/24 73.30.0.0/16 74.6.0.0/16 206.190.32.0/19 216.34.77.0/25 216.136.226.0/24
- 重新載入 PF
- 創建 /usr/local/scripts/get-spamtrapped:
#!/bin/sh /usr/local/sbin/spamdb | grep TRAPPED | cut -d '|' -f 2
- 創建 /usr/local/etc/spamd/spamd.conf。我建議也使用 nixspam 和 ualbert.ca 列表,但至少您需要 spamtrapped 和 override 列表。(注意:我知道覆蓋對於 PF 的 rdr 規則是多餘的——我移動的東西足夠多,我想要這種雙重保護):
全部:uatraps:覆蓋:nixspam:覆蓋:垃圾郵件陷阱:覆蓋: # 阿爾伯塔大學灰色陷阱命中。 # 從行為不端開始,地址會在其中保留 24 小時。 utraps:\ :黑色的:\ :msg="您的地址 %A 已將郵件發送到 ualberta.ca 垃圾郵件陷阱\n\ 過去 24 小時內":\ :方法=http:\ :file=www.openbsd.org/spamd/traplist.gz: # Nixspam 最近的來源列表。 # 鏡像自 http://www.heise.de/ix/nixspam 垃圾郵件:\ :黑色的:\ :msg="您的地址 %A 在 nixspam 列表中\n\ 有關詳細資訊,請參見 http://www.heise.de/ix/nixspam/dnsbl_en/":\ :方法=http:\ :file=www.openbsd.org/spamd/nixspam.gz: # Trapped IPs - 所以我們可以在不使用灰名單的情況下阻止它們 垃圾郵件:\ :黑色的:\ :msg="您的地址 %A 已將郵件發送到此伺服器上的垃圾郵件陷阱\n\ 過去 24 小時內":\ :方法=執行:\ :file=/usr/local/scripts/get-spamtrapped: 覆蓋:\ :白色的:\ :方法=文件:\ :file=/usr/local/etc/spamd/local-whitelist.txt:
- 將 spamd 設置為在啟動時執行。請注意,您沒有在僅黑名單模式下執行,並且當有人嘗試發送到黑名單時會引發 5xx 錯誤。前者是如此 spamdb 將處理儲存/過期的被困地址。後者是禮貌。添加到/etc/rc.conf:
obspamd_enable="是" obspamd_flags="-5"
- 啟動垃圾郵件:/usr/local/etc/rc.d/obspamd start
- Cronjob 每小時一次以僅黑名單模式執行 spamd-setup。黑名單模式強制它更新 <spamd> pf 表而不是 spamd 的內部表。由於 spamd 只是緩送和儲存數據,因此其他所有內容都需要在 PF 中。(將 XX 替換為您希望它執行的任何分鐘)
# 垃圾郵件設置 XX * * * * root /usr/local/sbin/spamd-setup -b
- 在您的電腦上創建垃圾郵件陷阱使用者。我給他一個主目錄以供將來擴展:
$ sudo pw useradd spamtrap -s /sbin/lologin -d /home/spamtrap -m -c "垃圾郵件收集器"
- 創建 /usr/local/scripts/spamtrap:
#!/usr/local/bin/bash # rudimentary checking - more complex checking will be done by # the pfctl and spamdb commands ADDRESS=${1%%[!0-9.]*} if [[ ! ${#ADDRESS} = ${#1} ]] then echo "Invalid characters in IP address" exit 1 fi if [ ! ${ADDRESS} ] then echo "Usage: $0 <address>" exit 1 fi /usr/local/sbin/spamdb -t -a ${ADDRESS} if [ "$?" -ne 0 ] then echo "Failed to add ${ADDRESS} to spamdb" exit 1 fi /sbin/pfctl -qt spamd -T add ${ADDRESS} if [ "$?" -ne 0 ] then echo "Failed to add ${ADDRESS} to pf" exit 1 fi /usr/bin/logger -t spamtrap "Spamtrap caught ${ADDRESS}"
- 在 Postfix 的 /usr/local/etc/postfix/master.cf 中配置一個新的傳輸服務。X 標誌告訴 Postfix 考慮郵件的最終傳遞,以便垃圾郵件發送者獲得成功消息。請注意使用者 - 它需要對腳本的 sudo 訪問權限。
# 垃圾郵件陷阱 spamtrapper unix - nn - - 管道 flags=X user=nobody argv=/usr/local/bin/sudo /usr/local/scripts/spamtrap ${client_address}
- 添加到 sudoers:
沒有人全部= NOPASSWD:/usr/local/scripts/spamtrap
- 創建一個傳輸規則,將發送到 spamtrap@localhost 的所有消息發送到 spamtrapper 服務。有關要編輯的文件,請參見“postconf transport_maps”。預設為 /usr/local/etc/postfix/transport:
spamtrap@localhost 垃圾郵件陷阱
- 重啟後綴。向 spamtrap@localhost 發送幾條消息,並驗證發送客戶端是否已載入到 spamdb 和 <spamd> pf 表中。
$ echo "測試" | 郵件垃圾郵件陷阱@localhost $ 垃圾郵件數據庫 | grep 127.0.0.1 被困|127.0.0.1|1253655172 $ sudo pfctl -qt spamd -T 顯示 127.0.0.1 $
每個被垃圾郵件擷取的電子郵件地址都需要做兩件事。首先,它必須解析為一個實際的郵箱,這樣它才不會在 SMTP 對話期間被拒絕。我使用了別名為 spamtrap@localhost 的虛擬使用者。其次,它需要匹配 Postfix 中的 check_recipient_access 規則並被重定向到 spamtrap@localhost,因此收件人列表中包含的合法使用者永遠不必看到它。我是如何做這部分的:
- 添加到 /usr/local/etc/postfix/main.cf:
virtual_maps = hash:/usr/local/etc/postfix/spamtrap_maps smtpd_recipient_restrictions = check_recipient_access 雜湊:/usr/local/etc/postfix/spamtrap_recipients
- spamtrap_maps 的格式:
spamtrappedaddress@domain.tld 垃圾郵件陷阱
- spamtrap_recipients 的格式:
spamtrappedaddress@domain.tld 重定向 spamtrap@localhost
- 將這些文件添加到您的 Makefile 並進行測試。
此時,所有向您的垃圾郵件陷阱地址發送郵件的客戶端都應添加到 spamdb 和 <spamd>。尚未向 spamd 發送任何內容。要使整個阻塞機制生效,請添加到 /etc/pf.conf 並重新載入 pf:
沒有從 <local-whitelist> 到埠 25 的 rdr proto tcp rdr 將 proto tcp 從 <spamd> 傳遞到埠 25 -> 127.0.0.1 埠 8025
就是這樣。
可能的擴展
- 修改垃圾郵件陷阱腳本以將郵件副本儲存在貝氏垃圾郵件語料庫中是微不足道的。
- 如果您訂閱了任何 RBL rsync 服務,將這些消息的彈跳解除安裝到 spamd 是微不足道的。