smtp

smtp

SMTP(Simple Mail Transfer Protocol)即簡單郵件傳輸協定,它是一組用于由源地址到目的地址傳送郵件的規則,由它來控製信件的中轉方式。SMTP協定屬于TCP/IP協定簇,它幫助每台電腦在傳送或中轉信件時找到下一個目的地。

SMTP協定跟大多數套用層協定一樣,也存在兩個 端:在發信人的郵件伺服器上執行的客戶端和在收信人的郵件伺服器上執行的伺服器端。SMTP的客戶端和伺服器端同時運行在每個郵件伺服器上。當一個郵件服 務器在向其他郵件伺服器傳送郵件訊息時,它是作為SMTP客戶在運行。

SMTP協定與人們用于面對面互動的禮儀之間有許多相似之處SMTP客戶和伺服器先執行一些套用層握手操作。就像人們在轉手東西之前往往先自我介紹那樣,SMTP客戶和伺服器也在傳送信息之前先自我介紹一下。 在這個SMTP握手階段,SMTP客戶向伺服器分別指出發信人和收信人的電子郵件地址。彼此自我介紹完畢之後,客戶發出郵件訊息。

  • 中文名稱
  • 外文名稱
    Simple Mail Transfer Protocol
  • 端    口
    25
  • 作    用
    傳輸系統之間的郵件信息
  • 簡    稱
    SMTP

定義

SMTP 是一種TCP協定支持的提供可靠且有效電子郵件傳輸的套用層協定。SMTP 是建立在 TCP上的一種郵件服務,主要用于傳輸系統之間的郵件信息並提供來信有關的通知。

SMTP 獨立于特定的傳輸子系統,且隻需要可靠有序的資料流信道支持。SMTP 重要特徵之一是其能跨越網路傳輸郵件,即" SMTP 郵件中繼"。通常,一個網路可以由公用網際網路上 TCP 可相互訪問的主機、防火牆分隔的 TCP/IP 網路上 TCP 可相互訪問的主機,及其它 LAN/WAN 中的主機利用非 TCP傳輸層協定組成。使用 SMTP ,可實現相同網路上處理機之間的郵件傳輸,也可通過中繼器網關實現某處理機與其它網路之間的郵件傳輸。在這種方式下,郵件的傳送可能經過從傳送端到接收端路徑上的大量中間中繼器網關主機域名服務系統(DNS)的郵件交換伺服器可以用來識別出傳輸郵件的下一條 IP 地址。

SMTP是一個相對簡單的基于文本的協定。在其之上指定了一條訊息的一個或多個接收者(在大多數情況下被確認是存在的),然後訊息文本會被傳輸。可以很簡單地通過telnet程式來測試一個SMTP伺服器。SMTP使用TCP連線埠25。要為一個給定的域名決定一個SMTP伺服器,需要使用MX (Mail eXchange)DNS。

在八十年代早期SMTP開始被廣泛地使用。當時,它隻是作為UUCP的補充,UUCP更適合于處理在間歇連線的機器間傳送郵件。相反,SMTP在傳送和接收的機器始終連線在網路的情況下工作得最好。

Sendmail是最早實現SMTP的郵件傳輸代理之一。到2001年至少有50個程式將SMTP實現為一個客戶端(訊息的傳送者)或一個伺服器(訊息的接收者)。一些其他的流行的SMTP伺服器程式包括了Philip Hazel的exim,IBM的Postfix,D. J. Bernstein的Qmail,以及Microsoft Exchange Server。

由于這個協定開始是基于純ASCII文本的,它在二進位檔案上處理得並不好。諸如MIME的標準被開發來編碼二進位檔案以使其通過SMTP來傳輸。今天,大多數SMTP伺服器都支持8位MIME擴展,它使二進位檔案的傳輸變得幾乎和純文本一樣簡單。

SMTP是一個"推"的協定,它不允許根據需要從遠程伺服器上"拉"來訊息。要做到這點,郵件客戶端必須使用POP3或IMAP。另一個SMTP伺服器可以使用ETRN在SMTP上觸發一個傳送。

協定原理

SMTP-簡單郵件傳輸協定(SimpleMailTransferProtocol),是定義郵件傳輸最常用的協定,它是基于TCP服務的套用層協定,由RFC2821所定義。SMTP協定規定的命令是以明文方式進行的。為了說明SMTP的工作原理,我們以向163傳送郵件為實例進行說明。

