在CubieTruck下解決 Postfix SSL 無法寄信問題

最近在這台 CubieTruck (Ubuntu 14.04 LTS)上架了收發信的套件 Postfix / Dovecot,並到 StartSSL 申請免費的憑證用 SSL 協議,用 Outlook 收信件沒有太大問題,但是寄信大部分時間都寄不出去(只有幾次可以勉強寄出去,但是要試過很多次才行)。查看 syslog 都會看到一大堆問題。

postfix/smtpd[xxx]: disconnect from some ip address
postfix/smtpd[xxx]: connect from some ip address
postfix/smtpd[xxx]: disconnect from some ip address
postfix/smtpd[xxx]: connect from some ip address
...
...

似乎是連線出現問題,斷了!可是我直接用 telnet 連結到 smtps port 卻都沒有發生問題,也把防火牆,防毒軟體關閉了也沒有用,只能請教 Google 大神了,才發現這方面的問題好像大家都碰到不少,但缺乏一個解決方案,經過我多次測試來,似乎解決了問題。

先到 postfix 配置目錄下編輯 /etc/postfix/master.cf 檔案

# nano /etc/postfix/master.cf

然後找到

#    -o smtpd_tls_wrappermode=yes

找到這行,把 ‘#‘移除掉,然後重啟 postfix 服務。

# service postfix restart

現在用 Microsoft Outlook 寄信似乎順暢多了,沒有問題再發生了。

幫 Dovecot 手動加上 Logrotate

安裝了收信套件 dovecot,記錄檔案在 /var/log/dovecot.log,但卻發現這個記錄檔案異常的大,原來 LogRotate 沒有把這個檔案做處理,所以任由它增大下去,所以只好手動幫 dovecot 寫一個 Logrotate 的腳本。

先到 /etc/logrotate.d 目錄底下

# cd /etc/logrotate.d
# touch dovecot
# nano dovecot

然後編輯這個檔案,寫上

/var/log/dovecot*.log {
  weekly
  missingok
  copytruncate
  rotate 7
  compress
  notifempty
  sharedscripts
  postrotate
  if [ -f /var/run/dovecot/master.pid ]; then \
    /etc/init.d/dovecot reload > /dev/null 2>&1 || true ; \
  fi;
  endscript
}

存檔,這樣系統就可以自動每週幫 /var/log/dovecot.log Logrotate 一次了。如果要測試一次,可以手動讓 logrotate 執行一次

# logrotate -vf /etc/logrotate.conf

這樣就可以知道這個腳本是否有正確運行。

如何防範 SMTP 暴力式攻擊

暴力式攻擊是泛指使用常用字眼攻擊某些協議的通訊埠,進而嘗試取得密碼。這種攻擊十分討厭,既無技術可而,但安全上卻是個問題,而且系統還要耗掉一些效能來應付,所以這一篇我們講講如何使用 iptables 來防範 SMTP 的暴力式攻擊。

一個正常的 SMTP 的通訊內容大約是這樣的

# telnet mail.example.org 25
Trying 1.2.3.4...
Connected to mail.example.org.
Escape character is '^]'.
220 mail.example.org ESMTP
EHLO brute.attack.com
250-mail.example.org
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-STARTTLS
250-AUTH PLAIN LOGIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
AUTH LOGIN
334 VXNlcm5hbWU6
dXNlcm5hbWUuY29t
334 UGFzc3dvcmQ6
bXlwYXNzd29yZA==
535 5.7.8 Error: authentication failed:

所以密碼錯誤驗證失敗最後面一定會有個錯誤碼 535 5.7.8,這次我們利用這個字串來告訴 iptables 如果某 IP 在 180 秒內連續三次出現這個字眼就把封包給攔截,這樣就達到防堵 SMTP 暴力式攻擊了。

# iptables -I OUTPUT -p tcp --sport 25 -m string --to 90 --string "535 5.7.8 Error: authentication failed:" --algo bm -m recent --rdest --name SMTP_AUTH_ERROR --set
# iptables -I OUTPUT -m recent --name SMTP_AUTH_ERROR --rdest --rcheck --seconds 180 --hitcount 3 -j DROP

這樣 iptables 就會根據這個字串來封鎖一些惡意攻擊 SMTP 的 IP 地址。

如何在CubieTruck架設 Dovecot 收信伺服器

