2017年12月29日 星期五

透過Postfix 以Gmail發信與 常用指令與設定

# 列出目前在 Mail Queue 中的信件
mailq

# 刪除所有在 Queue 中的郵件
postsuper -d ALL

# 刪除所有正在 deferred 佇列中的郵件 ( 刪除曾經發送失敗的信 )
postsuper -d ALL deferred

=================

relayhost = smtp.gmail.com:587
smtp_sasl_auth_enable = yes
smtp_sasl_password_maps = hash:/usr/local/etc/postfix/gmail_passwd
smtp_sasl_security_options =
smtp_use_tls = yes
====================

smtp.gmail.com:587 帳號@gmail.com:密碼
====
用以下指令製作 hash map:

# postmap /usr/local/etc/postfix/gmail_passwd




======================
1. 申請 Gmail 帳號

這理所當然是第一個程序,還沒有的話趕緊去申請一個吧,已經有了帳號就繼續下一個步驟。

2. 建立 SSL 憑證

為了方便管理,可以建立一個目錄來方便放置憑證,以 DR 為例:

# mkdir /etc/postfix/gmail

# cd /etc/postfix/gmail

然後使用以下指令建立憑證:

# openssl genrsa -out gmail.key 1024

# openssl req -new -key gmail.key -x509 -out gmail.crt

執行第二個指令時會要求填入資料(國家、地區、組織、信箱位址等),按著說明填入即可,這不會影響寄信功能。

3. 建立 Gmail 的密碼認證檔案

# vi /etc/postfix/sasl_passwd

然後寫入以下內容:

gmail-smtp.l.google.com username@gmail.com:password
smtp.gmail.com username@gmail.com:password

上頭的 username 和 password 就是要添入 Gmail 的帳號以及密碼,編輯完並儲存後,再執行下個指令去建立資料庫檔案:

# postmap hash:/etc/postfix/sasl_passwd

另外,由於該檔案裡頭存放了相當重要的帳號密碼資訊,DR 建議修改其存取權限,讓一般使用者無法瀏覽:

# chmod 600 /etc/postfix/sasl_passwd

# chmod 600 /etc/postfix/sasl_passwd.db

4. 設定 Postfix

# vi /etc/postfix/main.cf

寫入以下內容:

relayhost=[smtp.gmail.com]:587

smtp_sasl_auth_enable=yes
smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd
smtp_use_tls = yes
smtp_sasl_security_options = noanonymous
smtp_sasl_tls_security_options = noanonymous
smtp_tks_note_starttls_offer = yes
tls_random_source = dev:/dev/urandom
smtp_tls_scert_verifydepth = 5
smtp_tls_key_file=/etc/postfix/gmail/gmail.key
smtp_tls_cert_file=/etc/postfix/gmail/gmail.crt
smtpd_tls_ask_ccert = yes
smtpd_tls_req_ccert =no
smtp_tls_enforce_peername = no

儲存後重新啟動 Postfix:

# /etc/rc.d/init.d/postfix restart

smtp.gmail.com
Port for TLS/STARTTLS: 587

64.233.187.108

==============

account : ****@gmail.com
password : *****
=============

postfix 2.66

# inbound
smtpd_tls_security_level = may
smtpd_tls_protocols=!SSLv2,!SSLv3
smtpd_tls_mandatory_protocols=!SSLv2,!SSLv3
# outbound
smtp_tls_security_level = may
smtp_tls_protocols=!SSLv2,!SSLv3
smtp_tls_mandatory_protocols=!SSLv2,!SSLv3

smtp[d]_tls_security_level == "may": smtp[d]_tls_protocols is used
smtp[d]_tls_security_level == "encrypt": smtp[d]_tls_mandatory_protocols is used
smtp[d]_tls_security_level == "none": none of these two parameters is used
=============================
smtpd_tls_security_level = may
smtpd_tls_key_file = /etc/pki/tls/private/mail.example.com.key
smtpd_tls_cert_file = /etc/pki/tls/certs/mail.example.com.cert
# smtpd_tls_CAfile = /etc/pki/tls/root.crt
smtpd_tls_loglevel = 1
smtpd_tls_session_cache_timeout = 3600s
smtpd_tls_session_cache_database = btree:/var/lib/postfix/smtpd_tls_cache
tls_random_source = dev:/dev/urandom
tls_random_exchange_name = /var/lib/postfix/prng_exch
smtpd_tls_auth_only = yes
==
在 postfix 2.3 裡 'smtpd_tls_security_level = may' 取代舊有的 'smtpd_use_tls = yes' 並啟用 tls。我們註釋掉 smtpd_tls_CAfile 但在使用已簽署的憑證時卻須要利用該設定來指定發行機構的憑證。'smtpd_tls_loglevel = 1' 會將 tls 的工作階段記錄在 postfix 的郵件日誌(將它設為第 0 級停止記錄 TLS,而第 2 級對偵錯或許會有幫助)。smtpd_tls_session_cache 設定把 TLS 的工作階段金鑰暫存 1 小時,這個建議是出於重複地為每次連線協商 TLS 工作階段金鑰的代價相對昂貴。

最後那個設定,smtpd_tls_auth_only = yes,強迫 SASL 驗證採用 TLS 並禁止純文字驗證發生,除非已經建立了一個 TLS 工作階段。(在測試時註釋掉 smtpd_tls_auth_only = yes 也許會有用,好讓我們能測試 SSL/TLS 能否運作,但當 SSL/TLS 失效時仍有純文字 SASL 驗證作為後備)。
=============================
test
#telnet localhost 25
 Trying ::1...
 Trying 127.0.0.1...
 Connected to localhost.weithenn.org
 Escape character is '^]'.
 220 mail.weithenn.org ESMTP Postfix
 ehlo localhost                             //測試 TLS (此行為自行輸入)
 250-mail.weithenn.org
 250-PIPELINING
 250-SIZE 10240000
 250-VRFY
 250-ETRN
 250-STARTTLS                               //主機顯示 TLS 功能成功
 250-AUTH LOGIN PLAIN DIGEST-MD5 CRAM-MD5
 250-AUTH=LOGIN PLAIN DIGEST-MD5 CRAM-MD5
 250-ENHANCEDSTATUSCODES
 250-8BITMIME
 250 DSN
 starttls    //查詢 TLS 功能是否啟動成功 (此行為自行輸入)
 220 2.0.0 Ready to start TLS               //系統回應 TLS 啟動成功
 quit                                       //離開 (此行為自行輸入)
 quit                                       //離開 (此行為自行輸入)
 Connection closed by foreign host.

沒有留言:

張貼留言