在linux環境下,使用"telnet smtp.163. com 25"連線smtp.163. com的25號連線埠(SMTP的標準服務連線埠);在windows下使用telnet程式,遠程主機指定為smtp.163. com,而連線埠號指定為25,然後連線smtp.163. com:互動過程如下:

[lix@nslix]$telnet smtp.163. com 25

SMTPSMTP

220 163 .com Anti-spam GT for Coremail System (163com[071018])

HELO smtp.163 .com

250 OK

auth login

334 dXNlcm5hbWU6

USERbase64加密後的使用者名稱

334 UGFzc3dvcmQ6

PASSbase64加密後的密碼

235 Authentication successful

MAILFROM:XXX@163 .COM

250 Mail OK

RCPTTO:XXX@163 .COM

250 Mail OK

DATA

354 End data with .

QUIT250 Mail OK

SMTPSMTP

queued as smtp5,D9GowLArizfIFTpIxFX8AA==.41385S2

HELO是客戶向對方郵件伺服器發出的標識自己的身份的命令,這裏假設傳送者為ideal;MAILFROM命令用來表示傳送者的郵件地址;RCPTTO:標識接收者的郵件地址,這裏表示希望傳送郵件給XXX@163. COM,如果郵件接收者不是在地使用者,例如RCPTTO:ideal,則說明希望對方郵件伺服器為自己轉發(Relay)郵件,若該機器允許轉發這樣的郵件,則表示該郵件伺服器是OPENRELAY的,否則說明該伺服器不允許RELAY;DATA表示下面是郵件的資料部分,輸入完畢以後,以一個"."開始的行作為資料部分的結束標識;QUIT表示退出這次會話,結束郵件傳送。

這就是一個簡單的傳送郵件的會話過程,其實當使用outlookexpress等客戶軟體傳送時,後台進行的互動也是這樣的,當然,SMTP協定為了處理復雜的郵件傳送情況如附屬檔案等等,定義了很多的命令及規定,具體可以通過閱讀RFC2821來獲得。

當你的一個朋友向你傳送郵件時,他的郵件伺服器和你的郵件伺服器通過SMTP協定通信,將郵件傳遞給你郵件地址所指示的郵件伺服器上(這裏假設你的在地郵件伺服器是Linux系統),若你通過telnet協定直接登錄到郵件伺服器上,則可以使用mail等客戶軟體直接閱讀郵件,但是若你希望使用在地的MUA(MailUserAgent,如outlookexpress等客戶軟體)來閱讀郵件,則在地客戶端通過POP3或IMAP協定與郵件伺服器互動,將郵件信息傳遞到客戶端(如:win98系統)。而如果你向你的朋友回復一封信件時,你所使用的MUA也是通過SMTP協定與郵件服務(一般為傳送郵件地址對應的email地址)器通信,指示其希望郵件伺服器幫助轉發一封郵件到你朋友的郵件地址指定的郵件伺服器中。若在地郵件伺服器允許你通過它轉發郵件,則伺服器通過SMTP協定傳送郵件到對方的郵件伺服器。這就是接受和傳送郵件的全部過程。

SMTPSMTP

配置方法

安裝POP3和SMTP

Windows Server 2003默認情況下是沒有安裝POP3和SMTP服務組件的,因此我們要手工增加。

1.安裝POP3服務組件

以系統管理員身份登錄Windows Server 2003 系統。依次進入"控制臺→增加或移除程式→增加/移除Windows組件",在彈出的"Windows組件向導"對話框中選中"電子郵件服務"選項,點擊"詳細信息"按鈕,可以看到該選項包括兩部分內容:POP3服務和POP3服務Web管理。為方便使用者遠程Web方式管理郵件伺服器,建議選中"POP 3服務Web管理"。

2.安裝SMTP服務組件

選中"應用程式伺服器"選項,點擊"詳細信息"按鈕,接著在"Internet信息服務(IIS)"選項中查看詳細信息,選中"SMTP Service"選項,最後點擊"確定"按鈕。此外,如果使用者需要對郵件伺服器進行遠程Web管理,一定要選中"全球資訊網服務"中的"遠程管理(HTML)"組件。完成以上設定後,點擊"下一步"按鈕,系統就開始安裝配置POP3和SMTP服務了。

配置POP3伺服器

1.建立郵件域

點擊"開始→管理工具→POP3服務",彈出POP3服務控製台視窗。選中左欄中的POP3服務後,點擊右欄中的"新域",彈出"增加域"對話框,接著在"域名"欄中輸入郵件伺服器的域名,也就是郵件地址"@"後面的部分,

2.建立使用者信箱