之前寫了利用 Postfix 來當SMTP郵件伺服器的文章,後來才發現相對應的 POP3 收信的 Dovecot 沒有寫進來,所以趁著空檔,把這篇文章補齊。對了,各位讀者,本網站所介紹的文章,真的是在這台小小的 CubieTruck 所架設的。其實我也很關心 Cubieboard 8 A80的進展,價錢不是問題,畢竟是八核心 64位元 ARM CPU,但如果沒有 SATA 介面,那對不起,我一點都不會考慮的。我買來是要來練習架站的,而不是訓練我的 Android,我 Android 手機至少有 10 隻以上了,一點都不需要。

按照慣例,我們還是先安裝套件:

# apt-get install dovecot-imapd dovecot-pop3d

安裝好了之後,設定檔案目錄就在 /etc/dovecot 底下,我們要先在這個目錄底下先修改 dovecot.conf 這個檔案。其實新的 Dovecot 套件也很進步了,基本上是不用動到這個檔案,而是去 /etc/dovecot/conf.d 去分門別類修改的檔案內容。

# nano /etc/dovecot/dovecot.conf

找到下述幾行,把它修改一下

ssl = yes -> 如果不要 pop3s加密,則改為 no
disable_plaintext_auth = no ->需要認證才能登入
protocols = imap pop3 ->支持 imap 和pop3協議,不需要填入 pop3s和imaps,因為ssl會自動判斷

然後設定去哪裡收信,這裡要配合 Postfix的設定,不然寄信寄到一個地方,收信又是另一個地方,那當然會收不到信件。

# nano /etc/dovecot/conf.d/10-mail.conf

然後找到這一行 mail_location ,然後把它修改成

mail_location = maildir:~/Maildir

其實這行是配合 Postfix 在 /etc/postfix/main.cf 底下這行設定,寄到哪裡去,就去哪裡收信。

home_mailbox = Maildir/

然後打開 SSL 選項,如果不需要加密設定,請略過此步驟。

# nano /etc/dovecot/conf.d/10-ssl.conf

找到 ssl 這行,把 no 改成 yes

ssl = yes

並且把自己的私鑰和公鑰指向檔案的路徑

ssl_key = </etc/ssl/private/private.key ->私鑰,可以去 StartSSL 申請一個免費的,自己簽署的,Outlook不認,更別提Android。
ssl_cert = </etc/ssl/certs/domain.crt ->公鑰,可以去 StartSSL 申請一個免費的,自己簽署的,Outlook不認,更別提Android。

關於StartSSL申請證書,可以參考這篇文章。因為 Dovecot 十分難偵錯,一旦錯了,服務起不來,但沒有任何錯誤訊息,所以建議把自己的 log 打開,方便之後除錯使用。

# nano /etc/dovecot/conf.d/10-logging.conf

找到 log_path 那行,把它改為

log_path = /var/log/dovecot.log

之後就可以到 /var/log/dovecot.log 去看訊息,而不必去 /var/log/syslog 去看一堆 log 淘出 dovecot 的訊息了。

到這裡,就可以重新啟動 Dovecot 服務,然後就可以使用 Outlook 收信了。

# service dovecot restart

想要看到 Dovecot 整個設定值,可以使用下面命令。

# dovecot -n

收信的 Port 是 110(pop3),和995(加密的pop3),143(非加密imap),993(加密的imap)。所以有開啟防火牆的使用者請都把這些 Port 打開吧!

# ufw allow 110 <- 一般收信協議 POP3
# ufw allow 143 <- 一般的 IMAP協議
# ufw allow 995 <- 加密的POP3S協議
# ufw allow 993 <- 加密的IMAPS協議

因為 Dovecot 不太好偵錯,所以我把一些 Outlook 碰到的問題訊息以及解決辦法列出來。

錯誤訊息

Plaintext authentication disallowed on non-secure (SSL/TLS) connections.

修正方式:

# nano /etc/dovecot/conf.d/10-auth.conf

設定值

disable-plaintext_auth = no

重啟服務

# service dovecot restart

錯誤訊息

dovecot: pop3(hostname): Error: user whoever: Initialization failed: mail_location not set and autodetection failed: Mail storage autodetection failed with home=/home/whoever

修正方式:

# nano /etc/dovecot/conf.d/10-mail.conf

設定值

mail_location = mbox:~/mail:INBOX=/var/mail/%u

重啟服務

# service dovecot restart

錯誤訊息

