SMTP(Simple Mail Transfer Protocol)即
簡單郵件傳輸協議,它是一組用於由源地址到目的地址傳送
郵件的規則,由它來控制信件的中轉方式。
SMTP協議屬於
TCP/IP協議簇,它幫助每台
計算機在發送或中轉信件時找到下一個目的地。通過SMTP協議所指定的
服務器,就可以把E-mail寄到收信人的服務器上了,整個過程只要幾分鍾。SMTP
服務器則是遵循SMTP協議的發送
郵件服務器,用來發送或中轉發出的
電子郵件。
它使用由TCP提供的可靠的數據傳輸服務把郵件消息從發信人的郵件服務器傳送到收信人的郵件服務器。跟大多數應用層協議一樣,SMTP也存在兩個 端:在發信人的郵件服務器上執行的客戶端和在收信人的郵件服務器上執行的服務器端。SMTP的客戶端和服務器端同時運行在每個郵件服務器上。當一個郵件服 務器在向其他郵件服務器發送郵件消息時,它是作為SMTP客戶在運行。
SMTP協議與人們用於面對面交互的禮儀之間有許多相似之處。首先,運行在發送端郵件服務器主機上的SMTP客戶,發起建立一個到運行在接收端郵件服務 器主機上的SMTP服務器端口號25之間的TCP連接。如果接收郵件服務器當前不在工作,SMTP客戶就等待一段時間后再嘗試建立該連接。SMTP客戶和服務器先執行一些應用層握手操作。就像人們在轉手東西之前往往先自我介紹那樣,SMTP客戶和服務器也在傳送信息之前先自我介紹一下。 在這個SMTP握手階段,SMTP客戶向服務器分別指出發信人和收信人的電子郵件地址。彼此自我介紹完畢之后,客戶發出郵件消息。
- 中文名
- 簡單郵件傳輸協議
- 外文名
- Simple Mail Transfer Protocol
- 簡 稱
- SMTP
- 作 用
- 傳輸系統之間的郵件信息
- 端 口
- 25
定義
SMTP 獨立於特定的傳輸子系統,且只需要可靠有序的
數據流信道支持。SMTP 重要特性之一是其能跨越
網絡傳輸郵件,即“ SMTP 郵件中繼”。通常,一個網絡可以由公用
互聯網上 TCP 可相互訪問的
主機、防火牆分隔的 TCP/IP 網絡上 TCP 可相互訪問的主機,及其它 LAN/WAN 中的主機利用非 TCP
傳輸層協議組成。使用 SMTP ,可實現相同網絡上
處理機之間的郵件傳輸,也可通過
中繼器或
網關實現某處理機與其它網絡之間的郵件傳輸。在這種方式下,郵件的發送可能經過從發送端到接收端路徑上的大量中間
中繼器或
網關
主機。
域名服務系統(DNS)的郵件交換
服務器可以用來識別出傳輸郵件的下一條 IP 地址。[1]
SMTP是一個相對簡單的基於文本的協議。在其之上指定了一條消息的一個或多個接收者(在大多數情況下被確認是存在的),然后消息文本會被傳輸。可以很簡單地通過telnet程序來測試一個SMTP服務器。SMTP使用TCP端口25。要為一個給定的域名決定一個SMTP服務器,需要使用MX (Mail eXchange)DNS。[1]
Sendmail是最早實現SMTP的郵件傳輸代理之一。到2001年至少有50個程序將SMTP實現為一個客戶端(消息的發送者)或一個服務器(消息的接收者)。一些其他的流行的SMTP服務器程序包括了Philip Hazel的exim,IBM的Postfix,D. J. Bernstein的Qmail,以及Microsoft Exchange Server。[1]
由於這個協議開始是基於純ASCII文本的,它在二進制文件上處理得並不好。諸如MIME的標准被開發來編碼二進制文件以使其通過SMTP來傳輸。今天,大多數SMTP服務器都支持8位MIME擴展,它使二進制文件的傳輸變得幾乎和純文本一樣簡單。[1]
協議原理
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:
交互過程如下:
220 163 .com Anti-spam GT for Coremail System (163com[071018])
HELO smtp.163 .com
250 OK
auth login
334 dXNlcm5hbWU6
USER
base64加密后的用戶名
334 UGFzc3dvcmQ6
PASS
base64加密后的密碼
235 Authentication successful
MAILFROM:XXX@163 .COM
250 Mail OK
RCPTTO:XXX@163 .COM
250 Mail OK
DATA
354 End data with .
queued as smtp5,D9GowLArizfIFTpIxFX8AA==.41385S2
HELO是客戶向對方
郵件服務器發出的標識自己的身份的命令,這里假設發送者為ideal;MAILFROM命令用來表示發送者的郵件地址;RCPTTO:標識接收者的郵件地址,這里表示希望發送郵件給XXX@163. COM,如果郵件接收者不是
本地用戶,例如RCPTTO:ideal,則說明希望對方郵件服務器為自己轉發(Relay)郵件,若該機器允許轉發這樣的郵件,則表示該郵件服務器是OPENRELAY的,否則說明該服務器不允許RELAY;DATA表示下面是郵件的數據部分,輸入完畢以后,以一個"."開始的行作為數據部分的結束標識;QUIT表示退出這次會話,結束郵件發送。
這就是一個簡單的發送郵件的會話過程,其實當使用outlookexpress等客戶軟件發送時,后台進行的
交互也是這樣的,當然,
SMTP協議為了處理復雜的郵件發送情況如附件等等,定義了很多的命令及規定,具體可以通過閱讀RFC2821來獲得。
當你的一個朋友向你發送郵件時,他的
郵件服務器和你的郵件服務器通過S
MTP協議通信,將郵件傳遞給你郵件地址所指示的郵件服務器上(這里假設你的本地郵件服務器是Linux系統),若你通過
telnet協議直接登錄到郵件服務器上,則可以使用mail等客戶軟件直接閱讀郵件,但是若你希望使用本地的
MUA(MailUserAgent,如outlookexpress等客戶軟件)來閱讀郵件,則本地客戶端通過
POP3或IMAP協議與郵件服務器
交互,將郵件信息傳遞到客戶端(如:win98系統)。而如果你向你的朋友回復一封信件時,你所使用的MUA也是通過SMTP協議與郵件服務(一般為發送郵件地址對應的email地址)器通信,指示其希望
郵件服務器幫助轉發一封郵件到你朋友的郵件地址指定的郵件服務器中。若本地
郵件服務器允許你通過它轉發郵件,則服務器通過SMTP協議發送郵件到對方的郵件服務器。這就是接受和發送郵件的全部過程。
配置方法
安裝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的命令和響應都是基於
文本,以命令行為單位,換行符為CR/LF。響應信息一般只有一行,由一個3位數的
代碼開始,后面可附上很簡短的文字說明。
SMTP要經過
建立連接、傳送郵件和釋放連接3個階段。具體為:
(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.數據流
位(表示有后續數據包)。數據包的總長度可以達到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.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協議是一個不錯的協議,可是對它的擴展還是不可避免,本文主要說明了一種擴展方法,使用這種擴展方法,
服務器和用戶之間可以相互知道對方使用了擴展,使用了多少,如果進行通信。
通訊模型
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地址屬於本地網絡,則認為該發送者為自己的客戶。
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 命令而不是直接發送郵件?
4.
郵件服務器間郵件傳輸使用了TCP協議,為何郵件有時還會丟失?
郵件服務器之間的SMTP協議使用TCP連接,可以保證郵件准確無誤地在郵件服務器之間傳輸. 但由於郵件服務器本身的故障,例如郵件空間不足等,會導致郵件無法完成傳輸而導致丟失.
6. 為什么用戶收發郵件時感覺不到SMTP過程?
詞條圖冊更多圖冊

詞條圖片
(7)