選中剛才新增的,在右欄中點擊"增加信箱",彈出增加信箱對話框,在"信箱名"欄中輸入郵件使用者名稱,然後設定使用者密碼,最後點擊"確定"按鈕,完成信箱的建立。

完成POP3伺服器的配置後,就可開始配置SMTP伺服器了。點擊"開始→程式→管理工具→Internet信息服務(IIS)管理器",在"IIS管理器"視窗中右鍵點擊"默認SMTP虛擬伺服器"選項,在彈出的選單中選中"屬性",進入"默認SM TP虛擬伺服器"視窗,切換到"常規"標簽頁,在"IP地址"下拉列表框中選中郵件伺服器的IP地址即可。點擊"確定"按鈕,此時SMTP伺服器默認的是匿名訪問,開啟切換到"訪問"標簽頁,點擊"身份驗證"按鈕,在對話框中去掉"匿名訪問"選項,選中"基本身份驗證(Basic authentication)"。這樣一個簡單的郵件伺服器就架設完成了。

工作機製

SMTP通常有兩種工作模式:傳送SMTP和接收SMTP。具體工作方式為:傳送SMTP在接到使用者的郵件請求後,判斷此郵件是否為在地郵件,若是直接投送到使用者的信箱,否則向dns查詢遠端郵件伺服器的MX紀錄,並建立與遠端接收SMTP之間的一個雙向傳送通道,此後SMTP命令由傳送SMTP發出,由接收SMTP接收,而應答則反方面傳送。一旦傳送通道建立,SMTP傳送者傳送MAIL命令指明郵件傳送者。如果SMTP接收者可以接收郵件則返回OK應答。SMTP傳送者再發出RCPT命令確認郵件是否接收到。如果SMTP接收者接收,則返回OK應答;如果不能接收到,則發出拒絕接收應答(但不中止整個郵件操作),雙方將如此重復多次。當接收者收到全部郵件後會接收到特別的序列,如果接收者成功處理了郵件,則返回OK應答即可。

工作過程

簡單郵件傳輸協定(SMTP)是一種基于文本電子郵件傳輸協定,是在因特網中用于在郵件伺服器之間交換郵件的協定。SMTP是套用層的服務,可以適應于各種網路系統。

SMTP的命令和回響都是基于文本,以命令行為單位,換行符為CR/LF。回響信息一般隻有一行,由一個3位數的代碼開始,後面可附上很簡短的文字說明。SMTP要經過建立連線、傳送郵件和釋放連線3個階段。具體為:

SMTPSMTP

(1)建立TCP連線。

(2)客戶端向伺服器傳送HELO命令以標識發件人自己的身份,然後客戶端傳送MAIL命令。

(3)伺服器端以OK作為回響,表示準備接收。

(4)客戶端傳送RCPT命令。

(5)伺服器端表示是否願意為收件人接收郵件。

(6)協商結束,傳送郵件,用命令DATA傳送輸入內容。

(7)結束此次傳送,用QUIT命令退出。

SMTP伺服器基于DNS中的郵件交換(MX)記錄路由電子郵件。電子郵件系統發郵件時是根據收信人的地址尾碼來定位郵件伺服器的。SMTP通過使用者代理程式(UA)完成郵件的編輯、收取和閱讀等功能;通過郵件傳輸代理程式(MTA)將郵件傳送到目的地。

X.25上套用

1.本備忘錄的狀態

本備忘錄講述了一種基于CCITT的X.25標準提供的虛電路業務的SMTP標準。

本備忘錄的發布不受任何限製。

2.簡介

在RFC821("SIMPLEMAILTRANSPORTPROTOCOL",SMTP,簡單郵件傳輸協定)

的附錄D中提到了直接將SMTP置于X.25虛電路(ISO第3層)上的可能性。並建議"利

用一種類似于TCP可靠的端到端協定在X.25的連線上"。在1981年時,考慮到PSDNs的

整體的可靠性,這毫無疑問是可行的。這一業務在1989年已經非常可靠,它允許直

接將其置于虛電路業務上。

在包括22個不同的國家的24個PSDN網的許多產品,證明了這種方法是成功的,結

果證明,即使使用在一些花費比較昂貴的PSDN中,這種方法還是十分經濟的,在X.25專

網和X.25區域網路中,這種方法也是成功。

每一個SMTP會話必須開啟一條X.25虛電路(VirtualCircuit,VC),SMTP會話將

使用由VC提供的全雙工通道。通常,VC是由發起呼叫的一方關閉的。

3.協定ID和呼叫使用者資料

