癥狀 如果使用某種第三方測試對 Microsoft 簡單郵件傳輸協議 (SMTP) 服務器 的中繼情況進行測試,SMTP 服務器可能看起來未能通過測試,Microsoft SMTP 產品可能看起來是對中繼開放的,即使事實并非如此。 現有多個常用測試可用來測試 SMTP 服務器的中繼情況
更多信息
如果您必須擁有在 SMTP 協議會話期間執行目錄查找的能力,您可以編寫一個 Windows 2000 SMTP 協議事件接收器。
有關其他信息,請參見下面的 MSDN 平臺 SDK SMTP 服務器事件 Web 站點:
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/smtpevt/html/_smtpevt_protocol_event_interfaces.asp
推薦的符合 RFC 的響應與下面的響應類似:
550 5.1.1 user@northwindtraders.com...User unknown
Microsoft 選擇不在 SMTP 協議會話期間執行目錄查找,原因是:
- 如果您將 5xx 錯誤返給假冒的用戶,則向您的服務器發送主動提供的大量商務電子郵件(垃圾郵件或 UCE)的用戶即刻會發現哪些地址是真實的、哪些地址是假冒的。用戶如果使用 SMTP 協議運行一個名稱詞典,就很容易獲取一個有效電子郵件地址的列表。這也可能會給本地用戶帶來安全風險,因為用戶名往往與電子郵件地址是一樣的。
- 惡意用戶可以使用“發件人”地址在未經授權的情況下訪問系統(欺騙),然后使用受害者的服務器向目標收件人發送 NDR。這種攻擊只能用攻擊者能夠發送的數據量攻擊服務器。換句話說,如果惡意用戶想對第三方發送 1 兆 (MB) 的數據,則必須使用他(或她)自己的 1 兆帶寬把 1 兆的數據發送到 SMTP 服務器。通常情況下,這種惡意用戶嘗試發送 1 MB 的數據,但是仍會導致 Internet 上有幾十或幾百 MB 的數據攻擊一個或一組受害者服務器。阻止發生這一情況最好的做法是,在整個 Internet 范圍內驗證“發件人”的地址。但是,還沒有任何標準用于在整個 Internet 范圍內驗證“發件人”的地址;因此,應對這一情況的最好做法是查看郵件標頭。
- 如果在 SMTP 協議會話期間執行了目錄查找,則 SMTP 協議的運行速度可能大大減慢。在本文發布時,Microsoft 是在以下前提下運作的:SMTP 服務器應以盡可能快的速度運行,以避免 Internet 上或桌面 SMTP 客戶端上的 SMTP 郵件發生阻塞。如果目錄過載,則客戶端可能會發現服務器運行速度過慢,而且會收到一條錯誤信息。在某些情況下,目錄也可能不可用;或者,可能需要對特定的域進行中繼,但是目錄的副本可能不可用(例如,在 ISP 承載的環境中)。
關于中繼的一般信息
一臺 SMTP 客戶端可以使用 SMTP 服務器將電子郵件轉發到遠程(即,非本地)域,這一情況叫做中繼。中繼本來不是壞事,因為 SMTP 就是為這一用途設計的(請參見 RFC 2821 文檔的第 2.1 節和第 3.7 節)。
但是,如果對中繼不加控制(不受控制的主機稱作“開放中繼”的主機),惡意用戶可能使用中繼來發送主動提供的大量商務電子郵件(垃圾郵件或 UCE)。通過將這些不請自來的電子郵件借助中間主機彈跳,惡意用戶會讓自己的身份真假難辨。這還會使資源綁定到中繼主機上,使中繼主機無法發送有效的電子郵件。特別是,大多數發送這種主動提供的電子郵件的用戶無需使用自己的帶寬即可將一封郵件發送給大量的收件人。
中繼測試 1
此為 SMTP 中繼的標準測試。如果不是管理員特許或者 SMTP 客戶端首先進行驗證,SMTP 客戶端不應以這種方式進行中繼。
>>> RSET
<<< 250 2.0.0 Resetting
>>> MAIL FROM:<spamtest@contoso.net>
<<< 250 2.1.0 spamtest@contoso.net....Sender OK
>>> RCPT TO:<relaytest@contoso.net>
<<< 550 5.7.1 Unable to relay for relaytest@contoso.net
中繼測試 2
此測試與上一個測試基本上一樣,只是發起人是本地用戶而不是遠程域的用戶。因為“發件人”地址常被用于在未經授權的情況下訪問系統(欺騙),所以任何服務器都不應被這種方法欺騙:
>>> RSET
<<< 250 2.0.0 Resetting
>>> MAIL FROM:<spamtest>
<<< 250 2.1.0 spamtest@northwindtraders.com....Sender OK
>>> RCPT TO:<relaytest@contoso.net>
<<< 550 5.7.1 Unable to relay for relaytest@contoso.net
中繼測試 3
此測試針對 NULL 或空白“發件人”信封地址。NDR 及其他通知會使用 NULL“發件人”信封地址。然而,如果“收件人”地址中的域不是本地域,通知仍然不會通過:
>>> RSET
<<< 250 2.0.0 Resetting
>>> MAIL FROM:<>
<<< 250 2.1.0 <>....Sender OK
>>> RCPT TO:<relaytest@contoso.net>
<<< 550 5.7.1 Unable to relay for relaytest@contoso.net
中繼測試 4
此測試與中繼測試 2 一樣,只是客戶端已顯式添加本地域。這不應騙過 SMTP 服務器:
>>> RSET
<<< 250 2.0.0 Resetting
>>> MAIL FROM:<spamtest@northwindtraders.com>
<<< 250 2.1.0 spamtest@northwindtraders.com....Sender OK
>>> RCPT TO:<relaytest@contoso.net>
<<< 550 5.7.1 Unable to relay for relaytest@contoso.net
中繼測試 5
此測試也與中繼測試 2 一樣,只是已添加服務器的本地 IP 地址,目的是嘗試欺騙服務器。盡管此地址格式通常是可接受的,但服務器不應接受到遠程域的中繼。在嘗試將服務器的“本地主機名”或域名稱系統 (DNS) 名填入“發件人”地址中的各種其他測試中,服務器都不應被“發件人”地址欺騙:
>>> RSET
<<< 250 2.0.0 Resetting
>>> MAIL FROM:<spamtest@[10.10.10.10]>
<<< 250 2.1.0 spamtest@[10.10.10.10]....Sender OK
>>> RCPT TO:<relaytest@contoso.net>
<<< 550 5.7.1 Unable to relay for relaytest@contoso.net
中繼測試 6
此測試專用于舊式的基于 UNIX 的服務器,該服務器通過附加本地域并將 (@) 符號更改為百分號 (%) 來路由電子郵件。然后服務器才中繼郵件。此 Microsoft 產品可接受該郵件,顯示未能通過測試。因為百分號 (%) 在本地部分是個有效字符,此產品選擇了接受該郵件并在目錄查找失敗時發出一個 NDR。對于這一類型的中繼,Microsoft SMTP 產品沒有漏洞,因為郵件沒有轉發,而是發出了一個 NDR:
>>> RSET
<<< 250 2.0.0 Resetting
>>> MAIL FROM:<spamtest>
<<< 250 2.1.0 spamtest@northwindtraders.com....Sender OK
>>> RCPT TO:<relaytest%contoso.net>
<<< 250 2.1.5 relaytest%contoso.net@northwindtraders.com
中繼測試 7
此測試是中繼測試 6 的又一個變種。此 Microsoft 產品接受郵件并顯示未能通過測試。因為引號符號 (") 在本地部分是個有效字符,此產品選擇了接受該郵件并在目錄查找失敗時發出一個 NDR。對于這一類型的中繼,Microsoft SMTP 產品沒有漏洞,因為郵件沒有轉發,而是發出了一個 NDR:
>>> mail from: <spamtest>
<<< 250 2.1.0 spamtest@northwindtraders....Sender OK
>>> rcpt to: <"nobody@mail-contoso.org">
<<< 250 2.1.5 "nobody@mail-contoso.org"@northwindtraders.com
如果您的 SMTP 服務器未能通過這些測試中的一個或多個,特別是中繼測試 6 和 7,這并不一定能說明該服務器是一個開放中繼。有些系統(包括 Microsoft Exchange 和 Microsoft Windows 2000 SMTP)看起來能接受中繼郵件,但是隨后在內部拒絕郵件而不進行傳遞。但是,如果不發送一條真實的測試郵件,您無法真正確定某個服務器是否真的開放中繼。
當您對 Exchange 2000 服務器進行中繼測試 6 和測試 7 時,因為這兩種測試都會針對無效收件人生成一條消息,所以在 Exchange System Manager 中指定的郵箱(具體指定位置是在默認 SMTP 虛擬服務器的屬性中,在
郵件選項卡上,在“將使用未解析的收件人的郵件全部轉發到主機”框中)會收到一個與下例類似的 DNR:
Your message did not reach some or all of the intended recipients.
Subject:中繼測試 6
Sent:3/22/2002 5:47 PM
The following recipient(s) could not be reached:
relaytest%contoso.net@northwindtraders.com on 3/12/2002 12:30 PM
The e-mail aclearcase/" target="_blank" >ccount does not exist at the organization this message was sent to.Check the e-mail address, or contact the recipient directly to find out the correct address.
<server.northwindtraders.com #5.1.1>
- 或者 -
Your message did not reach some or all of the intended recipients.
Subject:中繼測試 7
Sent:3/13/2002 12:30 PM
The following recipient(s) could not be reached:
"nobody@mail-contoso.org"@northwindtraders.com on 3/13/2002 12:30 PM
The e-mail account does not exist at the organization this message was sent to.Check the e-mail address, or contact the recipient directly to find out the correct address.
<server.northwindtraders.com #5.1.1>
您可以使用這些 NDR 來驗證這些郵件確實未被中繼。
有關如何在運行 Exchange Server 5.5 時使服務器防范開放中繼的其他信息,請單擊下面的文章編號,以查看 Microsoft
知識庫中相應的文章:
196626 XFOR:Restricting Routing in the Internet Mail Service
如果您運行的是 Microsoft Exchange 2000,默認情況下,中繼需要身份驗證。有關其他信息,請參見 Exchange 2000 幫助。