在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_passwdsasl_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.commail.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中繼。 與往常一樣,如果您發現這篇文章很有用,請訂閱我們的免費新聞通訊以獲取更多提示和技巧。 保重🙂

Sidebar