你必須懂的postfix+amavisd擋廣告順序

就連我都會誤解!
以為只要在postfix的main.cf裡面設定各式各樣的擋廣告方式(包含參考黑名單網站),就可以高枕無憂了,
可是事情並不是我們憨人想得這麼簡單
擋廣告總有順序的.

  1. amavisd 優先
    這部分很重要,有時候很多廣告商,都利用gmail , amazons發送廣告信, amavisd 很容易直接pass, 要解決這問題, 就只能土法煉鋼, 將廣告的網域,email寫到amavisd的黑名單上.
  2. postfix 次要
    若amavisd認定pass , 這邊再怎麼設定都沒用, 因為根本不會跑到這裡來.
    若amavisd沒有認定pass, 也沒認定是廣告(分數不足), 就會跑到這裡來,

我的設定, 就是讓amavisd可以定義黑白名單, 接下來才是設定postfix本身的名單限制
推薦看一下我製作的docker mail server設定
https://github.com/WilliamFromTW/docker-Postfix-AD

簡易筆記-使用docker安裝iredmail

iredmail 是一個很強大的軟件,看文件開發者應該是大陸人,很牛!

我12年前就開始用這個軟件, 而且現在還在用!

雖說免費版不支持微軟的AD, 但很多小公司本來就沒有這些配置, 所以沒差.

目前這系統現在已經很穩定很成熟, 非常很適合小公司使用, 大推薦,

而且最近我才發現一位應該是俄羅斯人有持續提供docker安裝方式. https://hub.docker.com/r/lejmr/iredmail , 又更方便了.

以下是我安裝的心得, 有空會持續更新

1. 用volume的方式與docker建立對應, 方便以後備份升級
2. 與官網建議的不同,我移除灰名單模組,這東西又愛又恨,愛的是擋廣告很猛,恨的是要對方重發信,常常被使用者罵收信很慢.
3. 安裝後, 輸入 https://ip:8443/iredadmin  就可以用postmaster@<網域> 登入, 接下來就可以新增網域,或是使用者.
4. 輸入https://ip:8443/mail , 或是 https://ip:8443/sogo 
   使用者登入@<網域>  就可以收發信了
5. 使用管理者也可以收信, 最初系統自行發送的三封信很重要, 例如要dns設定DKIM之類的
6. 我有將/etc/letsencrypt 對應到iRedMal,打算用來取代自簽的證書
docker volume create iredmail_mysql
docker volume create iredmail_vmail
docker volume create iredmail_clamav
docker volume create iredmail_log
docker volume create iredmail_postfix_conf
docker volume create iredmail_amavisd_conf
docker run -p 8443:443 -p 110:110 -p 25:25 -p 587:587 -p 143:143 -p 993:993 -p 995:995 \
            -h <主機名稱(含網域),hostname.domain> \
            -d --restart always \
            -e "MYSQL_ROOT_PASSWORD=password" \
            -e "SOGO_WORKERS=1" \
            -e "TZ=Asia/Taipei" \
            -e "POSTMASTER_PASSWORD={PLAIN}password" \
            -e "IREDAPD_PLUGINS=['reject_null_sender', 'reject_sender_login_mismatch', 'throttle', 'amavisd_wblist', 'sql_alias_access_policy']" \
            -v iredmail_mysql:/var/lib/mysql \
            -v iredmail_vmail:/var/vmail \
            -v iredmail_clamav:/var/lib/clamav \
            -v iredmail_log:/var/log \
            -v iredmail_postfix_conf:/etc/postfix \
            -v iredmail_amavisd_conf:/etc/amavisd \
            -v /etc/letsencrypt:/etc/letsencrypt \
            -v /etc/letsencrypt/live/<主機網域>/privkey.pem:/etc/ssl/private/iRedMail.key \
            -v /etc/letsencrypt/live/<主機網域>/fullchain.pem:/etc/pki/tls/certs/iRedMail.crt \
            --name=iredmail lejmr/iredmail:mysql-latest

