在CentOS / RHEL上的2個Postfix SMTP服務器之間設置SMTP中繼
先前我們討論了使用mailjet設置Postfix SMTP中繼,當您必須使用商業SMTP中繼服務時,這很有用。 本教程將向您展示如何在CentOS / RHEL上的2個Postfix SMTP服務器之間設置SMTP中繼。
用例
假設有兩個服務器:服務器A和服務器B。
- 您已經在服務器A上設置了功能齊全的郵件服務器,並將Postfix作為SMTP服務器。 您可以使用它直接將電子郵件發送給收件人,因為端口25未被阻止。
- 稍後,您使用服務器B來建立一個網站,該網站需要向用戶發送通知電子郵件。
您可以在服務器B上設置另一個郵件服務器,但這浪費時間和硬件資源。 更為明智的解決方案是在服務器B上安裝Postfix SMTP服務器,並將其配置為通過服務器A發送電子郵件,該服務器可以將電子郵件從服務器B中繼到最終收件人。 服務器A已建立其IP信譽,因此您不必為服務器B建立IP信譽。
如果您在自己的Linux服務器上運行WordPress,建議您按照本教程設置Postfix SMTP中繼。 這樣,您可以擺脫WordPress中的SMTP插件。 WordPress插件會減慢您的網站速度,並且容易受到攻擊,例如Easy WP SMTP插件中發現的漏洞,該漏洞使未經授權的用戶可以修改WordPress選項並執行惡意代碼。 由於WordPress插件存在漏洞,我的網站曾經遭到入侵。 因此,當我可以使用基本操作系統實現相同的功能時,我會儘可能地擺脫插件。
事不宜遲,讓我們開始吧。
步驟1:在服務器B上安裝Postfix SMTP服務器
運行以下命令從默認的CentOS / RHEL存儲庫安裝Postfix。 Cyrus SASL庫是使SASL身份驗證工作所必需的。
sudo dnf update sudo dnf install postfix cyrus-sasl cyrus-sasl-plain -y
安裝完成後,啟動Postfix SMTP服務器。
sudo systemctl start postfix
並在引導時啟用自動啟動。
sudo systemctl enable postfix
步驟2:在服務器B上配置Postfix
設置Postfix主機名
默認情況下,Postfix SMTP服務器在與其他SMTP服務器通信時使用操作系統的主機名來標識自己。 但是,操作系統主機名可能會更改,因此,最好使用以下命令在Postfix配置文件中直接設置主機名。 請注意,不建議使用主域(yourdomain.com)作為主機名。
sudo postconf -e "myhostname = www.yourdomain.com"
設置$ mydomain參數
的 $mydomain
參數指定本地Internet域名。 默認是使用 $myhostname
減去第一個分量。 您可以顯示的當前值 $mydomain
與:
postconf mydomain
它應該是您的頂點域名,例如
linuxbabe.com
如果未顯示您的頂點域名,請使用以下命令設置$ mydomain參數:
sudo postconf -e "mydomain = yourdomain.com"
設置$ myorigin參數
的 $myorigin
參數指定附加到沒有@domain部分的發件人和收件人地址的默認域名。 默認值為 $myhostname
,可以看到:
postconf myorigin
輸出:
myorigin = $myhostname
您可以將其值更改為yourdomain.com。
sudo postconf -e "myorigin = yourdomain.com"
設置$ mydestination參數
的 $mydestination
參數指定服務器認為自己是最終目的地的域的列表。 您可以通過以下方式顯示$ mydestination的當前值:
postconf mydestination
輸出量
mydestination = $myhostname, localhost.$mydomain, localhost
默認值允許您的Postfix SMTP服務器接收即將發送的電子郵件 [email protected]
, [email protected]
和 [email protected]
。 請注意,mydestination的值不應包含您的主域名,例如 linuxbabe.com
,因為這將使服務器B成為您的主域名的目的地,這意味着從服務器B生成的電子郵件用於 [email protected]
將被發送到服務器B本身,而不是服務器A。
重新啟動Postfix
最後,我們需要重新啟動Postfix才能使更改生效。
sudo systemctl restart postfix
步驟3:通過端口587的Postfix SMTP中繼
在服務器B上運行以下命令來設置relayhost參數。 更換 mail.linuxbabe.com
與您的郵件服務器的主機名。
sudo postconf -e "relayhost = [mail.linuxbabe.com]:587"
然後在服務器B上編輯Postfix主配置文件。
sudo nano /etc/postfix/main.cf
在此文件的末尾添加以下行以配置SASL身份驗證。 我們指定 /etc/postfix/sasl_password
文件包含用戶名和密碼。
# outbound relay configurations smtp_sasl_auth_enable = yes smtp_sasl_password_maps = hash:/etc/postfix/sasl_passwd smtp_sasl_security_options = noanonymous smtp_tls_security_level = may header_size_limit = 4096000
保存並關閉文件。 接下來,您應該在郵件服務器上創建一個專用的電子郵件帳戶,以便服務器B可以使用該電子郵件帳戶通過端口587登錄。 /etc/postfix/sasl_passwd
文件在服務器B上。
sudo nano /etc/postfix/sasl_passwd
如下所示,將SMTP中繼主機和SMTP憑據添加到此文件。 將這些值替換為您自己的郵件服務器的主機名,電子郵件帳戶和密碼。 請注意,電子郵件帳戶和密碼之間有一個冒號。
[mail.linuxbabe.com]:587 [email protected]:password
保存並關閉文件。 然後使用以下命令創建相應的哈希數據庫文件 postmap
。
sudo postmap /etc/postfix/sasl_passwd
現在您應該有一個文件 /etc/postfix/sasl_passwd.db
。 重新啟動Postfix,以使更改生效。
sudo systemctl restart postfix
默認, sasl_passwd
和 sasl_passwd.db
文件可以由服務器上的任何用戶讀取。 將權限更改為600,以便只有root可以讀寫這兩個文件。
sudo chmod 0600 /etc/postfix/sasl_passwd /etc/postfix/sasl_passwd.db
從現在開始,服務器B上的網站可以使用Postfix發送電子郵件,該電子郵件將通過您的郵件服務器進行中繼。 請注意,許多Web應用程序提供兩種電子郵件發送模式:
- SMTP
- 發郵件
SMTP
通常是指Web應用程序本身中的SMTP中繼功能, sendmail
指在基礎操作系統上使用SMTP服務器。 您需要選擇 sendmail
選項以使用Postfix SMTP中繼。 如果您在WordPress網站上安裝了SMTP插件,請刪除SMTP插件,然後WordPress將使用Postfix SMTP中繼。
如果服務器A上有iRedMail
如果您使用iRedMail在服務器A上設置郵件服務器,則iRedAPD策略守護程序可能會拒絕來自服務器B的電子郵件中繼,因為發件人與SMTP身份驗證用戶名不同。 要解決此問題,我們需要將SMTP身份驗證用戶名添加到允許列表中。
編輯iRedAPD配置文件。
sudo nano /opt/iredapd/settings.py
在文件末尾添加以下行。 根據需要替換紅色文本。
ALLOWED_LOGIN_MISMATCH_SENDERS = ['[email protected]']
保存並關閉文件。 然後重新啟動iRedAPD,以使更改生效。
sudo systemctl restart iredapd
防止服務器B上的垃圾郵件發送者
由於服務器B上的Postfix SMTP服務器僅用於向用戶發送交易電子郵件,因此我們可以使它僅在本地主機上偵聽,因此不良行為者無法向其發送垃圾郵件。 在服務器B上運行以下命令,以使Postfix僅在本地主機上偵聽。
sudo postconf -e "inet_interfaces = loopback-only"
重新啟動Postfix,以使更改生效。
sudo systemctl restart postfix
設置發件人地址,發件人姓名和返迴路徑
默認情況下,“發件人地址”和“發件人名稱”與用於驗證登錄身份的電子郵件帳戶相同,並且返迴路徑類似於 [email protected]
。 您可以在Web應用程序中設置自定義發件人地址,發件人姓名和返迴路徑。
讓我們以WordPress為例。 您可以在WordPress主題的 functions.php
文件以覆蓋默認的發件人地址,發件人名稱和返迴路徑。 根據需要替換紅色文本。 您應該在郵件服務器上創建“發件人”電子郵件地址,以防止發送失敗。
// Function to change From email address function wpb_sender_email( $original_email_address ) { return '[email protected]'; } // Function to change sender name function wpb_sender_name( $original_email_from ) { return 'LinuxBabe'; } // Set return-path the same as From address function fix_my_email_return_path( $phpmailer ) { $phpmailer->Sender = $phpmailer->From; } // Hooking up our functions to WordPress filters add_filter( 'wp_mail_from', 'wpb_sender_email' ); add_filter( 'wp_mail_from_name', 'wpb_sender_name' ); add_action( 'phpmailer_init', 'fix_my_email_return_path' );
保存文件,您就完成了。
檢查電子郵件發件人分數
現在,您應該轉到https://www.mail-tester.com,並從服務器B上的網站向電子郵件測試人員地址發送電子郵件。 檢查您的發件人分數,看看SPF,DKIM和DMARC是否會通過。 如您所見,我得到了滿分。
如果服務器B上有多個網站
如果您在服務器B上運行多個網站,則需要為每個域名使用不同的中繼主機。 編輯服務器B上的Postfix主配置文件。
sudo nano /etc/postfix/main.cf
在文件中添加以下行,這告訴Postfix我們要對每個發送者域使用不同的中繼主機。
sender_dependent_relayhost_maps = hash:/etc/postfix/relay_by_sender
然後創建文件。
sudo nano /etc/postfix/relay_by_sender
如下添加參數。 左側是發件人域。 右側是郵件服務器的主機名和端口號。
@domain1.com mail.domain1.com:587 @domain2.com mail.domain2.com:587
保存並關閉文件。 然後編輯SASL身份驗證文件。
sudo nano /etc/postfix/sasl_passwd
如下添加登錄憑據。
mail.domain1.com [email protected]:password mail.domain2.com [email protected]:password
保存並關閉文件。 然後創建哈希數據庫文件。
sudo postmap /etc/postfix/relay_by_sender sudo postmap /etc/postfix/sasl_passwd
重新啟動Postfix SMTP服務器,以使更改生效。
sudo systemctl restart postfix
從這裡開始,通過 domain1.com
在信封發件人地址中將通過 mail.domain1.com
和電子郵件 domain2.com
在信封發件人地址中將通過 mail.domain2.com
。 信封發件人地址中具有其他域名的電子郵件將通過為 relayhost
參數。
Mail.domain1.com
和 mail.domain2.com
可以指向相同的IP地址,這意味着兩個域名使用的是同一郵件服務器。 您可以檢查以下教程之一,以在單個郵件服務器上託管多個域。
- 如何使用Nginx在iRedMail中託管多個郵件域
- 如何在Modoboa郵件服務器中託管多個郵件域
您也可以在兩個域名的不同服務器上託管電子郵件。 如果服務器B上有多個WordPress站點,則還應該更改每個站點 functions.php
WordPress主題中的文件,以為每個域名設置自定義發件人地址和名稱。
從電子郵件標題中刪除敏感信息
默認情況下,Postfix SMTP服務器將添加一個 Received:
電子郵件標頭,記錄服務器B的IP地址,這可能會泄漏您網站的IP地址(如果它位於CDN後面)。 您可以告訴Postfix忽略它。 在服務器A上創建頭檢查文件。
sudo nano /etc/postfix/smtp_header_checks
將以下行放入文件中。
/^Received:/ IGNORE
保存並關閉文件。 然後編輯Postfix主配置文件。
sudo nano /etc/postfix/main.cf
在文件末尾添加以下行。
smtp_header_checks = regexp:/etc/postfix/smtp_header_checks
保存並關閉文件。 然後運行以下命令重建哈希表。
sudo postmap /etc/postfix/smtp_header_checks
重新加載Postfix以使更改生效。
sudo systemctl reload postfix
現在,Postfix不會在電子郵件標題中包含那些敏感信息。 請注意,有些人可能還喜歡刪除 MIME-Version
標頭。 我不建議這樣做,因為這會導致DKIM驗證失敗。
故障排除
如果服務器B上的Postfix無法發送電子郵件,而您在郵件日誌中發現以下錯誤(/var/log/maillog
),
warning: SASL authentication failure: No worthy mechs found
您需要安裝Cyrus SASL庫。
sudo dnf install postfix cyrus-sasl cyrus-sasl-plain -y
然後重新啟動Postfix。
sudo systemctl restart postfix
結論
我希望本教程可以幫助您在2個Postfix SMTP服務器之間設置SMTP中繼。 與往常一樣,如果您發現這篇文章很有用,請訂閱我們的免費新聞通訊以獲取更多提示和技巧。 保重🙂