呼叫使用者資料區的前4個位元組應該是0xC0F7,0000(十六進位),十進位是19224700。

這個欄位通常用來標識一個協定ID,或者PRID。

但是在實際的操作中,應該有能力在基本首碼地址上配置呼叫使用者資料,包括協定ID

欄位。

4.資料流

在傳送端通常把SMTP資料分成許多封包,相應地,在封包封裝的時候應該置M

位(表示有後續封包)。封包的總長度可以達到2048個位元組。

通常我們建議SMTP命令和回響應在一個封包傳送出去,或者隻有一個後續封包。

隻要對調試協定方便即可。但這並不要求是必須的。

5.識別資料

Q比特被置位的分組和中斷分組是沒有用的。如果收到了,應該被忽略掉。

6.電路復位

如果收到了一個3層的電路復位指示,這條VC應該清除,SMTP連線應該重新建立

重新建立會帶來一些時延,也可能是不同的呼叫業務。

7.呼叫業務

任何被X.25呼叫請求業務選擇的協商特征都可以使用。使用時應有能力為每一個被叫

地址指定業務。

8.字元編碼

X.25使用的字元編碼是完整的8位ASCII碼,沒有任何遺漏和修改。一行應該以CRLF

(十進位:1310)結尾,也可以僅僅以LF(十進位:10)來標識一行的結束。

9.關閉連線

跟TCP協定不同,在清除請求的過程中,X.25不提供資料的同步傳送;當清除虛電

路時,就丟棄所有正在傳送的封包。因此,當收到"服務關閉"訊息時,主叫的一邊關閉

SMTP會話層(在X.25上),這種訊息要麽是QUIT命令的回響,或者是因為服務必須中止。

10.逾時SMTP通常不提供逾時會話,在X.25,以下幾項是有效的:

SMTPSMTP

10.1呼叫請求

如果在100秒內沒有收到"呼叫接受"信息,或者在120秒(另外)內沒有收到"服

務準備好"信息,那麽應該清除這次呼叫,然後重試。

10.2已經建立的呼叫

當協定會話建立之後,在10分鍾內如果沒有收到任何回響,那麽就應該清除這條虛

電路。

10.3關閉

執行QUIT命令後,逾時時間縮短為20秒。這可能會導致不經意地退出,但它不會影

響已經完成的SMTP業務。

10.4清除

當X.25"清除請求"發出時,這條虛電路將在X.25協定指定的時間內逾時。

11.其他特徵

X.25的其他特徵,如永久虛電路和D比特的選擇,都沒有用到。

垃圾郵件

最初的SMTP的局限之一在于它沒有對傳送方進行身份驗證的機製。因此,後來定義了SMTP-AUTH擴展。

盡管有了身份識別機製,垃圾郵件仍然是一個主要的問題。但由于龐大的SMTP安裝數量帶來的網路效應,大刀闊斧地修改或完全替代SMTP被認為是不現實的。Internet Mail 2000就是一個替代SMTP的建議方案。

因此,出現了一些同SMTP工作的輔助協定。IRTF的反垃圾郵件研究小組正在研究一些建議方案,以提供簡單、靈活、輕量級的、可升級的源端識別。最有可能被接受的建議方案是傳送方策略架構協定。

SMTP模型

smtp提供了一種郵件傳輸的機製,當收件方和發件方都在一個網路上時,可以把郵件直傳給對方;當雙方不在同一個網路上時,需要通過一個或幾個中間伺服器轉發。smtp首先由發件方提出申請,要求與接收方smtp建立雙向的通信渠道,收件方可以是最終收件人也可以是中間轉發的伺服器。收件方伺服器確認可以建立連線後,雙發就可以開始通信。

發件方smtp向收件方發處mail命令,告知發件方的身份;如果收件方接受,就會回答ok。發件方再發出rcpt命令,告知收件人的身份,收件方smtp確認是否接收或轉發,如果同意就回答ok;接下來就可以進行資料傳輸了。通信過程中,發件方smtp與收件方smtp 採用對話式的互動方式,發件方提出要求,收件方進行確認,確認後才進行下一步的動作。整個過程由發件方控製,有時需要確認幾回才可以。

為了保證回復命令的有效,smtp要求發件方必須提供接收方的伺服器及信箱。郵件的命令和答復有嚴格的文法定義,並且回復具有相應的數位代碼。所有的命令由ascii碼組成。命令代碼是大小寫無關的,如Mail和MAIL ﹑mail是等效的。

服務擴展

