這幾天處理了一起看似詭異的 SMTP Relay 錯誤,卡了兩天百思不得其解,終於真相大白,所有謎團一掃而空。

thumbnail

案情如下,事涉三台主機:

  • Exhcange Server
    多台機器啟用 Load Balance 負載平衡,對外虛擬 IP 為 192.168.2.100,並對映 FQDN smtp.contoso.com
  • 測試主機
    IP 192.168.3.123,使用 .NET 程式透過 Exchange SMTP Relay 寄信
  • 部署主機(問題主機)
    IP 192.168.1.200,使用 .NET 程式透過 Exchange SMTP Relay 寄信

.NET 程式使用 System.Net.Mail.SmtpClient 寄信,不需登入或身分認證,程式範例如下:

var smtp = new SmtpClient("192.168.2.100");
smtp.UseDefaultCredentials = false;
var message = new MailMessage(
    new MailAddress("jane@contoso.com"), 
    new MailAddress("ben@contoso.com"));
message.Body = "This is a test email message sent by .NET";
message.Subject = "SMTP test";
smtp.Send(message);

匿名 SMTP Relay 寄送需額外授權,而 Exchange 已有設定開放 192.168.1.200 及 192.168.3.123 SMTP 寄送。

測試階段使用 192.168.3.123 測試,SMTP 主機 IP 輸入 192.168.2.100,測試一切正常。

上線部署至 192.168.1.200 主機,相同的程式與設定卻發生 5.7.57 SMTP - Client was not authenticated to send anonymous mail during MAIL FROM 錯誤。這個錯誤最典型的原因是這台主機 IP 不在 SMTP 伺服器匿名 Relay 允許清單。BUT,該主機平日已有其他應用系統使用 SMTP 寄信一切正常,應可排除 SMTP 伺服器未開放 192.168.1.200 Relay 的可能性。

比對可寄信應用程式的設定,發現關鍵差異:其他應用程式的 SMTP 主機 IP 是設成 relay.contoso.com 而非 192.168.2.100。從善如流改成 relay.contoso.com,5.7.75 錯誤就消失了。

狀況雖然解除,但留下一堆謎團。為什麼用 relay.contoso.com 可以用 192.168.2.100 不行?這二者不是一樣的東西嗎?執行 nslookup relay.contoso.com 得到 192.168.2.100,加上先前測試台用 192.168.2.100 IP 寄信也是成功的,加上 SMTP 就只是靠 IP 跟 25 Port 建 TCP 連線溝通,想不出用 FQDN 或 IP 會有什麼鬼差別?

幾條線索彼此矛盾,看似無解,讓我卡住了兩天。

直到再有機會登入問題主機 192.168.1.200 實地檢測,發現自己犯了低級錯誤。改用 ping relay.contoso.com,得到的 IP 是 Exchange 主機的實際 IP 192.168.1.100,而不是 Load Blanace 虛擬 IP 192.168.2.100!

原因是該主機因特殊原因,在 C:\Windows\System32\drivers\etc\hosts 額外將 relay.contoso.com 指向 Exchange 實際 IP 192.168.1.100。我居然忘了該用 ping FQDN 測試,看到才是包含 hosts 對映的最終結果,只看 nslook 只查 DNS 解析不準。(老射手居然犯低級錯誤,醜一)

此一重大發現解開了先前的矛盾條件,問題被重新定義成:

  1. 192.168.3.123 呼叫 192.168.2.100 可 Relay
  2. 192.168.1.200 呼叫 192.168.2.100 (虛擬 IP) 無法 Relay (5.7.57 錯誤)
  3. 192.168.1.200 呼叫 192.168.1.100 (實際 IP) 可 Relay

所以關鍵在於:為什麼 192.168.1.200 用 Virtual IP (192.168.2.100) 連 SMTP 會出現 5.7.57 拒絕 Relay 錯誤、用實際 IP (192.168.1.100) 則可成功?

這個現象配上 Load Balance 跟 Virtual IP 等關鍵字,老司機此時開始展現經驗優勢。我想起問題主機本身也有加入 Load Balance,有個對外 Virtual IP 192.168.2.200,可以想像成開機主機有兩張網卡兩個 IP 192.168.1.200 (實際 IP) 及 192.168.2.200 (虛擬 IP),故連 SMTP 時是用對方的虛擬 IP 或實際 IP 會有差別:

  1. 使用 192.168.2.100 連上 SMTP 伺服器,路由會從 192.168.2.200 過去,SMTP 伺服器看到的來源 IP 會變成 192.168.1.254 之類的 IP (似乎與網路設備的 Virtual Server / SNAT 機制有關,為節省大腦算力我沒深入),這個 IP 不在開放匿名 Relay 的名單,故產生了 5.7.57 SMTP - Client was not authenticated to send anonymous mail during MAIL FROM 錯誤
  2. 使用 192.168.1.100 連上 SMTP 伺服器,SMTP 伺服器看到的來源 IP 為 192.168.1.200,此 IP 為申請過的可匿名 Relay 來源,故可成功寄信

剎那間,原本難以解釋的見鬼現象,頓時變得天經地義,合理到無法挑剔,這種 AHA 時刻,是當茶包射手最大的樂趣。哈~


Comments

Be the first to post a comment

Post a comment