以 sendmail 的原本設定來說, 對於任何由其它機器傳來的信件, 如果發現目的地不是自己, 就將其轉往真正的目的主機, 這個動作我們稱之為 Relay
在前面 SMTP 的例子中, 我們知道其他的主機可能會以假的 fromhost, mailfrom, rcpt to 資料來偽造信件, 雖然經由 mail header 的觀察可以看出問題所在, 但是不是所有的使用者都懂得看 mail header, 因此無條件地幫其它機器轉送信件這個動作, 有時會造成不必要的困擾.
sendmail-8.9.0 以後已經改掉這個 "無條件地幫其它機器轉送信件" 的特性了, 而如果您的 sendmail 是 8.8.x 版的, 可以將 這段 rule set 加在您的 sendmail.cf 這個檔裡頭, 讓您對轉送信件能作一些條件上的設定
Anti-Relay rule set 安裝
1. 將 上述 rule set 所指向的 link 另存新檔
2. 修改第 10 行 CR 那行, 將 your.domain 改成 mail server 的 domain
3. 將這個檔案加到您的 sendmail.cf 的最後面
4. touch /etc/sendmail.baddomain /etc/sendmail.baduser
5. 重新啟動您的 sendmail即可
Anti-Relay rule set 內容
為了方便說明, 每行內容前面加有行號, 實際使用時請去掉行號
1 ###################################################################
2 ### Ruleset check_rcpt - anti-relay when deal with RCPT cmd ###
3 ###################################################################
4
5 # define domains that can relay through this host
6 CR cc.ncku.edu.tw ee.ncku.edu.tw
7
8 Scheck_rcpt
9
10 # anything terminating locally is ok
11 R$* $: $>Parse0 $>3 $1
12 R$+<@$*.>$* $: $1<@$2>
13 R$+<@$=w> $@ OK user@local
14 R$+<@$*$=R> $@ OK user@*relayed_domain
15
16 # anything originating locally is ok
17 R$* $: $(dequote "" $&{client_name} $)
18 R$=w $@ OK mail from local
19 R$*$=R $@ OK mail from relayed_domai
20 R$@ $@ OK local user
21
22 # anything else is bogus
23 R$* $# error $: "550 Relaying Denied"
Anti-Relay rule set 說明
首先解釋一些基本符號
1.每行第一個字元如果是英文字母, 都代表一個命令
C 定義 class (想像成定義字串陣列)
S 宣告 rule set 由此開史
R 表是這行是前面宣告的 rule set 的一部份
2. $+ 1 個以上的 token
$* 0 個以上的 token
$=w 代表 w 這個 class 中的任一字串
$=R 代表 R 這個 class 中的任一字串
$@ ok return ok
ps: 在 sendmail 中, w 這個 class 代表這部機器的 FQDN
sendmail 收到 rctp to: 這個命令時, 會自動呼叫一個名叫 check_rcpt 的 rule set,
內定這個 rule set 是空的, 我們現在透過這個 rule set 來對一些郵件做檢查的動作
為了方便說明, 我們舉例如下, eesol01 上的 sendmail 現在正接受 venus 的 SMTP connecttion, 接受一封信件
6: 定義 R 這個 class 為字串 cc.ncku.edu.tw 和 ee.ncku.edu.tw (想成字串陣列)
8: 宣告 check_rcpt 這個 rule set 由此開始, 其後以 R 開頭的各行就是這個 rule set 的內容
11,12: 把 rcpt to: 的 email address 由 <Tung@turtle.ee.ncku.edu.tw>
轉成 Tung<@turtle.ee.ncku.edu.tw>
13: 檢查 Tung<@turtle.ee.ncku.edu.tw>
是否符合 *<@eesol01.ee.ncku.edu.tw>
14: 檢查 Tung<@turtle.ee.ncku.edu.tw>
是否符合 *<@*cc.ncku.edu.tw> 或 *<@*.ee.ncku.edu.tw>
17:取得送信過來給 eesol01 的主機的 domainname, 也就是 venus.ee.ncku.edu.tw
注意, 不是在 helo message 中填的 fromhost, 而是指轉信過來的機器
18:檢查 venus.ee.ncku.edu.tw 是否符合 eesol01.ee.ncku.edu.tw
19:檢查 venus.ee.ncku.edu.tw 是否符合 *.cc.ncku.edu.tw 及 *.ee.ncku.edu.tw
23:如果以上檢查都不符合, 則傳回 "550 Relaying Denied", 拒絕傳送
在上面的例子中 eesol01 會幫所有目的地是 *.ee.ncku.edu.tw *.cc.ncku.edu.tw 的信件做 relay 動作, 而不管它是由誰發出的. 如果目的地不是 *.cc.ncku.edu.tw 也不是 *.ee.ncku.edu.tw, 那麼會 eesol01 會檢查看這封信是由哪部機器轉進來的, 如果符合 *.cc.ncku.edu.tw 或 *.ee.ncku.edu.tw 就認定可以幫忙轉送, 除此之外, 一律拒絕傳送
讓 8.9.x 幫忙代轉信件
前面提到 8.9.x 內定已經將幫忙轉信的功能關掉了, 但是在您的單位內可能還是有許多使用 Netscape/Outlook 寄信的使用者, 需要以您的主機作為 SMTP server 來寄信, 因此我們需要部份地開放轉寄的功能.
1. 首先找找您的 /etc/sendmail.cf 中是否有以下兩行
# Hosts that will permit relaying ($=R)
FR-o /etc/mail/relay-domains
2. 將您要代為轉信的 domain 寫在上面所寫的 /etc/mail/relay-domains 這個檔案中, 比如說我們要幫所有 ee.ncku.edu.tw 的機器轉送信件, 就在這個檔案寫入
ee.ncku.edu.tw
這一行就可以了, 如果要幫不只一個 domain 轉信, 那麼就多寫幾行就可以了.
最後我們總結一下 sendmail 在裝設及使用上一些該注意的地方
1. 修改 /etc/host.conf, 讓 hosts 擺在 bind 那行之前, 這樣一來讓這部主機在查一部機器的正反解時, 都會先找 /etc/hosts 找不到再向 DNS 查詢. 這樣一來可以避免當 DNS 連不上時, 要很久才會去查 hosts, 同時也可以將一些無法在 DNS 上建 record 的機器先定在 hosts 裡.
2. /etc/hosts 中在定義機器名稱時, 同一行中, 完整的名稱先寫, 縮寫型的機器名稱後寫, 免得這部主機透過 hosts 反查時查到縮寫名稱
3. sendmail 所在的主機, 其 FQDN(fully qualified domain name) 應該
a. 在 /etc/hosts 要定義, 免得開機時因為連不上 DNS 而使得 sendmail 執行會 hang 在那邊.
b. 在 DNS 上有正解, 讓別台主機可以用 domain name 把信寄到你的機器上.
c. 在 DNS 上有反解, 你這部主機才可能可以透過別的機器的 sendmail 轉寄信件 (因 anti-relay 會先 check connect from 機器的 domain)
4. 所有要透過這部 sendmail 主機寄信的機器, 必須
a. 在 DNS 上有反解, 或在這部 sendmail 主機的 /etc/hosts 有定義, 以便 sendmail 能反查出那部機器的 domain
b. 在 a. 所查到的 domain 必須要在 /etc/relay-domains 中有寫出來
5. 基本上 sendmail 8.9.x 在收到一封信件時,
a. check 發信地址中的 hostname 是否 resolvable
b. check 收信地址中的 hostname 是否 resolvable
c. 當 sender 和 receiver 都不是這部主機時, 認定為 relay mail, 此時必須
c.1 connect from 的 host 的反查所得的 domain 在 /etc/relay-domains 中有定義 或是
c.2 receiver 所在的主機, 其在 DNS 上有定義這部 sendmail 主機是它的 MX(mail exchanger)
要合乎上面三個條件信才會被收進來, 然後才進行轉寄的動作...
在 sendmail source 中的 cf/README 有提到許多關於 sendmail 設定的說明, 很值得參考.
(FreeBSD 的 sendmail source 文件 放在 /usr/src/contrib/sendmail/,
Linux RedHat sendmail 文件放在 /usr/share/sendmail-cf ) )
RedHat Linux 的 Sendmail.cf 修改
為了安全的考量, 某些系統上的 sendmail.cf 內定只聽在 127.0.0.1 這個 IP, 所以 sendmail 只接受 local 的連線 (即 local 的程式可以送信出去), 但是卻無法接收 remote 端的連線(即無法接受 remote 送來的信件). 如果您的機器發生這樣的情形, 解決步驟如下:
自由广告区 |
分类导航 |
邮件新闻资讯: IT业界 | 邮件服务器 | 邮件趣闻 | 移动电邮 电子邮箱 | 反垃圾邮件|邮件客户端|网络安全 行业数据 | 邮件人物 | 网站公告 | 行业法规 网络技术: 邮件原理 | 网络协议 | 网络管理 | 传输介质 线路接入 | 路由接口 | 邮件存储 | 华为3Com CISCO技术 | 网络与服务器硬件 操作系统: Windows 9X | Linux&Uinx | Windows NT Windows Vista | FreeBSD | 其它操作系统 邮件服务器: 程序与开发 | Exchange | Qmail | Postfix Sendmail | MDaemon | Domino | Foxmail KerioMail | JavaMail | Winwebmail |James Merak&VisNetic | CMailServer | WinMail 金笛邮件系统 | 其它 | 反垃圾邮件: 综述| 客户端反垃圾邮件|服务器端反垃圾邮件 邮件客户端软件: Outlook | Foxmail | DreamMail| KooMail The bat | 雷鸟 | Eudora |Becky! |Pegasus IncrediMail |其它 电子邮箱: 个人邮箱 | 企业邮箱 |Gmail 移动电子邮件:服务器 | 客户端 | 技术前沿 邮件网络安全: 软件漏洞 | 安全知识 | 病毒公告 |防火墙 攻防技术 | 病毒查杀| ISA | 数字签名 邮件营销: Email营销 | 网络营销 | 营销技巧 |营销案例 邮件人才:招聘 | 职场 | 培训 | 指南 | 职场 解决方案: 邮件系统|反垃圾邮件 |安全 |移动电邮 |招标 产品评测: 邮件系统 |反垃圾邮件 |邮箱 |安全 |客户端 |