經過試用一個月, 有一個目前無法解決的問題,就是重開docker時,dovecot或mysql會殘留舊的pid,造成dovecot與mysql啟動失敗的狀況, 此時只能手動刪除 /var/run/dovecot/master.pd or /var/lib/mysql/mysql.sock 等檔案, 然後再切換目錄到/services 找出重啟的shell scripts ,才能解決問題

好消息是官方也著手進行iredmail docker官方版 https://hub.docker.com/r/iredmail/mariadb
目前還是beta狀態,不適合正式上戰場,但我很期待 - 2020/05/06

proxmox mail gateway 初體驗

偏安太久, 直到遇上了 節神(節省工具箱)

前一陣子偶花很多時間將 esxi 重心改成proxmox ve, 好不容易告一段落.

但是節神又丟出來 mail gateway 這個怪獸,

原來是 proxmox mail gateway(PMG) 開源了(open-source software license GNU AGPL,v3).

這很不得了!

早在 2007 咖啡偶就開始使用 mail gateway 這個概念來過濾郵件, 過濾後才丟到公司內部郵件伺服器.

偶們公司的 mail gateway 使用 linux + postfix + amavisd-new 的方式,

設定極其複雜,  當時還無法透過套件安裝 , 要自行下載甚至編譯 perl 相關模組, 才能使用,

過了幾年為了能達到公司 SSO(single sign on) 的要求, 還研究好久 , 讓 mail gateway 與公司的網域主控站結合,

慘的是公司網域使用工號登入, 工號與郵件名稱又不一樣, 設定起來夭壽雜亂, 設定好之後就不敢動, 也怕動.

但還有些好處, 新人來的時候, 可以拿這個威風一下,  瀟灑地把秘笈丟過去.

現在裝了proxmox mail gateway 5.2 (pmg) , 真想罵髒話(哎喲, 我是彰化人...) ,  居然可以輕易取代公司目前使用的mg.

這裡記下一些設定上的眉角:

1.  綁定網域主控站( ldap )

但是要注意一些相關屬性, 例如Base DN(確認帳號是否存在), BaseDN for Groups(確認是否有此群組) , Email 存放在哪個屬性

2.1 設定Who Objects, 這將用來查詢帳號是否在ldap 裡面

新增一個who物件, 於這個物件中綁定步驟1的ldap設定 , 並且務必指定 Unknow LDAP address, 代表無此帳號的意思

2.2. 設定aliases, 因為原本mail gateway 並沒有aliases這個機制, 但公司的郵件伺服器有aliases, 這時候可以這樣做

2.3 設定危險內容(exe, java ,或是副檔名是vbs, shs, 偶是額外加上ace這個副檔名)

3. 新增規則

規則號碼越高,越優先執行,rules with higher priority are executed first

以下範例, 請依現況調整優先順序(但是aliases必須要在ldap之前),  

Rule: 100 若符合aliases就通過

Rule: 99  若在ldap搜尋不到該email , 就阻擋 

Rule: 98 若符合危險內容就阻擋

4. 設定Relay Domains

5.

5.設定轉寄到內部郵件伺服器

6.

6. 取消灰名單, 以前的經驗告訴偶, 不要啟用這東西, 因為跟公司往來的客戶或廠商, 並不見得有好的mail server

7. 取消寄發到使用者的報表,別讓使用者覺得困擾

8. 一般來說,初體驗會很high, 但是久了就淡了, 因此可以考慮取消各式各樣的報表 status report , 有空再來看就好了

systemctl stop pmgreport.timer

9. 設定 TLS 讓pmg的網頁, 與郵件傳輸使用TLS加密的方式傳輸

9.1 確認是否有DNS CAA

pmg網站需要設定一個對外ip, 與對應dns名稱, 並確保有Certificate Authority Authorization (CAA)功能, 請參閱這裡

