iT邦幫忙

0

POSTFIX 下如何設定多組 content filter ?

看過官網的說明,還是有看沒有懂。 http://www.postfix.org/FILTER\_README.html

我有兩個 content filter 需要過濾,一個是 spamassassin ,一個是 disclaimer ,請問 postfix 下的 master.cf 該怎麼寫好?

分別是 spamassassin :
postfixfilter unix - n n - - pipe flags=Rq user=amavis
argv=/usr/local/sbin/filter.sh -f ${sender} - ${recipient}

disclaimer :
dfilt unix - n n - - pipe flags=Rq user=filter
argv=/etc/postfix/disclaimer -f ${sender} - ${recipient}

2 個回答

18
wonton
iT邦高手 6 級 ‧ 2009-04-27 16:48:07
最佳解答

因為沒有實作過, 所以簡單提出幾個方向, 希望可以幫助你.

首先, 你的 amavis (spamassassin) 應該可以利用 daemon 的方式來與 postfix 結合, 也就是你官方連結中的 advanced 作法, 這樣作的好處是, 你原先的 simple 作法使用 pipe, pipe 是信進來才會去呼叫, 所以比較浪費資源, 倒不如啟用一個 daemon, 可以讓 postfix 固定透過一個 daemon 來作過濾, 會比較省資源.

這個作法網路上應該有很多教學, 我也懶得找了 XD

不過原理大概是在 main.cf 中指定 conten_filter 給 amavis listen 的 port 如 10025, 然後處理完後再交給 postfix 的 10026 port, 可是 postfix 原本並沒有 10026, 所以只好在 master.cf (不是 main.cf) 裡面加上 localhost:10026 那一段, 讓信可以再丟回給 postfix 處理.

這一段有個重點是 content_filter= 設定為空字串, 這讓新的 10026 不再使用 conten filter, 以避免迴圈.

所以對 postfix 而言, 它是透過 main.cf 的 conten_filter 把信丟出去過濾, 透過 master.cf 中的 10026 port 把信接回來, 中間經過了什麼過程都不管, 反正有一個出, 一個進, 一組出入口即可.

所以依照這個原理, 如果有多個 content filter, 而且都可以指定 port 來串接的話, 理論上就沒有問題, 比方把 amavis 的設定本來要將處理過的信丟到 10026 改成丟到 10099, 然後將下一個 content filter 設定 listen 10099, 來接 amavis 丟來的信, 處理完後再丟到 10026 回給 postfix , 這樣一封信通過的 port 就有 25 (postfix) - 10025 (amavis) - 10099 (2nd filter) - 10026 (postfix), 而完成了你的需求.

不過, 看起來你的第二個 filter disclaimer 不太可能作成一個 daemon, 所以只好乖乖用 pipe, 那麼原本在第一個 filter 處理完後的給到 10026 時, 我們在 master.cf 中不是指定 content_filter 參數為空字串嗎, 這時就可以改指定為 dfilt: 看看, 這樣 10026 port 收到信後, 應該就可以再透過 pipe 來跑 disclaimer 了.

至於怎麼讓 postfix 來透過 smtp 跑 pipe 形態的 filter (即你官方連結中的 simple 方式), 重點在 master.cf 下面這個要怎麼改

<pre class="c" name="code">smtp      inet  ...other stuff here, do not change...   smtpd
        -o content_filter=filter:

不知是改成

<pre class="c" name="code">smtp      inet  ...other stuff here, do not change...   smtpd
        -o content_filter=postfixfilter:
        -o content_filter=dfilt:

還是改成

<pre class="c" name="code">smtp      inet  ...other stuff here, do not change...   smtpd
        -o content_filter=postfixfilter:dfilt:

沒有實測實在不知道了.

看更多先前的回應...收起先前的回應...
jessewang iT邦研究生 4 級 ‧ 2009-04-27 17:21:17 檢舉
  1. smtp inet ...other stuff here, do not change... smtpd
  2. -o content_filter=postfixfilter:
  3. -o content_filter=dfilt:

應該是不能寫成這樣,因為我原本這樣作,但只會跑 dfilt 這段,將兩個 filter 串在一起寫我明天來試試看,但是寫錯的話,信全部會塞在 mailq 裡面,動彈不得。

wonton iT邦高手 6 級 ‧ 2009-04-27 17:29:25 檢舉

所以建議不要拿公司的 mail server 玩, 我也因為沒有測試機器, 所以沒實測 orz
希望你測出來後, 可以回個文, 讓我知道一下是 pipe 可行, 還是一定要 daemon 來作 (因為我也想知道到底哪一種方法可行啊....)

jessewang iT邦研究生 4 級 ‧ 2009-04-28 11:06:20 檢舉

剛剛測試發現 -o content_filter=postfixfilter:dfilt 串成這樣寫只會執行第一個 filter ,信件可以正常收發。

第一段的 filter.sh 裡面是執行這段 /usr/bin/spamc -d 127.0.0.1 -f -p 783 -t 30 -e /usr/sbin/sendmail -i "$@",所以我不知道如果用 daemon 的方式 spamassassin 是在哪個 port listening。

jessewang iT邦研究生 4 級 ‧ 2009-04-28 11:11:41 檢舉

http://spamassassin.apache.org/full/3.2.x/doc/spamc.html

正在看這篇,spamc 是在 port 783 listening 然後 -e 那段式執行另一個 command /usr/sbin/sendmail 又將信轉回 mailq。理解中 ~~~~

wonton iT邦高手 6 級 ‧ 2009-04-29 08:25:17 檢舉

幫你 google 了一下, spamassassin 可以透過 amavisd-new 來呼叫, 而 amavisd-new 不但可以改善 spamc/spamd 的效能, 而且可以在 amavisd.conf 裡指定:
$inet_socket_port = 10024; (聽的 port 可更改) 和
$forward_method = 'smtp:[127.0.0.1]:10025'; (傳的 port 一樣可更改.

所以要改成 daemon 方式, 應該要安裝第三方套件像是 amavisd-new 並設定好後, config postfix/master.cf 一個新的 smtp (假設命名為 amavisd-smtp) 和接的 l0025 port, 再 config postfix/main.cf 的 content_filter 指定成新的 amavisd-smtp:[127.0.0.1]:10024 即可.

12
tsongyao
iT邦新手 3 級 ‧ 2009-05-07 12:52:49

spamassassin + disclaimer = 垃圾郵件過濾 + 郵件免責聲明 (這是你們的需求吧? )
為何不試試 mailscanner + spamassassin 然後用 mailscanner的 Sign Clean Messages 做免責聲明呢?
還有mailwatch 可用,功能遠超過 amavisd-new + spamassassin....

jessewang iT邦研究生 4 級 ‧ 2009-05-07 15:32:25 檢舉

感謝,我會參考看看。

我要發表回答

立即登入回答