您好,登錄后才能下訂單哦!
postfix架構簡介是什么,相信很多沒有經驗的人對此束手無策,為此本文總結了問題出現的原因和解決方法,通過這篇文章希望你能解決這個問題。
postfix怎樣接收郵件
當一封郵件進入postfix系統時,它的第一站是一個叫incoming的隊列。下圖展示了新郵件處理的主要流程,帶數字的表示命令或程序,不帶數字的表示隊列.
trivial- rewrite(8) | ||||||
Network | -> | smtpd(8) | ^ || v | |||
\ | ||||||
Network | -> | qmqpd(8) | -> | cleanup(8) | -> | incoming |
/ | ||||||
pickup(8) | <- | maildrop | ||||
^ | | ||||||
Local | -> | sendmail(1) | -> | postdrop(1) |
網絡上的郵件通過smtpd或qmqpd服務進入postfix,這兩個服務會移除掉郵件的smtp或qmqp協議的封裝信息,對郵件進行健全檢查來保護postfix,然后將發件人,收件人和郵件內容提交給cleanup服務。可以通過配置smtpd來阻止那些不想要的郵件。
通過sendmail命令可以從本地提交郵件給postfix,郵件通過postdrop命令進入maildrop隊列,這個過程在postfix沒有運行時也可以進行。本地服務pickup會對本地提交的郵件進行健全檢查,然后將發件人,收件人和郵件內容提交給cleanup服務。
從內部來源的郵件會直接傳給cleanup(8)服務,這些來源在上表中并沒有展示出來,比如由local(8)轉發的郵件,delivery agent,由bounce(8)退回給sender的郵件,server,postmaster的通知郵件。
cleanup(8)實現了郵件進入隊列前的最最后處理階段。它會補上缺失的From:和其他頭部信息,并將地址轉換為規范格式。此外,它還可以配置成對郵件內容進行輕量檢查和正則檢查。cleanup(8)將處理好的郵件變成一個文件交給incoming隊列,并能知隊列管理器有新郵件到達。
trivial-rewrite(8)將郵件地址重寫成標準格式。當前,postfix并沒有實現一種重寫語言,但是通過lookup表可以實現很多重寫,此外還可以通過正則表達式來實現。
postfix怎么投遞郵件
一旦一封郵件進入了incoming隊列就開始了投遞流程,下表展示了postfix投遞郵個的整個過程:
trivial- rewrite(8) | smtp(8) | -> | Network | |||||
/ | ||||||||
^ || v | - | lmtp(8) | -> | Network | ||||
/ | ||||||||
incoming | -> | active | -> | qmgr(8) | --- | local(8) | -> | File, command |
^ || v | \ | |||||||
- | virtual(8) | -> | File | |||||
deferred | \ | |||||||
pipe(8) | -> | Command |
隊列管理器qmgr(8)是postfix進行郵件投遞的心臟,它連接smtp(8),lmtp(8),local(8),virtual(8),pipe(8),discard(8),error(8)投遞代理,然后發送投遞請求投遞給多個收件人。discard和error代理比較特殊,它們會丟棄和回彈所有郵件,在上表中并沒有展示這兩個服務。隊列管理維護著一個小的active隊列,隊列里的郵件是將要進行投遞的郵件。active隊列對于有可能會很大的incoming和deferred隊列來說就像一個有限大小的窗口,這個窗口限制可以使得postfix不會因為隊列過大而將內存用完。隊列管理器維護著一個 deferred隊列保存那些不能投遞的郵件,這樣即使有大量的郵件積壓也不會影響正常隊列的訪問。
trival-rewrite(8)將每一個收件人地址按本地和遠程進行分類。附加的路由信息可以通過transport(5)表指定。trival-rewrite不定期地查詢relocated(5)表來判斷哪些收件人地址已經改變,發給這些收件人的郵件將返回給發件人并加上說明。
smtp(8)郵件發送客戶端會查詢一系列mx服務器作為目標地址交將按優先級排序,逐個嘗試這些服務器直到其中一個有響應為止,然后按照協議組裝好收件人,發件人和郵件內容,包括了將8-bit MIME轉換為7-bit編碼。
lmtp(8)客戶端使用類smtp協議,是一種為了投遞郵件而優化過的協議。這種做法的好處是一個postfix可以對接多個郵件服務器,當然一臺郵件服務器也可以對接同一個postfix。
local(8)代理能識別unix風格,兼容qmail郵箱目錄文件,sendmail風格的郵件等等。
virtual(8)代理是一個最簡單的代理,只能投遞unix風格和qmail格式的郵件。不過,它可以為多個域名進行投遞,所以特別適合在一臺機器上作為多個小域名的host。
pipe(8)郵寄者是一個與外部郵件處理系統對接的外發接口,兼容unix。
master(8)是postfix郵件系統的監控者,在postfix start命令時啟動,并伴隨著系統的整個運行過程。它負責啟動postfix的進程來接收和投遞郵件,并在服務意外終止時重啟服務,根據master.cf中的配置項來限制服務進程的數量。
anvil(8)服務為smtpd服務實現了客戶端連接和請求頻率限制:
Network->smtpd(8)<->anvil(8)
bounce(8),defer(8),trace(8)每個服務都維護了一個自己的隊列目錄樹,每封郵件對應一個文件,postfix利用這些信息來發送“失敗“,”延遲“或”成功“這些投遞狀態通知給發件人。
cleanup(8) | -> | qmgr(8) Postfix queue | -> | Delivery agents |
^ | | | v | | v | ||
(Non-) delivery notice | <- | bounce(8) defer(8) trace(8) | <- | Queue id, recipient, status |
^ || v | ||||
Per- message logfiles |
flush(8)服務為每個目標維護日志。將延遲隊列中的郵件轉移到incoming隊列進行投遞。
incoming ^ deferred | ||||||||
^ | | ||||||||
smtpd(8) sendmail(1) postqueue(1) | - | Destination to flush | -> | flush(8) | <- | Deferred destination, queue id | - | Delivery agents, qmgr(8) |
^ || v | ||||||||
Per-dest- ination logs |
proxymap(8)為postfix進程提供了只讀和只寫的表查詢服務,這種方式避免了chroot的限制,查詢表可以在多個進程共享,因此減少了表的打開數量,并實現了單個進程來更新表。
scache(8)服務為smtp進程維護連接緩存,可以針對指定目標開啟連接緩存,為了安全起見,postfix會對連接重用的次數進行限制。
showq(8)服務可以列出posfix隊列狀態,供mailq和postqueue命令使用。
spawn(8)服務運行非postfix指令。
tlsmgr(8)服務在postfix為smtp和smtpd開啟了TLS時運行,它有兩個職責:
維護一個偽隨機數生成器生成種子供TLS引擎使用,生成器的狀態定期保存到一上文件,并在tlsmgr啟動時讀取。
維護TLS會話中的key的緩存,緩存key可以提高TLS會話的性能。
verify(8)服務在smtpd在接收郵件前驗證發件人或收件人是否可投遞,驗證服務先去地址驗證緩存進行查詢,如果沒有找到則向postfix隊列注入一個探測消息,由投遞代理或隊列管理器處理狀態更新。
postscreen(8)服務可以放在smtpd進程前面,它的目標是從網絡接收連接并判斷哪些smtp客戶端允許訪問postfix。postscreen的目的是阻止垃圾郵件的發送者,它會維護一個臨時的白名單,白名單中的客戶端可以跳過檢測。
postfix,這個命令是用來啟動,關閉和重啟系統用的,是預留給超級用戶使用的。
postalias,用來維護aliases(5)類型數據庫。
postcat,用來展示隊列中的文件內容,這是一個初級的工具,可能會被有更強大功能是命令取代。
postconf,展示或更新main.cf中的參數。
postdrop,一個郵個發送工具,將郵件放到maildrop隊列。
postkick,使得一些內部通信管道可用,比如供shell腳本用。
postlock,提供了postfix兼容的郵筒鎖,比如供shell腳本用。
postlog,提供了postfix兼容的日志供shell腳本用。
postmap,維護了postfix查詢表,比如canonical(5),virtual(5)。
postmulti,為每一個postfix實例重復”postfix start“命令,并支持創建,刪除postfix實例。
postqueue,是享有特權的命令,供sendmail和mailq用來刷新或列出隊列用。
postsuper,用來維護postfix隊列,它移除舊的臨時文件,并移動隊列文件到正確的目錄,這個命令在postfix啟動和重啟時運行。
看完上述內容,你們掌握postfix架構簡介是什么的方法了嗎?如果還想學到更多技能或想了解更多相關內容,歡迎關注億速云行業資訊頻道,感謝各位的閱讀!
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。