9.2 ssh 登入pmg

9.3 取得憑證

安裝工具以便取得免費的證書 LetsEncrypt

apt-get install certbot

certbot certonly --standalone --preferred-challenges http -d <主機dns名稱>

ps. 成功後會在 /etc/letsencrypt/live/<主機名稱>  找到相關的證書, 需要有fullchain.pem , privkey.pem

9.4. 設定憑證

將 fullchain.pem , privkey.pem 合併成一個pem檔案, 並且取代/etc/pmg/pmg-tls.pem  , /etc/pmg/pmg-apt.pem

新增並修改renew.sh內容如下

vi /etc/pmg/renew.sh

#!/bin/bash

/usr/bin/certbot renew

/bin/cat /etc/letsencrypt/live/<主機dns名稱>/fullchain.pem /etc/letsencrypt/live/<主機dns名稱>/privkey.pem  > /etc/pmg/pmg-tls.pem
/bin/cat /etc/letsencrypt/live/<主機dns名稱>/fullchain.pem /etc/letsencrypt/live/<主機dns名稱>/privkey.pem  > /etc/pmg/pmg-api.pem
/bin/chmod 600 /etc/pmg/pmg-tls.pem
/bin/chmod 640 /etc/pmg/pmg-api.pem
/bin/chown root:root /etc/pmg/pmg-tls.pem
/bin/chown root:www-data /etc/pmg/pmg-api.pem

/bin/systemctl restart pmgproxy

讓renew.sh變成可以執行的屬性 chmod +x /etc/pmg/renew.sh

9.5. 設定排程

我是設定1個月,但理論上3個月執行就可以了

crontab -e

輸入

0 0 1 * * /etc/pmg/renew.sh

9.6 啟用TLS

到pmg網頁, Configuration: Mail Proxo : TLS 勾選啟用

9.7.確認是否啟用startssl ,

請輸入 telnet localhost 25   , 再輸入 ehlo localhost , 即可查詢是否有starttls功能

9.8. 測試是否有加密連線

使用gmail寄信, 觀查 /var/log/mail.log 是否出現 starttls=1 字樣

Apr 16 17:43:24 pmg postfix/smtpd[13252]: disconnect from mail-pg1-f170.google.com[209.85.215.170] ehlo=2 starttls=1 mail=1 rcpt=1 data=1 quit=1 commands=7

10. /etc/postfix/main.cf 加上拒絕反查無主機名稱的郵件伺服器IP

smtpd_sender_restrictions =
...
...
        reject_unknown_reverse_client_hostname

然後重啟postfix ,

systemctl restart postfix

11. 還沒想到

amavisd設定阻擋ace檔案

這檔案非常冷門, 因為winrar 5.70之前版本爆出漏洞, 所以索性就阻擋下來,

修改amvisd.conf檔案

1. 增加

$map_full_type_to_short_type_re = [
[qr/^ACE archive\b/i => 'ace-unwanted'],
]; 

2. 找出$banned_filename_re , 在裡面加上以下兩行

qr'^.(ace-unwanted)$'i,  

[ qr'^application/ace$'i => 0 ],

3. 重啟amavisd

Linux 如何如實轉寄郵件而不會顯示是誰轉寄的

Linux 如何如實轉寄郵件而不會顯示是誰轉寄的, 這有點繞舌 , 意思就是網管攔截到一封疑似廣告信

但是後來判定不是, 需要重新還給使用者, 這時候用網管的角色轉寄, 寄件者將會出現網管的名字, 而不是原本的寄件者.

因此, 需要原封不動的轉寄過去,

請使用這個指令

 
 swaks  -f <網管帳號> -t <收件者帳號>  -d <郵件檔案>

-f 網管帳號 的選項可以不用,這只是藏在檔頭裡面方便以後查驗

安裝方式:

CentOS: yum install swaks
Ubuntu:  apt install swaks