dovecot: pop3(hostname): Error: chown(/home/whoever/mail/.imap/INBOX, -1, 12(mail)) failed: Operation not permitted (egid=500(whoever), group based on /var/mail/whoever)
dovecot: pop3(hostname): Error: mkdir(/home/whoever/mail/.imap/INBOX) failed: Operation not permitted
dovecot: pop3(hostname): Error: Couldn’t open INBOX: Internal error occurred. Refer to server log for more information.
dovecot: pop3(hostname): Couldn’t open INBOX top=0/0, retr=0/0, del=0/0, size=0

修正方式:

# nano /etc/dovecot/conf.d/10-mail.conf

設定值

mail_privileged_group = mail

重啟服務

# service dovecot restart

測試是否有重啟成功,可以使用 telnet 連到 110(pop3),995(加密的pop3),我以 110 為例

# telnet localhost 110
Trying 127.0.0.1...
Connected to localhost.
Escape character is '^]'.
+OK Dovecot (Ubuntu) ready.

這樣就代表 Dovecot 在 Port 110 有成功建立起來,可以也試試看 995或是其他 Port看是否 Dovecot 某個服務是否正常運作。

在CubieTruck上架設網頁郵件伺服器 RoundCube

出差在外常常要收信,但偏偏有些地區就是會擋25/110 Port讓你收不到信,又或者像中國擋整個谷歌服務,這時候怎麼辦呢?再怎麼擋,也不可能擋 HTTP 80 Port,畢竟這是最基本的上網需求啊,所以 WebMail 就有他存在的必要了。所以這一講我來說說如何安裝 RoundCube,一個基於網頁形式的收發信件軟體。

注意,RoundCube 必須 Apache2/PHP5/MySQL 等架站軟體設定好方能正常運作。如果您不會架設上述伺服器,請參考這篇文章

首先必須到 RoundCube 官方網站,http://roundcube.net/,然後按 Download 按鈕下載檔案,截至目前為止最新的檔案版本是 1.0.2。然後把檔案檔案 roundcubemail-1.0.2.tar.gz 拷貝回去 CubieTruck主機,把檔案解壓縮。更改權限後,最後把檔案目錄搬到網頁入口目錄 /var/www底下。

# tar zxvf roundcubemail-1.0.2.tar.gz
# mv roundcubemail-1.0.2 roundcube
# chown -R www-data:www-data roundcube
# mv roundcube /var/www

然後就要建立資料庫 mysql 相關設定

#mysql -u root -p

輸入 root 的帳號密碼之後,在 mysql 主控台中建立資料庫,設定權限。

mysql> create database roundcubedb;
Query OK, 1 row affected (0.00 sec)

mysql> grant all privileges on roundcubedb.* to 'userName'@localhost identified by 'PassWord';
Query OK, 0 rows affected (0.00 sec)

mysql> flush privileges;
Query OK, 0 rows affected (0.00 sec)

mysql> exit
Bye

其中使用者名稱和密碼自己設定好,也要記住,因為之後設定會用到。然後切換到 /var/www/roundcube/SQL 目錄下,把起始話的資料庫給匯進來。

# cd /var/www/roundcube/SQL
# mysql -u root -p roundcubedb < /var/www/roundcube/SQL/mysql.initial.sql

輸入 root 的密碼就可以把資料給匯進來了。接著就到利用瀏覽器到網頁下去做設定,設定的網頁在 http://你的網址/roundcube/installer,畫面如下:

1

所以整個安裝分為三個步驟,第一檢查環境變數,第二建立設定檔,最後是測試設定檔。所以第一步驟先檢驗一下看哪裡有問題,大部分都是OK,少部分是 NOT AVAILABLE(不可得),這可以忽略,按網頁最下方的 “NEXT“按鈕。

出現一個新網頁,然後在 Database Setup 這個欄位填入你剛剛建立的資料庫名稱”roundcubedb“,和帳號以及密碼

2

然後在 IMAP Settings欄位下填入 ssl://imap.gmail.com,Port 993 和你的 gmail 帳號

3

再來在 SMTP Settings 頁面下填入,ssl://smtp.gmail.com,Port 465,以及你的 gmail 帳號以及密碼。好了在此網頁最下面點擊 “CREATE CONFIG“按鈕。

然後會出現這個畫面,按 “CONTINUE”按鈕繼續,然後就可以測試寄信和收信功能了。一般來說,GMAIL這樣設定不會有錯,我在這裡也不一一介紹了。