SMTP提供一種可靠的有效的傳送機製,它用于傳送電子郵件。雖然十幾年來,它的作用已經有目共睹,可是對它功能的擴充也是必不可少的。對SMTP服務的擴展我們介紹一下:在SMTP轉發的郵件中包括信封和內容這兩種東西。我們寫信也寫信封和信皮,我們可以借生活中的信件來幫助理解。

(1)SMTP信封比較容易理解,它被作為一系列的SMTP協定單元傳送,它包括傳送者地址,傳送模式,還有一個或多個接收者地址。如果有不清楚的地方,請參閱《SMTP協定標準》。

(2)至于內容,它是由兩部分組成的,一部分是信頭,一部分是信體,信頭是由一個個的域/值對(一個域,一個值)組成的,如果信體有結構的話,它的結構是以MIME構造的。內容從根本上來說是文本的,一般也是由ASCII碼構成的,但是由于使用了MIME,所以這個限製應該也是沒有了,但信頭卻不行,一般都應該使用ASCII碼表示。雖然SMTP協定是一個不錯的協定,可是對它的擴展還是不可避免,本文主要說明了一種擴展方法,使用這種擴展方法,伺服器和使用者之間可以相互知道對方使用了擴展,使用了多少,如果進行通信。

SMTPSMTP

通訊模型

SMTP協定是TCP/IP協定族中的一員,主要對如何將電子郵件從傳送方地址傳送到接收方地址,也即是對傳輸的規則做了規定。SMTP協定的通信模型並不復雜,主要工作集中在傳送SMTP和接收SMTP上:首先針對使用者發出的郵件請求,由傳送SMTP建立一條連線到接收SMTP的雙工通訊鏈路,這裏的接收SMTP是相對于傳送SMTP而言的,實際上它既可以是最終的接收者也可以是中間傳送者。傳送SMTP負責向接收SMTP傳送SMTP命令,而接收SMTP則負責接收並反饋應答。

從前面的通訊模型可以看出SMTP協定在傳送SMTP和接收SMTP之間的會話是靠傳送SMTP的SMTP命令和接收SMTP反饋的應答來完成的。在通訊鏈路建立後,傳送SMTP傳送MAIL命令指令郵件傳送者,若接收SMTP此時可以接收郵件則作出OK的應答,然後傳送SMTP繼續發出RCPT命令以確認郵件是否收到,如果接收到就作出OK的應答,否則就發出拒絕接收應答,但這並不會對整個郵件操作造成影響。雙方如此反復多次,直至郵件處理完畢。SMTP協定共包含10個SMTP命令,列表如下:

SMTP命令說明

HELO<domain><CRLF>;識別傳送方到接收SMTP的一個HELLO命令

MAIL FROM:<reverse-path><CRLF>;為傳送者地址。此命令告訴接收方一個新郵件傳送的開始,並對所有的狀態和緩沖區進行初始化。此命令開始一個郵件傳輸處理,最終完成將郵件資料傳送到一個或多個信箱中。

RCPT TO:<forward-path><CRLF>;標識各個郵件接收者的地址

DATA<CRLF>

接收SMTP將把其後的行為看作郵件資料去處理,以<CRLF>.<CRLF>;標識資料的結尾。

REST<CRLF>;退出/復位當前的郵件傳輸

NOOP<CRLF>;要求接收SMTP僅做OK應答。(用于測試)

QUIT<CRLF>;要求接收SMTP返回一個OK應答並關閉傳輸。

VRFY<string><CRLF>;驗證指定的信箱是否存在,由于安全因素,伺服器多禁止此命令。

EXPN<string><CRLF>;驗證給定的信箱列表是否存在,擴充信箱列表,也常禁止使用。

HELP<CRLF>;查詢伺服器支持什麽命令

通信安全

sendmail是在Unix環境下使用最廣泛的實現郵件傳送/接受的郵件傳輸代理程式。由于Sendmail郵件伺服器的特點是功能強大而復雜,因此為保證Sendmail的安全性,需要作以下一些工作。

1、設定Sendmail使用"smrsh"

smrsh程式的目的是作為在mailer中為sendmail定義的"/bin/sh"的替代shell。smrsh是一種受限shell工具,它通過"/

etc/smrsh"目錄來明確指定執行檔的列表。簡而言之smrsh限製了攻擊者可以執行的程式集。當它與sendmail程式一起使用的時候,smrsh有效的將sendmail可以執行的程式的範圍限製在smrsh目錄之下。

第一步:

決定smrsh可以允許sendmail運行的命令列表。缺省情況下應當包含以下命令,但不局限于這些命令:

"/bin/mail"(如果在你的系統中安裝了的話)

