學校作業要自己架設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_aliases
table內容是這樣
+----+-----------+----------------------+-------------------+
| 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