介绍sendmail中mail relay的规则
??????????????????????????介紹sendmail中mail relay的規則
以前總結和寫的一些教程的一些資料,一直沒時間發布到博客上面,五一到了,終于有點時間發布啦!關于Linux上面還會有RHCE系列的學習筆記發表
一.什么是第三方的Mail Relay??
當一臺郵件服務器處理一封郵件時,該封郵件的發送者(the sender)和接收者(the recipient)都不是本地用戶(local user),即發送者和接收者都處于本地域之外,該郵件服務器對于這封郵件的傳送完全屬于不相關的第三方,因此Mail Relay被sedmail默認禁止了。這阻止了Spammer利用你的服務器發送垃圾郵件。?
二.為什么你要停止第三方的Mail Relay??
如果你的郵件服務器不能有效地控制第三方的mail relay,你應該立刻著手解決這個問題,不要等待spammer 來***你的郵件主機,主要是因為:?
a.大量的垃圾郵件(junk email)可能會使你的郵件系統崩潰。它們占用你的磁盤空間,CPU資源,還可能引發Dos類型***(denial of? service attack).?
b.你的組織可能被列入黑名單(backlist)。由于大量垃圾郵件從你的主機發出,其它一些組織或公司可能會不做任何更深的調查就更改設置阻止了從你的主機來的任何郵件,這也將同時阻止從你的站點發到它們的所有正常的商業性郵件,損失不可估量.?
c.意識到這種***將會發生在你身上。不要因為它沒有發生就意味著你是安全的。他們每天正用一些自動掃描的工具去掃描網絡而尋找那些對他們打開relay功能的郵件主機。他們可能自己寫了某個程序正每刻地進行掃描,如果你的郵件主機是易受***的,那么掃描到你就是遲早的事情。?
??? 三. Sendmail(8.9.3)如何relay你的郵件??
????? 如果發送者和接收者都不屬于本地域,sendmail將默認禁止mail relay. 要想使得sendmail relay?
你的郵件,可以有下面兩種途徑,你必須確保發送者或者接收者其中至少有一個屬于本地域.?
a. 本地發送者到外部接收者(local sender to external recipient)?
b. 外部發送者到本地接收者(external sender to local recipient)?
==========?
c. 何為本地發送者(local sender)??
當郵件服務器接收到一封從其它機器(如windows pc)發來的郵件時,它首先檢查連接進來的主機的域名和 IP地址,注意:?
決不是檢查這封郵件的信封里的發送者地址(not based on the envelope MAIL FROM address!)?
(要了解一封郵件的全部信封頭信息,參考(http://www.stopspam.org/email/headers/headers.html))?
如果你是撥號用戶,IP地址當然是你撥到ISP所得到的動態IP地址,然后你的主機名/域名是由你的ISP對你的IP?
地址作反向DNS解析出來的主機名/域名,?
不過大多數ISP不作這個,因此,sendmail將僅僅記錄你連接進來的IP地址,由此判斷是否這個地址被允許relay mail.對sendmail?
8.9.3來說,最通常的用來檢查是否relay郵件的配置文件是/etc/mail/relay-domains,它能對IP地址或域名進行判斷是否允許relay.?
如果這一步不允許,再檢查/etc/mail/access(它能被通過加FEATURE(access_db)到.mc文件再用m4生成/etc/sendmail.cf所激活?
附:本文討論的所有設置都是基于M4宏命令生成的/etc/sendmail.cf)?
d. 何為本地接收者(local recipient )??
決定接收者郵件地址是否為本地的不是件輕松的事情,sendmail認為類w中的所有主機/域為本地接收者,也就是/etc/mail/sendmail.cw文件或者/etc/sendmail.cf中的Cw類定義后面列出的所有主機或域名。為了激活對/etc/mail/sendmail.cw的檢查,使用特性Feature(use_cw_file)。但是這還不夠,因為這個能被愚弄的,如.?
因此sendmail用規則集(ruleset)先移走這個地址的本地部分(?
@local.site)后,如果仍有一些域,則考慮是否能通過relay檢查,另外,sendmail也還檢查/etc/mail/access?
決定是否有項目匹配接收者地址所在的域,根據相應標記確定是否被允許接收。?
四. Sendmail 8.9.3: anti-relaying(拒絕傳遞)怎么工作?
a. 如果Mail From:行有下面的參數,sendmail拒絕mail relay:
1.發送者的域名不能被解析。這個能用FEATURE(accept_unresolvable_domains)被禁止。?
2.非全稱的域名。能被用FEATURE(accept_unresolvable_domains)禁止。?
3.與access map( /etc/mail/access)中的一項匹配。
域名:如spammer.domain? reject
全稱email地址:如spammer@domain reject
郵件地址的用戶名部分:如spammer@? reject
或者不用'reject'用'error code error text'
spammer.domain "501 No e-mail from this domain."
spammer@domain "501 No e-mail from your address."
spammer@ "501 Get a real address."
甚至用DISCARD (接收并安靜地刪除掉,讓發送者感覺象被接收)
b.檢查接收者。
用FEATURE(blacklist_recipients)允許指定access map中不應該接收email的用戶。
如:
badlocaluser 550 Mailbox disabled for this username
host.mydomain 550 That host does not accept mail
user@otherhost.mydomain 550 Mailbox disabled for this recipient
這將禁止發到你本地域中的用戶郵件地址badlocaluse@mydomain和在主機
host.mydomain中的任何用戶和單個地址 user@otherhost.mydomain.
注:關于access map的說明:
它的默認位置是/etc/mail/access. 每次更新后你必須運行
makemap hash /etc/mail/access.db < /etc/mail/access ,不需要重啟用Sendmail.
它可以有以下入口:
1.域名
2.email地址
3.本地用戶名部分
4.IP地址(完整的或者子網)
和以下操作標記:
1.OK?
接收email,即使被其它規則拒絕了
2.RELAY?
允許通過該郵件主機relay的域。relay意味著OK
3.REJECT?
拒絕email并顯示內部通用的錯誤提示
4.DISCARD?
安靜地接收隨后取消掉這封郵件
5.XYZ some other text
XYZ是 RFC 821兼容的錯誤代碼后面跟上一段自定義的錯誤信息
五.常見的兩種檢查規則
1. check_relay 規則(發送者檢查):
檢查主機名和IP地址,當無論什么時候,一臺客戶通過(E)SMTP連到郵件服務器時該規則被調用。??
2. check_rcpt 規則(接收者檢查):
用于RCPT命令(用來禁止未被授權的relay).該規則禁止了所有的已知的relay詭計。
你能#tail -f /var/log/maillog檢查是否某個郵件被運用了上述規則。
六. Why "550 Relaying Denied"??
如果你從你自己的郵件服務器得到了一個錯誤說"550 Relaying Denied",你需要弄清楚為什么,甚至可能你認為這決不應該發生,但是你可能忽略了某些細節,看上去是應該被Relay,但實際上不。看下面的幾個例子:
1.正確的DNS數據?
QAA02454: ... we do not relay
QAA02454: ruleset=check_rcpt, arg1=,
relay=170-51-209.ipt.aol.com [152.170.51.209], reject=550
... we do not relay
QAA02454: from=, size=0, class=0, pri=0, nrcpts=0,
proto=SMTP, relay=170-51-209.ipt.aol.com [152.170.51.209]
這里,主機名為170-51-209.ipt.aol.com的機器IP地址為152.170.51.209 試著交付一封郵件給,然而,這個被拒絕了,因為接收者不是本地接收者并且發送者的機器170-51-209.ipt.aol.com(152.170.51.209)也不是本地發送者。
2.錯誤的DNS數據?
QAA02454: ... Relaying denied
QAA02454: ruleset=check_rcpt, arg1=, relay=[134.245.85.93],
reject=550 ... Relaying denied
QAA02454: from=, size=0, class=0, pri=0, nrcpts=0,
proto=SMTP, relay=[134.245.85.93]
這個其實與上面的情況相同,對于IP地址134.245.85.93沒有PTR記錄被找到,關于這一點有個問題就是:萬一你的郵件主機的relay功能僅僅是基于主機/域名進行檢查是否為本地發送者,(e.g., FEATURE(relay_entire_domain),那樣的話,如果該IP地址是屬于你的本地域之內,仍將被你拒絕relay.解決辦法是為這個IP地址加PTR記錄,也就是反向DNS解析,或者添加到/etc/hosts文件中,再或者添加該IP地址到access map 中去(/etc/mail/access)。
3.不一致的DNS數據
QAA02454: ... Relaying denied
QAA02454: ruleset=check_rcpt, arg1=,
relay=some.domain [10.0.0.1] (may be forged),
reject=550 ... Relaying denied
QAA02454: from=, size=0, class=0, pri=0, nrcpts=0,
proto=SMTP, relay=some.domain [10.0.0.1] (may be forged)
這兒,(may be forged)是個很重要的部分:它說明對于該主機的DNS數據是不一致的,并且主機名不被用來檢查是否被允許relay,而僅僅檢查IP地址,因此這和第二種情況相同。
七. 動態Relay授權控制簡介:(DRAC)
DRAC是一個后臺程序,它動態地為Sendmail更新access map文件,它提供一種方法,就是允許合法的用戶通過你的SMTP郵件主機relay mail,同時仍然阻止其它人用它作為Spam Relay.當用戶被POP/IMAP服務器認證后其IP地址被立即加入/etc/mail/access允許mail relay.默認地,該IP地址在access map的入口在30分鐘后被終止了。
這種功能特別是對那些公司有用,它們在各個地方有辦事處,外地辦事處或出差在外的筆記本用戶通過撥入當地ISP,且設置了發送郵件服務器為本公司的SMTP郵件主機時。
一般地,Sendmail所能看見的唯一可靠的信息是客戶機的主機/域名或IP地址,并且當一個用戶是通過撥本地ISP連接到其本公司總部的SMTP郵件服務器時,Sendmail不能分辯你的用戶是spammer還是本公司合法員工,如果撥號用戶有固定的IP地址/域名,你可以配置sendmail允許他們relay mail.但是大多數情況,特別在中國,撥號用戶每次得到的是不同的變化多端的IP地址,因此你不得不告訴用戶通過他們本地ISP提供的郵件主機發送郵件.
DRAC所用的方法是叫做POP-before-SMTP, 既然POP服務器知道每一個接收郵件的客戶機的IP地址,這些IP地址能被收集起來動態構建access map,你可能需要寫一個程序來收集這些地址,象上面說的一樣,默認保留30分鐘然后取消這些IP地址的mail relay. 一般地定期運行makemap程序更新access map.
這有兩種情況:
1. 撥到ISP后先收后發.
2. 在發件信(outbox)中有信,撥號后先發后收.
第一種情況沒有問題,對于第二種情況,需要在連到POP3信箱收信之后郵件才能被發送,
第一次發送將被拒絕.
第二種情況在被POP3取得認證后,隨即access map被更新允許SMTP Mail Relay.
?
轉載于:https://blog.51cto.com/wqmsl/307846
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的介绍sendmail中mail relay的规则的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Excel:如何使用函数实现多表多条件汇
- 下一篇: ISA CMAK 网络访问隔离区