5

之後你就可以利用 http://你的網址/roundcube 登入你 gmail 的帳號,第一次會比較耗時一點,等一下你就可以透過網頁 roundcube 存取你的 gamil 的信件了。

如果成功之後,記得要把 installer 目錄移除掉。

# rm -rf /var/www/roundcube/installer

後記:本來是要用來存取 Postfix/Dovecot的本機端郵件,但是Postfix/Dovecot 我採用 PAM 認證,而 RoundCube登入時因為帳號含有 @xxx.org 字樣,所以導致系統認證失敗,測試多次無效,才轉用 gmail。

如何在Root Android手機安裝StartSSL/StartCom憑證

我自己在CubieTruck架好了郵件伺服器,但總覺得常年在外使用免費的網路,帳號密碼以明碼傳送可能不安全,所以在CubieTruck加設了 POP3S(995)/SMTP TTLS(465)。我用的是 StartSSL 免費的憑證,在自己的電腦上 Outlook沒有問題,可以正常透過加密方式來收發信。但是Android手機就碰到問題了,一直說Java不認的StartSSL憑證,這也難怪,因為 StartSSL 是免費的,所以是可能有問題的。

所以我在網路上找了個方法,把StartSSL憑證手動給安裝進去(一般方法要設定解屏圖形密碼,但不需要Root),我的手機是Root的,所以可以採用這個方法,因為我討厭每次使用手機要滑來滑去!

首先我們必須先下載 StartSSL Class 1 的官方憑證,sub.class1.server.ca.pem

下載位址

然後把這個 sub.class1.server.ca.pem 檔案上傳拷貝到 CubieTruck 上去更改 Hash 檔名,然後在CubieTruck 終端機裡面輸入

# openssl x509 -in sub.class1.server.ca.pem -subject_hash_old -noout

之後 openssl 會告訴你 sub.class1.server.ca.pem 的 hash 檔名是 ea59305e,然後在把檔案更名為

# mv sub.class1.server.ca.pem ea59305e.0

然後在把 ea59305e.0 檔案拷貝到自己電腦裡面,好讓待會 adb 連線時可以上傳這個檔案,此外我們必須知道 Android 的憑證都放在 /etc/security/cacerts 目錄底下(我的手機是Android 4.0以上,2.2/2.3我並不確定),但是這個目錄是唯讀的,這才所以需要 root 手機來重新掛載檔案系統。所以你先在電腦裡面使用 adb 上傳檔案(ea59305e.0)並且連結到已經 root 手機上。

C:\adb> adb push ea59305e.0 /sdcard/temp -->假定 /sdcard/temp 是暫存空間
C:\adb> adb shell -> 用 adb 連結到 android 手機內

然後在把剛剛在 CubieTruck 處理過的檔案 ea59305e.0 拷貝到手機憑證目錄裡面  /etc/security/cacerts

# su
# mount -o remount,rw /system
# cd /etc/security/cacerts
# cp /sdcard/temp/ea59305e.0 /etc/security/cacerts
# chown root:root /etc/security/cacerts/ea59305e.0
# chmod 644 /etc/security/cacerts/ea59305e.0
# sync
# mount -o remount,ro /system

再用 Android 手機內的設定->安全性->信任憑證,是不是多了一個 StartCom Class 1 Primary Intermediate Server CA的憑證了呢?

後記:現成的憑證,省的自己去下載轉檔 載點,我試過4.1/4.2/4.3都可以行得通,測試條件是用AquaMail收POP3S和SMTPS over TLS,沒有再出現錯誤訊息,且收發信正常。

在 CubieTruck Ubuntu 14.04 下安裝 Postfix 郵件伺服器

突然想到要在這台 CubieTruck 上安裝郵件伺服器,如果在早先年,唯一的選擇就是 sendmail。sendmail.cf的配置檔基本上看起來就是天書,由一些亂七八糟的符號$%@#之類組合成的,而Postfix 相對起來就親善多了。所以這篇文章我們來談談如何安裝 Postfix 以及一些注意事項,必須先了解的是,目前Ubuntu的版本已經來到了14.04,所以其他版本的 Ubuntu 可能會有所差異(可能還滿大的)。

當然首先就是安裝套件囉,

apt-get update
apt-get upgrade
apt-get install postfix