"/usr/bin/procmail"(如果在你的系統中安裝了的話)

註意:不可在命令列表裏包括命令解釋程式,例如sh(1),csh(1),perl(1),uudecode(1)及流編輯器sed(1)。

第二步:

在"/etc/smrsh"目錄中建立允許sendmail運行的程式的符號連線。

使用以下命令允許mail程式"/bin/mail"運行:

[root@deep]#cd/etc/smrsh

[root@deep]#ln-s/bin/mailmail

用以下命令允許procmail程式"/usr/bin/procmail"運行:

[root@deep]#cd/etc/smrsh

[root@deep]#ln-s/usr/bin/procmailprocmail

這將允許位于".forward"和"aliases"中的使用者採用"|program"文法來運行mail及procmail程式。

第三步

配置sendmail使之使用受限shell。mailer程式在sendmail的配置檔案"/etc/sendmail .cf"中僅有一行。必須修改"sendmail. cf"檔案中"Mprog"定義的那一行。將"/bin/sh"替換為"/usr/sbin/smrsh"。

編輯"sendmail .cf"檔案(vi/etc/sendmail. cf)並改動下面這一行:

例如:

Mprog,P=/bin/sh,F=lsDFMoqeu9,S=10/30,R=20/40,D=$z:/,T=X-Unix,A=sh-c$u

應該被改為:

Mprog,P=/usr/sbin/smrsh,F=lsDFMoqeu9,S=10/30,R=20/40,D=$z:/,T=X-Unix,A=sh-c$u

用以下命令手工重起sendmail進程:

[root@deep]#/etc/rc.d/init.d/sendmailrestart

2、"/etc/aliases"檔案

如果沒有加以正確和嚴格的管理的話,別名檔案被用來獲取特權。例如,很多發行版本在別名檔案中帶有"decode"別名。這種情況越來越少了。

這樣做的目的是為使用者提供一個通過mail傳輸二進位檔案的方便的方式。在郵件的傳送地,使用者把二進位檔案用"uuencode"轉換成ASCII格式,並把結果郵遞給接收地"decode"別名。那個別名通過通路把郵件訊息傳送到"/usr/bin/uuencode"程式,由這個程式來完成從ASCII轉回到原始的二進位檔案的工作。

移除"decode"別名。類似的,對于所有用于執行沒有被放在smrsh目錄下的程式的別名,你都要仔細的檢查,可能它們都值得懷疑並應當移除它們。要想使你的改變生效,需要運行:

[root@deep]#/usr/bin/newaliases

編輯別名檔案(vi/etc/aliases)並移除以下各行:

#Basicsystemaliases--theseMUSTbepresent.

MAILER-DAEMON:postmaster

postmaster:root

#Generalredirectionsforpseudoaccounts.

bin:root

daemon:root

games:root??移除這一行

ingres:root??移除這一行

nobody:root

system:root??移除這一行

toor:root??移除這一行

uucp:root??移除這一行

#Well-knownaliases.

manager:root??移除這一行

dumper:root??移除這一行

operator:root??移除這一行

#trapdecodetocatchsecurityattacks

decode:root??移除這一行

#Personwhoshouldgetroot'smail

#root:marc

最後應該運行"/usr/bin/newaliases"程式使改動生效

3、避免你的Sendmail被未授權的使用者濫用

最新版本的Sendmail(8.9.3)加入了很強的防止欺騙的特徵。它們可以防止你的郵件伺服器被未授權的使用者濫用。編輯你的"/etc/sendmail.c f"檔案,修改一下這個配置檔案,使你的郵件伺服器能夠擋住欺騙郵件。

編輯"sendmail.c f"檔案(vi/etc/sendmail. cf)並變更下面一行:

OPrivacyOptions=authwarnings

改為:

OPrivacyOptions=authwarnings,noexpn,novrfy

設定"noexpn"使sendmail禁止所有SMTP的"EXPN"命令,它也使sendmail拒絕所有SMTP的"VERB"命令。設定"novrfy"使sendmail禁止所有SMTP的"VRFY"命令。這種變更可以防止欺騙者使用"EXPN"和"VRFY"命令,而這些命令恰恰被那些不守規矩的人所濫用。

4、SMTP的問候信息

當sendmail接受一個SMTP連線的時候,它會向那台機器傳送一個問候信息,這些信息作為本台主機的標識,而且它所做的第一件事就是告訴對方它已經準備好了。

編輯"sendmail. cf"檔案(vi/etc/sendmail. cf)並變更下面一行:

