Postfix and ClamAV on FreeBSD

出自文和佑生聯合診所

Postfix 早期的版本,Postfix 必須透過介面程式 (例如 MailScanneramavisd-new 等) 才能與 ClamAV 溝通。 所以在網路上搜尋 "Postfix + ClamAV" 的結果,都會列出要你安裝 MailScanner 或 amavisd-new。 其實在 Postfix 2.3 之後 (目前 stable 版本為 2.8.5),Postfix 支援 Sendmail 8 Milter protocol,不須介面程式,即可直接和 ClamAV 溝通。

設定方法

FreeBSD 環境下,使用 ports 標準安裝 mail/postfixsecurity/clamav 之後, 在 /usr/local/etc/postfix/main.cf 內容加上:

smtpd_milters = unix:/var/run/clamav/clmilter.sock

即可在 Postfix 使用 ClamAV milter。 [1] [2]

比較 Sendmail 的方法

比較一下 Sendmail 的設定方法,若要使用 ClamAV milter 須在 .mc 檔案內加入:

MAIL_FILTER(`clmilter', `S=local:/var/run/clamav/clmilter.sock, F=, T=S:4m;R:4m')dnl
define(`confINPUT_MAIL_FILTERS', `clmilter')dnl

如何測試

如何測試 ClamAV milter 有無作用?寄一封 local 的測試信,內容為純文字: [3]

X5O!P%@AP[4\PZX54(P^)7CC)7}$EICAR-STANDARD-ANTIVIRUS-TEST-FILE!$H+H*

看一下 /var/log/maillog 可看到:

postfix/cleanup[8164]: milter-hold: END-OF-MESSAGE from localhost[127.0.0.1]: milter triggers HOLD action; from=<test1@ms.com.tw> to=<test2@ms.com.tw> proto=ESMTP helo=<ms.com.tw>

丟棄中毒信件

這些被 ClamAV milter 掃出有毒的信件,預設並非真的刪除,而是置入 hold queue。過一段時間,必須去清除這些堆積在 queue 的信件。執行這個指令,可以清除它們:

postsuper -d ALL

若是希望 ClamAV milter 一掃到病毒,就直接丟棄這些信件,請在 /usr/local/etc/clamav-milter.conf 加入以下設定: [4]

# 刪除中毒的信件 (預設 Quarantine --> 改為 Blackhole)
OnInfected Blackhole


  1. 請查詢一下 clmilter.sock 的權限,必要時將 Postfix 加入 group 內。
  2. 其他非 BSD 的 unix 系統,檔案可能在其他位置,例如 /var/run/clamav-milter/clamav.sock/var/run/clamav/clamav-milter 等。
  3. 請從 local 寄測試信。若由其他主機寄信,可能一開始就被這寄信主機攔截,根本收不到這一封測試信。請參考 Anti-Malware Testfile
  4. 修改 clamav-milter.conf 之後,須重新啟動: /usr/local/etc/rc.d/clamav-milter restart