大約三到五分鐘整個套件就安裝好了,現在安裝這部份 Linux 搞的越來越像 Windows了,不像以前劈頭就是 make install,多難啊。接下來就是準備你的域名(domain name)了,我就以 example.com 為例好了。先選擇 “Internet Site”,然後按下 TAB鍵選擇OK。

1

然後幫自己的 mail server 取個別名,例如:cubietruck,然後按下 TAB鍵選擇OK。

2

輸入 root 當做收信者,然後按下 TAB鍵選擇OK。

3

輸入可以以接受信件的位址,然後按下 TAB鍵選擇OK。

4

後面都是按下 OK就可以了,所以就不一一貼圖上來了。重點是你的 Domain Name要輸入對,例如:mail.dennysu.com之類的。這個網址必須是你的ISP提供,像我是到 GoDaddy 去買網域,附贈10 subdomain(有點想要轉到Google Domain了),還有這個網域後面如果要有 SSL 加密的話,你還得去 StartSSL 去申請私鑰和公鑰進行加密。

Postfix 的配置檔案都在 /etc/postfix 目錄底下,裡面有兩個比較重要的檔案 /etc/postfix/main.cf 和 /etc/postfix/master.cf。先講講 main.cf 好了,要注意的欄位有

郵件的暫存位址,例如 /home/dennysu/Maildir

home_mailbox = Maildir/

金鑰的位址 smtpd_tls_cert 是公鑰,smtpd_tls_key是私鑰,如果是從 StartSSL下載下來則必須用 openssl 再加密一次

smtpd_tls_cert_file=/etc/ssl/certs/mail.dennysu.com.crt
smtpd_tls_key_file=/etc/ssl/private/mail.dennysu.com.key

網域名稱,注意,沒有 mail

myhostname = dennysu.com

別名檔案

alias_maps = hash:/etc/postfix/aliases
alias_database = hash:/etc/postfix/aliases

而 /etc/postfix/aliases檔案內容以下面為例,說明了寄給 root 的信件轉為 linaro 收信,之後必須採用 postalias hash://etc/postfix/aliases  建立資料庫

root: linaro
#postalias hash:/etc/postfix/aliases

 

為了避免有人試探密碼攻擊,我們可以在 /etc/postfix/main.cf 檔案內新增

smtpd_error_sleep_time = 1s
smtpd_soft_error_limit = 10
smtpd_hard_error_limit = 20

避免每封信件太大,例如每封信不得超過20MB,每人信箱總量不得超過400MB,我們可以新增

message_size_limit = 20480000
mailbox_size_limit = 400000000

限制每封信的收信人不得超過10個人,一般自己家用的郵件伺服器應該不會這樣。

smtpd_recipient_limit = 10

限制收信行程 postfix 不得超過5個行程,避免吃掉太多記憶體和效能。

default_process_limit = 5

另外新增黑名單的位址

maps_rbl_domains = relays.ordb.org, opm.blitzed.org

上述的 relays.ordb.org, opm.blitzed.org 機構可以自己Google一下。

另外設置 disable_vrfy_command 為yes可避免外界使用vrfy命令來探測收信位置的有效性(防止垃圾郵件),以及防止別人用vrfy命令去測試你的本機郵件用戶是否存在。

disable_vrfy_command = yes

避免有心人士沒有用 ehlo 命令跳過檢查

smtpd_helo_required = yes

設定 Postfix 使用 SASL 認証

smtpd_sasl_auth_enable = yes

設定 SASL 支援非標準 E-mail Client 的認証動作

broken_sasl_auth_clients = yes
mtpd_sasl_authenticated_header = yes

不使用 ANONYMOUS 這個認証

smtpd_sasl_security_options = noanonymous

再來是收信客戶端的限制檢查細節

smtpd_client_restrictions = check_client_access hash:/etc/postfix/access
reject_rbl_client bl.spamcop.net

其中 /etc/postfix/access 是告知 Postfix 哪些域名是可以接收的,哪些是拒絕的。一般 /etc/postfix/access內容如下

.example.ok OK
.av.com REJECT

OK代表可以寄送,REJECT代表拒絕。編輯完後必須採用 postmap 轉換成 .db 資料庫型態

#postmap hash:/etc/postfix/access

再來就是收信人和信件主體的限制,細節請上網查詢。允許和拒絕與設定先後順序有關,請小心設定,最好先拒絕再允許