OSmtpGreetingMessage=$jSendmail$v/$Z;$b

改為:

OSmtpGreetingMessage=$jSendmail$v/$Z;$bNOUCEC=xxL=xx

手工重起一下sendmail進程,使剛才所做的變更生效:

[root@deep]#/etc/rc.d/init.d/sendmailrestart

以上的變更將影響到Sendmail在接收一個連線時所顯示的標志信息。你應該把"`C=xxL=xx"條目中的"xx"換成你所在的國家和地區代碼。後面的變更其實不會影響任何東西。但這是"news.admin.net-abuse.email"新聞組的伙伴們推薦的合法做法。

5、限製可以審核郵件佇列內容的人員

通常情況下,任何人都可以使用"mailq"命令來查看郵件佇列的內容。為了限製可以審核郵件佇列內容的人員,隻需要在"/etc/sendmail .cf"檔案中指定"restrictmailq"選項即可。在這種情況下,sendmail隻允許與這個佇列所在目錄的組屬主相同的使用者可以查看它的內容。這將允許許可權為0700的郵件佇列目錄被完全保護起來,而我們限定的合法使用者仍然可以看到它的內容。

編輯"sendmail. cf"檔案(vi/etc/sendmail. cf)並變更下面一行:

OPrivacyOptions=authwarnings,noexpn,novrfy

改為:

OPrivacyOptions=authwarnings,noexpn,novrfy,restrictmailq

我們變更郵件佇列目錄的許可權使它被完全保護起來:

[root@deep]#chmod0700/var/spool/mqueue

註意:我們已經在sendmail.c f中的"PrivacyOptions="行中增加了"noexpn"和"novrfy"選項,現在在這一行中我們接著增加"restrictmailq"選項。

任何一個沒有特權的使用者如果嘗試查看郵件佇列的內容會收到下面的信息:

[user@deep]$/usr/bin/mailq

Youarenotpermittedtoseethequeue

SMTP

6、限製處理郵件佇列的許可權為"root"

通常,任何人都可以使用"-q"開關來處理郵件佇列,為限製隻允許root處理郵件佇列,需要在"/etc/sendma il. cf"檔案中指定"restrictqrun"。

編輯"sendmail. cf"檔案(vi/etc/sendmail. cf)並變更下面一行:

OPrivacyOptions=authwarnings,noexpn,novrfy,restrictmailq

改為:

OPrivacyOptions=authwarnings,noexpn,novrfy,restrictmailq,restrictqrun

任何一個沒有特權的使用者如果嘗試處理郵件佇列的內容會收到下面的信息:

[user@deep]$/usr/sbin/sendmail-q

Youdonothavepermissiontoprocessthequeue

7、在重要的sendmail檔案上設定不可變更位

可以通過使用"chattr"命令而使重要的Sendmail檔案不會被擅自變更,可以提高系統的安全性。具有"+i"屬性的檔案不能被修改:它不能被移除和改名,不能建立到這個檔案的連結,不能向這個檔案寫入資料。隻有超級使用者才能設定和清除這個屬性。

為"sendmail. cf"檔案設定不可變更位:

[root@deep]#chattr+i/etc/sendmail. cf

為"sendmail.cw"檔案設定不可變更位:

[root@deep]#chattr+i/etc/sendmail.cw

為"sendmail. mc"檔案設定不可變更位:

[root@deep]#chattr+i/etc/sendmail. mc

為"null. mc"檔案設定不可變更位:

[root@deep]#chattr+i/etc/null. mc

為"aliases"檔案設定不可變更位:

[root@deep]#chattr+i/etc/aliases

為"access"檔案設定不可變更位:

[root@deep]#chattr+i/etc/mail/access

qmail安全

qmail有一個名為rcpthosts(該檔案名稱源于RCPTTO命令)的配置檔案,其決定了是否接受一個郵件。隻有當一個RCPTTO命令中的接收者地址的域名存在于rcpthosts檔案中時,才接受該郵件,否則就拒絕該郵件。若該檔案不存在,則所有的郵件將被接受。當一個郵件伺服器不管郵件接收者和郵件接收者是誰,而是對所有郵件進行轉發(relay),則該郵件伺服器就被稱為開放轉發(openrelay)的。當qmail伺服器沒有rcpthosts時,其是開放轉發的。

