Ubuntu Mail Server(Postfix + Dovecot + MySQL)

林罡北
12 min readJun 4, 2018

--

學校作業要自己架設mail server
以及設定一些安全性設定、防止垃圾郵件等等的設定
紀錄一下找到的資訊跟要注意的地方

OS:Ubuntu 16.04 LTS

相關專有名詞解釋

DNS Setting

檢查DNS設否有設定成功

Postfix + Dovecot + MySQL

Postfix負責SMTP/SMTPs/SMTP TLS or SASL
Dovecot負責POP3/POP3s & IAMP/IAMPs
MySQL負責管理有哪些mail user & domain

下面這3個我比較推薦中文的,有解釋原因以及為什麼要這麼做

MySQL Command

https://gist.github.com/hofmannsven/9164408

User aliases with regex

舉例來說,原本我的virtual_aliasestable內容是這樣

+----+-----------+----------------------+-------------------+
| id | domain_id | source | destination |
+----+-----------+----------------------+-------------------+
| 1 | 1 | alias1@example.com | user1@example.com |
+----+-----------+----------------------+-------------------+

多加入一筆Regex的email address,變成

+----+-----------+----------------------+-------------------+
| id | domain_id | source | destination |
+----+-----------+----------------------+-------------------+
| 1 | 1 | alias1@example.com | user1@example.com |
| 2 | 1 | .*demo.*@example.com | user1@example.com |
+----+-----------+----------------------+-------------------+

.*demo.*的意思是 demo前後可以有任意長度的任意符號

原本的/etc/postfix/mysql-virtual-alias-maps.cf

user = (mail_username)
password = (mail_password)
hosts = 127.0.0.1
dbname = mailserver
query = SELECT destination FROM virtual_aliases WHERE source='%s'

query的部分改成

user = (mail_username)
password = (mail_password)
hosts = 127.0.0.1
dbname = mailserver
query = SELECT destination FROM virtual_aliases WHERE '%s' REGEXP CONCAT('^',source,'$')

這樣改的意思是找出source的mail address,然後進行Regex比對,比對成功的就把信件轉寄給destination的email

舉例來說,寄給123demo456@example.com就會轉寄給user1@example.com

虛擬機外寄

如果你把mail server架在虛擬機上的話,你要用自己的mail server寄收件人非自己domain的email的話,可能會寄不出去

舉例來說,我用我自己user1@example.com寄信給receiver@gmail.com
在postfix的log file - /var/log/mail.log裡面,可能會看到類似下面的error

NOQUEUE: reject: RCPT from unknown[10.0.2.2]: 454 4.7.1 <receiver@gmail.com>: Relay access denied; from=<user1@example.com> to=<receiver@gmail.com> proto=ESMTP helo=<[IPv6:::ffff:your_ip]>

意思是說,你寄信電腦的ip位置是10.0.2.2,這個ip位置寄來的信,postfix在設定檔找不到這個ip的資料,不知道你是誰,所以拒絕轉寄(Relay access denied),不然網路上隨便哪個人只要知道你的ip,就可以靠你的mail server來隨便轉發信件了

解法是在/etc/postfix/main.cf 檔案中的

mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128

加上剛剛的你寄信電腦的ip跟逗號

mynetworks = 127.0.0.0/8 [::ffff:127.0.0.0]/104 [::1]/128, 10.0.2.2

最後重啟postfix

service postfix restart

這樣就可以寄信給非自己domain的收件人了

SSL設定

※重要

/etc/postfix/mysql-virtual-alias-maps.cf

/etc/dovecot/conf.d/10-ssl.conf 檔案中的.pem檔案路徑

ssl_cert = </etc/dovecot/dovecot.pem
ssl_key = </etc/dovecot/private/dovecot.pem

/etc/postfix/main.cf 檔案中的

smtpd_tls_cert_file = </etc/dovecot/dovecot.pem
smtpd_tls_key_file = </etc/dovecot/private/dovecot.pem

.pem檔案的路徑要一樣

產生證書的指令:

2個指令只差在申請好的證書放在哪個資料夾,一般來說是下面這2種路徑比較多人用

sudo openssl req -new -x509 -days 1000 -nodes -out "/etc/dovecot/dovecot.pem" -keyout "/etc/dovecot/private/dovecot.pem"
sudo openssl req -new -x509 -days 1000 -nodes -out "/etc/ssl/certs/dovecot.pem" -keyout "/etc/ssl/private/dovecot.pem"

其他安全性設定

SPF

Testing

都安裝好就要測試一下是否正常了

POP3/POP3s

SMTP/IMAP/POP3…

SPF

DKIM

TLS

Email安全性評分

Reference

postfix / dovecot有報錯,可以看這篇

用docker打包好的mail server

User aliases with regex

--

--

林罡北
林罡北

Written by 林罡北

Founder of TroublesLab, F2E & Web/App Developer

No responses yet