smtpd_recipient_restrictions =
reject_unauth_destination, ←拒絕「收件人」不在Postfix 所轄的網域(由$mydestination定義),此選項避免你的伺服器變成一部開放式轉信站,讓別人利用你的mail server 亂發信
reject_non_fqdn_sender, ←拒絕「寄信人」沒有 FQDN
reject_non_fqdn_recipient, ←拒絕「收信人」沒有 FQDN
reject_unknown_sender_domain, ←拒絕「寄信人」網域不存在
reject_unknown_recipient_domain , ←拒絕「收件人」網域不存在
reject_invalid_hostname, ←拒絕「寄信人」「收信人」FQDN 不合網域名稱規則
permit_mynetworks, ←允許來自 $mynetworks 的「寄信人」
permit_sasl_authenticated, ←允許經本機 SASL 驗證過的「寄信人」
reject_rbl_client bl.spamcop.net, ←線上的黑名單資料庫,可自行定義
reject_rbl_client dnsbl.njabl.org, ←線上的黑名單資料庫,可自行定義
reject_rbl_client xbl.spamhaus.org ←線上的黑名單資料庫,可自行定義

smtpd_data_restrictions =
reject_unauth_pipelining,← 拒絕寄件人email是null但卻有多個收件人的信和只能設定在smtpd_data_restrictions 或是smtpd_end_of_data_restrictions裏面
reject_multi_recipient_bounce ←阻止那些進行大量郵寄的軟件濫用流水線來加快發送電子郵件

另外Postfix 用戶端判別規則檢查順序如下: 

  1. smtpd_client_restrictions
  2. smtpd_helo_restrictions
  3. smtpd_sender_restrictions
  4. smtpd_recipient_restrictions
  5. smtpd_data_restrictions
  6. header_checks
  7. body_checks

這大約就是 main.cf 的主要內容了。然後到 /etc/postfix/master.cf 裡面把

#smtp inet n - - - - smtpd

前面的 # 拿掉,這樣 SMTP就可以運作了。如果要加密的話就把

#smtps inet n - - - - smtpd

前面的 # 拿掉,這樣加密的 SMTP就可以運作了。如果要順便把 465 加密的 Port打開,就把

#submission inet n - - - - smtpd

前面的 # 拿掉,這樣465 Port就可以運作了(如果有開防火牆 ufw,記得要 ufw allow 465打開),Outlook就可以寄送加密的郵件了。

讓/etc/postfix/master.cf 看起來像是

smtp inet n - - - - smtpd
smtps inet n - - - - smtpd
submission inet n - - - - smtpd

然後編輯 /etc/postfix/aliases 檔案內容

dennysu: dennysu
root: dennysu

這樣以後寄給 root 的信件就會寄給 dennysu,以此類推。之後必須採用 postalias /etc/postfix/aliases把這個檔案轉換成 .db檔案

postalias /etc/postfix/aliases

然後編輯 virtual檔案內容

dennysu@mail.dennysu.com dennysu

這樣就明確指出來以後寄給 dennysu@mail.dennysu.com的 SALS認證會以 dennysu 帳號認證。然後用 postmap 把這個檔案轉換成 .db檔案。

postmap /etc/postfix/virutal

這樣設定完,重起服務就可以採用 Outlook 開始寄信囉。

service postfix restart

CubieTruck 郵件伺服器Postfix的一些雜項設定

Postfix是Linux裡面一項著名的SMTP寄信套件(POP3/IMAP是 dovecot,不要搞混了),一般安裝完套件就可以使用了。主要設定檔案在 /etc/postfix/main.cf 裡面。基本上預設值是夠用了,但是為了避免被 relay 而列入黑名單,我另外找了一些參數來增強它。

首先必須熟悉以下指令,方便控制 Postfix 正常運作

  1. service postfix reload –>重新載入 postfix 參數,更改任何相關參數都必須下這個指令來生效。
  2. postfix check –>檢查是否有錯誤發生,沒有顯示任何資訊就代表沒有錯誤。
  3. postconf –> 列出目前生效的參數,可以配合 grep 來找出自己想要知道的參數。

首先,為了避免有人試探密碼攻擊,我們可以在 /etc/postfix/main.cf 檔案內新增

  • smtpd_error_sleep_time = 1s
  • smtpd_soft_error_limit = 10
  • smtpd_hard_error_limit = 20