設定自己伺服器為非openrelay的最簡單的辦法就是將你的郵件伺服器的所有域名(若DNS的MX記錄指向該機器,也應該包括該域名。但是這將導致你的在地客戶也被拒絕使用你的伺服器轉發郵件,而要支持客戶使用MUA來傳送郵件,必須允許客戶使用伺服器轉發郵件。qmail-smtpd支持一種有選擇性的忽略rcpthosts檔案的方法:若qmail-smtpd的環境變數RELAYCLIENT被設定,則rcpthost檔案將被忽略,relay將被允許。但是如何識別一個郵件傳送者是否是自己的客戶呢?qmail並沒有採用密碼識別的方法,而是判斷傳送郵件者的源IP地址,若該IP地址屬于在地網路,則認為該傳送者為自己的客戶。

這裏就要使用ucspi-tcp軟體包。在這裏我們要使用該軟體包的tcpserver程式。該程式的功能類似于inetd-監聽進入的連線請求,為要啓動的服務設定各種環境變數,然後啓動指定的服務。

tcpserver的配置檔案是/etc/tcp.smtp,該檔案定義了是否對某個網路設定RELAYCLIENT環境變數。例如,在地網路是地址為192.168.10.0/24的C類地址,則tcp.smtp的內容應該設定如下:

127.0.0.1:allow,RELAYCLIENT=""

192.168.10.:allow,RELAYCLIENT=""

:allow

這幾個規則的含義是指若連線來自127.0.0.1和192.168.10則允許,並且為其設定環境變數RELAYCLIENT,否則允許其他連線,但是不設定RELAYCLIENT環境變數。這樣當從其他地方到在地的25號連線將會被允許,但是由于沒有被設定環境變數,所以其連線將會被qmail-smptd所拒絕。

但是tcopserver並不直接使用/etc/tcp.smtp檔案,而是需要先將該檔案轉化為cbd檔案:

[lix@mail/etc]$#tcprulestcp.smtp.cdbtcp.smtp.temp<tcp.smtp

然後再回頭看在/service/qmail-smtpd目錄下的run檔案中有

/usr/local/bin/tcpserver-v-p-x/etc/tcp.smtp.cdb

可以看到,tcpserver利用了/etc/smtp.cbd檔案。若在地有多個網路,則需要這些網路都出現在/etc/tcp.smtp檔案中。

這樣就實現了允許在地客戶relay郵件,而防止relay被濫用。

常見問題

1. SMTP是什麽?有什麽作用?

SMTP是Simple Mail Transfer Protocol的縮寫,即簡單郵件傳輸協定,是一種提供有效可靠傳送電子郵件的協定,用于在兩台郵件伺服器間交換郵件。負責傳送郵件的伺服器稱為SMTP客戶,負責接收郵件的伺服器稱為SMTP伺服器. 例如本動畫中SMTP-1是客戶,SMTP-2是伺服器. 如果 Alice採用使用者代理形式,則使用者代理是客戶,SMTP-1是伺服器.

2. 什麽是SMTP命令和應答?

SMTP客戶使用命令把郵件信息傳送到伺服器。共有4個字母組成,例如MAIL命令傳送發件人信息,DATA傳送郵件內容等.伺服器使用應答對此回應,由3個數位後面附上簡單的文字說明組成,例如"250 OK" 表示同意客戶發來的命令。

3. 為什麽傳送郵件前先傳送RCPT 命令而不是直接傳送郵件?

先傳送RCPT命令的目的是為了弄清伺服器是否做好接收郵件的準備,然後才傳送郵件. 這樣避免浪費網路資源,不致于傳送了很長的郵件後才發現收件人帳戶有問題,例如查無此人、信箱存儲空間不夠.

4.郵件伺服器間郵件傳輸使用了TCP協定,為何郵件有時還會丟失?

郵件伺服器之間的SMTP協定使用TCP連線,可以保證郵件準確無誤地在郵件伺服器之間傳輸. 但由于郵件伺服器本身的故障,例如郵件空間不足等,會導致郵件無法完成傳輸而導致丟失.

5. 發件人使用者代理為何不直接將郵件傳送給收件人的使用者代理,而是通過郵件伺服器來傳輸?

因為使用者電腦、手機性能有限,無法運行收發郵件的程式,並且無法不間斷地運行並連線到網際網路上. 因此隻能將信件暫時存放在郵件伺服器中,使用者需要時就可以去下載信件.

6. 為什麽使用者收發郵件時感覺不到SMTP過程?

如果使用者使用使用者代理軟體,則這個復雜的過程被使用者代理禁止了,使用者隻需要進行簡單的傳送操作就可完成郵件的傳送. 如果使用者使用Web方式,則所有過程都由郵件伺服器完成.

相關詞條

相關搜尋

其它詞條