避免每封信件太大,例如每封信不得超過20MB,每人信箱總量不得超過400MB,我們可以新增

  • message_size_limit = 20480000
  • mailbox_size_limit = 400000000

限制每封信的收信人不得超過10個人,一般自己家用的郵件伺服器應該不會這樣。

  • smtpd_recipient_limit = 10

限制收信行程 postfix 不得超過5個行程,避免吃掉太多記憶體和效能。

  • default_process_limit = 5

另外新增黑名單的位址

  • maps_rbl_domains = relays.ordb.org, opm.blitzed.org

上述的 relays.ordb.org, opm.blitzed.org 機構可以自己Google一下。

另外設置 disable_vrfy_command 為yes可避免外界使用vrfy命令來探測收信位置的有效性(防止垃圾郵件),以及防止別人用vrfy命令去測試你的本機郵件用戶是否存在。

  • disable_vrfy_command = yes

避免有心人士沒有用 ehlo 命令跳過檢查

  • smtpd_helo_required = yes

再來就是收信人和信件主體的限制,細節請上網查詢。允許和拒絕與設定先後順序有關,請小心設定,最好先拒絕再允許

smtpd_recipient_restrictions =
reject_unauth_destination, ←拒絕「收件人」不在Postfix 所轄的網域(由$mydestination定義),此選項避免你的伺服器變成一部開放式轉信站,讓別人利用你的mail server 亂發信
reject_non_fqdn_sender, ←拒絕「寄信人」沒有 FQDN
reject_non_fqdn_recipient, ←拒絕「收信人」沒有 FQDN
reject_unknown_sender_domain, ←拒絕「寄信人」網域不存在
reject_unknown_recipient_domain , ←拒絕「收件人」網域不存在
reject_invalid_hostname, ←拒絕「寄信人」「收信人」FQDN 不合網域名稱規則
permit_mynetworks, ←允許來自 $mynetworks 的「寄信人」
permit_sasl_authenticated, ←允許經本機 SASL 驗證過的「寄信人」
reject_rbl_client bl.spamcop.net, ←線上的黑名單資料庫,可自行定義
reject_rbl_client dnsbl.njabl.org, ←線上的黑名單資料庫,可自行定義
reject_rbl_client xbl.spamhaus.org ←線上的黑名單資料庫,可自行定義

smtpd_data_restrictions =
reject_unauth_pipelining,← 拒絕寄件人email是null但卻有多個收件人的信和只能設定在smtpd_data_restrictions 或是smtpd_end_of_data_restrictions裏面
reject_multi_recipient_bounce ←阻止那些進行大量郵寄的軟件濫用流水線來加快發送電子郵件

另外Postfix 用戶端判別規則檢查順序如下: 

  1. smtpd_client_restrictions
  2. smtpd_helo_restrictions
  3. smtpd_sender_restrictions
  4. smtpd_recipient_restrictions
  5. smtpd_data_restrictions
  6. header_checks
  7. body_checks

記住,所有設定更改完必須重啟服務才能生效

service postfix restart

 

如何在CubieTruck郵件伺服器內,一個帳號收取多個郵件信箱

目前利用 Postfix + Dovecot 架設 mail server 十分方便,不像十幾年之前 sendmail 裡面的 sendmail.cf 無字天書一般。這一講我們說說,在CubieTruck裡面一個帳號,如何收到多個郵件信箱(同一個網域)的做法。

例如:你的CubieTruck裡面有 administrator這個帳號,CubieTruck的網域是 example.org,所以預設的信箱是 administrator@example.org,但是你希望 root@example.org 也寄到 administrator帳號裡面的話,那麼可以修改 /etc/postfix/aliases 這個檔案

#nano /etc/postfix/aliases

administrator: administrator
root: administrator

修改完之後要使用 postalias 指令建立 .db 檔案

postalias /etc/post/aliases

然後重新啟動 postfix 服務即可

service postfix reload

這樣寄到 root@example.org 的信件也可以透過 administrator@example.org收到了。

如何知道自己CubieTruck的郵件伺服器被列入黑名單

很多自己架設的郵件伺服器往往因為設定不佳,被有心人士當作跳板轉寄大量垃圾廣告信件,而被列入黑名單。這篇文章不是告訴你如何避免列入黑名單,這必須靠自己設定mail server來避免。這裡只是提供兩個網站來查看自己的網站是否已經被列入黑名單。至於如果已經被列入,老實說,我也不知道怎麼移除。