| access | 定義哪些網域或 ip 來的信可以被接受,哪些不行,當某個主機一直對我們寄出垃圾郵件,我們可以使用此機制來阻擋它,通常 access 會同時檢查收信人與寄信人的郵件地址,只要其中一個符合就算是比對成功,新版 sendmail 推出後大幅擴充 access 的功能,顯得 relay-domains 有點多餘(有將被淘汰的感覺),但其實它們各有各的好處 | | relay-domains | 定義哪些網域或 ip 可以要求寄信,如果您要允許使用者透過其它 ISP 使用 MUA 連上伺服器寄信,您必須先將該 ISP 的 IP 範圍加到這個設定檔內,與 access 不同的是這個檔不用雜湊成 db 資料庫,設定上也比較簡易 | | domaintable | 用來產生網域名稱對應,通常是當學校的網域名稱改變時,為了讓使用舊地址的信件也能正常遞送,因此才設定 | | local-host-names | 定義主機的所有別名 | | mailertable | 定義分信路由,把收到的信依照郵件地址樣式的比對,分給外掛濾信程式處理或轉送給濾信主機處理 | | virtusertable | 定義如何轉送要給虛擬網域或虛擬使用者的信件,這類信件將會轉送給某個真實存在的帳號 ,主要用來讓多個不同網域可以使用同一台郵件主機,對 ISP 公司來說很需要 | | genericstable | 由於 8.12 版的 sendmail 已不再接受郵件地址不完整的信件(例如:shane@my_hostname),因此這類不完整的名稱必須改寫成合法的名稱, 這個檔案用來定義要把哪些名稱改為哪一個名稱,它也可以用來改寫 @ 前面的帳號名稱,作此用途時其作用與 userdb 相同 | | userdb | 當本機是 mail gateway 時,透過這個檔可以得知哪些使用者是位於哪一台郵件主機上,分信時會分給該主機,而非分到本機的 /var/spool/mail 中,這個功能也可以用 aliases 達成 | | aliases | 這個檔也是用來作郵件轉寄,一般拿來作別名對應或郵寄清單來應用,事實上 sendmail 上的轉寄機制很多,而且只要稍微修改設定也都能彼此取代,但我們應該明白其原始設計的用意,盡量不要去混用它們,以避免轉寄規則過於複雜,造成事後除錯的痛苦 |
以上設定檔均擺放在 /etc/mail 目錄,其中 access、domaintable、mailertable、virtusertable、genericstable 等五檔案必須將資料雜湊至資料庫內才能讓 sendmail 引用,我們使用以下指令來進行: makemap hash /etc/mail/access < /etc/mail/access(前一個檔案是指 access.db 省略了附加檔名,後一個是指純文字檔的 access) userdb 必須以 btree 建立索引才能 sendmail 引用,我們使用以下指令來進行: makemap btree /etc/mail/userdb < /etc/mail/userdb.txt 使用 MX 紀錄來簡化郵寄地址 希望讓郵件寄出時能夠直接使用網域名稱而非主機名稱來寄信,例如:shane@spps.tp.edu.tw,這必須修改 /etc/mail/sendmail.mc 中的 Masquerade 設定,修改成: FEATURE(always_add_domain)dnl FEATURE(`masquerade_entire_domain')dnl FEATURE(`masquerade_envelope')dnl FEATURE(`allmasquerade')dnl MASQUERADE_DOMAIN(`spps.tp.edu.tw')dnl MASQUERADE_AS(spps.tp.edu.tw)dnl 要讓寄到 shane@spps.tp.edu.tw 的信件能正確分信,除了在 /etc/mail/sendmail.mc 需包含 FEATURE (`relay_based_on_MX') 設定外,還必須在 DNS 中加入 MX 紀錄,由於加入 DNS 紀錄後必須等三天才能生效(DNS 預設值未修改的話),因此不用急著去測試! 請參考下圖,MX紀錄中應包含三個欄位,首先是郵件遞送的目的地(以網域名稱來判斷),接著指定要處理信件的伺服器,最後是優先權,數字越小越優先。一般觀念中認為 MX 紀錄是用來讓對方寄信給我們時查詢用的,這觀念並不完全正確,事實上當我們的郵件主機嘗試寄信時也會去查詢 MX 紀錄,以便得知是否要將信件傳遞給某台特定主機由它統一轉信,這個機制是用來實作 mail gateway,請用這個觀點來理解 sendmail.mc 中跟 MX 相關的選項,這樣觀念才不會錯誤! 

實作 Mail Gateway 使用 MX 紀錄最主要的目的,是要實作 Mail Gateway,簡化郵寄地址只能算是副產品,假設校園內有兩台郵件主機 mail.spps.tp.edu.tw 和 stu.spps.tp.edu.tw,現在已經在 DNS 內加入 MX 紀錄,將 spps.tp.edu.tw 的郵件交換主機設為 mail.spps.tp.edu.tw,所有寄到 s61533@spps.tp.edu.tw 的信件都將由 mail.spps.tp.edu.tw 來接收,這樣 stu.spps.tp.edu.tw 上的使用者就無法享受簡化郵寄地址的便利了! 解決的方法就是讓 mail.spps.tp.edu.tw 成為 stu.spps.tp.edu.tw 的 mail gateway,首先在 mail.spps.tp.edu.tw 主機上將 spps.tp.edu.tw 加入到 /etc/local-host-names,也可以修改 sendmail.cw 或直接在 sendmail.mc 加入 Cwlocalhost mail.spps.tp.edu.tw spps.tp.edu.tw,這些做法結果都相同,這樣 sendmail 就會把要給 s61533@spps.tp.edu.tw 的信件視為本機郵件,但是要怎樣把信件轉送到 stu.spps.tp.edu.tw 上呢?請修改 /etc/mail/userdb.txt ,如下: s61533 s61533@stu.spps.tp.edu.tw 寫好後不要忘記要用 makemap btree 來建立 userdb.db 檔,這個功能也可以用 virtusertable、genericstable、aliases 來做,但建議不要這樣做,因為當出現問題需要除錯時將會很痛苦! 到這裡已經解決了收信的問題,寄信的問題稍微有點麻煩:首先請在 stu.spps.tp.edu.tw 主機上設定 Smart Host,請在 sendmail.mc 加入 define(`SMART_HOST', `mail.spps.tp.edu.tw')、MASQUERADE_DOMAIN(`spps.tp.edu.tw') 和 MASQUERADE_AS(spps.tp.edu.tw),這樣所有從 stu.spps.tp.edu.tw 寄出的信件將會被轉送到 mail.spps.tp.edu.tw,同時會使用簡化的郵寄地址來寄信。不要忘記 sendmail 預設會擋 relay,因此當 stu.spps.tp.edu.tw 把信件轉送給 mail.spps.tp.edu.tw 時會被拒收,這時我們必須修改 mail.spps.tp.edu.tw 的設定對 stu.spps.tp.edu.tw 主機開放 relay 才行,開放 relay 可以直接把 stu.spps.tp.edu.tw 的 ip 直接寫入 /etc/relay-domains 中,或是使用 access 來控制,也可以直接在 sendmail.mc 加入RELAY_DOMAIN(`stu.spps.tp.edu.tw'),這些做法結果是相同的。 使用 mail gateway 最大的好處是可以統一濾信,擋垃圾信或病毒信的工作只要在 mail gateway 上設定就可以了,不用同時去修改下屬郵件主機,萬一這種機器很多的話,工作負擔會很重。 使用 postfix 取代 sendmail 由於 sendmail 過去的名聲很不好,因此也有些版本的 Linux 直接以 postfix 取代 sendmail,Red Hat 公司也感覺到這股潮流不可擋,因此也提供 postfix 與 sendmail 的 轉換機制,在 Red Hat Linux 上要從 sendmail 轉換成 postfix 是很容易的,直接輸入 redhat-switchmail 指令,然後選擇要轉換的 MTA 即可,轉換後不要忘記將舊的服務停掉,並啟動新的服務,例如: service sendmail stop service postfix start postfix 的組態檔是在 /etc/main.cf 和 /etc/master.cf,請自行參考 postfix 相關系統文件進行設定。 如何防止垃圾郵件 在 sendmail 上,防止垃圾郵件轉寄的問題,可以透過以下四個機制來調整: - 預設不作轉信,換句話說,寄信人或收信人其中之一必須是來自本機的 Domain Name 才受理
- 對寄信人的網址進行 DNS 查詢
- 透過 /etc/mail/access.db 進行存取控管
- 透過信件標頭的特徵比對,來過濾垃圾郵件
以上四種方法其實很難防止垃圾郵件的攻擊,原因是新一代的廣告信發信程式,早已針對這些措施擬出應對的策略,例如: - 將寄信人地址偽裝成來自本機網域
- 寄信給本機網域的使用者,同時將要大量發信的對象使用 BCC 標頭以隱密副本方式發送
- 使用偽裝的 IP 位址來寄信,以規避 DNS 反查(缺點是這樣將無法確認是否交寄成功)
- 透過 socket proxy 交寄郵件來躲避防火牆稽核
- 透過後門程式從防火牆內模擬合法使用者交寄郵件
就是因為廣告信發信程式「道高一尺,魔高一丈」,因此造成系管師人人自危,視提供郵件服務為畏途。事實上 sendmail 複雜的送信機制是造成垃圾郵件之所以難以預防的主因,然而這些送信機制對於郵件的遞送處理又是不可或缺的,想要徹底阻擋垃圾郵件,不能不了解 sendmail 的送信機制,在前幾個小節已經詳細交代 sendmail 裡可以使用的功能和微調選項,筆者特別整理下表來幫助大家了解 sendmail 到底在做些什麼事: | 工作內容 | 處理步驟 | 相關功能選項 | | 信件標頭欄位剖析 | 檢查標頭欄位是否完整 | 略 | 改寫寄信人欄位 (check_mail) | 是否需要改寫 domain | always_add_domain local_no_masquerade limited_masquerade masquerade_entire_domain accept_unresolvable_domains | | 是否需要改寫 username | ldap_routing accept_unqualified_senders | | 檢查寄信人網域是否完整 | nocanonify | | 檢查寄信人網域是否存在 | nodns | 改寫收信人欄位 (check_rcpt) | 是否需要改寫 domain | domaintab allmasquerade local_no_masquerade use_cw_file | | 是否需要改寫 username | virtusertable genericstable redirect userdb | | 檢查收信人網域是否完整 | nocanonify | 轉信存取控制檢查 (check_relay) | 如何進行轉信存取控制檢查 | promiscuous_relay delay_checks | | 檢查哪些 domain 可以 Relay | relay-domains access relay_entire_domain relay_hosts_only relay_based_on_MX relay_mail_from relay_local_from blacklist_recipients dnsbl enhdnsbl lookupdotdomain | | 檢查哪些 user 可以 Relay | use_ct_file blacklist_recipients | | 是否通過帳號驗證 | auth_options | | 遞送信件 | 將待寄信件寫入 mail queue | 略 | | 分信處理 | 給本機的信件要如何進行分信 | mailertable | | 是否為虛擬信箱 | aliases | | 是否需要轉信 | .forward |
利用 access.db 對轉寄要求進行存取控管是 sendmail 裡最重要的功能之一,從底下範例來介紹 access 的設定方法: spammer@aol.com REJECT cyberspammer.com REJECT TLD REJECT 192.168.212 REJECT IPv6:2002:c0a8:02c7 RELAY IPv6:2002:c0a8:51d2::23f4 REJECT | 核對寄信人或收信人信箱是否為 spammer@aol.com 核對寄信人或收信人網域是否為 cyberspammer.com 核對寄信人或收信人網域是否為 TLD 開頭的名稱 核對提出寄信要求的 IP 是否為 192.168.212 開頭 核對提出寄信要求的 IP 是否為 ipv6 格式 核對提出寄信要求的 IP 是否為 ipv6 格式中的子網域 |
除了使用 REJECT 來拒絕轉信要求外,也可以使用 RELAY 來接受轉信要求,如果想讓被拒絕轉信的網域中某些單機仍然可以轉信,或是某個被拒絕的網段中的某個 IP 允許轉信,這兩種情形下可以設定成 OK,類似的情形下想讓某個網段中的某個 IP 或某個網域中的某台主機不要進行比對,則可以使用 SKIP,DISCARD 用來將信件完全丟棄,與 REJECT 不同的是將不會產生退信通知,ERROR 也是用來 REJECT 轉信,但是可以指定退信通知的訊息內容,應用範例如下: cyberspammer.com ERROR:550 "We don't accept mail from spammers" okay.cyberspammer.com OK sendmail.org RELAY 128.32 RELAY 使用 access 除了單純樣本比對外,還可以指定比對欄位,事實上使用這種方式來比對,對於防止垃圾郵件更為有效,舉例來說: mail.spps.tp.edu.tw RELAY 這條規則會允許假冒寄信人地址為 user@mail.spps.tp.edu.tw 的信件,能夠成功透過本機進行轉寄,如果改為: To:mail.spps.tp.edu.tw RELAY Connect:192.57 RELAY 則保證只有收信人地址是 user@mail.spps.tp.edu.tw 的信件,本機才接受,另配合 ip 的比對來讓校內機器可以正常寄信,由於限定比對連線者(Connect)的 ip,所以即使把寄信人地址改為 user@[192.57.1.2] ,本機還是會擋掉不 Relay,這比起單純的樣式比對擋得更徹底。更複雜的應用如下面的例子: From:spammer@some.dom REJECT To:friend.domain RELAY Connect:friend.domain OK Connect:from.domain RELAY From:good@another.dom OK From:another.dom REJECT 當啟用 FEATURE(`delay_checks') 選項時,可以附加以下兩個選項: FEATURE(`delay_checks', `friend') FEATURE(`delay_checks', `hater') 這時候在 access.db 裡,就可以使用下列語法來宣告垃圾郵件的同路人,sendmail 將會在退信通知中,提示對方郵件主機遭人利用轉信的訊息,底下語法分別是比對郵寄地址、使用者名稱和網域名稱。 Spam:abuse@my.domain FRIEND Spam:abuse@ FRIEND Spam:spam.domain FRIEND 想要完全防堵垃圾郵件,最有效的方法就是使用 SMTP AUTH 功能,當你啟用此功能後,如果對方能通過帳號密碼驗證,就可以取得 Relay 的權限,但透過其他方式 Relay 仍然是被接受的,例如:通過 access.db 的檢查、透過 relay-domains 的宣告、透過 MX 紀錄或通過 trusted-user 的宣告......等等。因此想徹底防禦垃圾郵件,第一件事就是必須把其他功能關閉或做最大限制,筆者的做法是: - 不使用 MX 紀錄
- trusted-user 和 relay-domains 保持淨空
- access 中僅包含 127.0.0.1 RELAY 、 localhost RELAY 和 localhost.localdomain RELAY 三行
- 設定驗證機制時,不開放 LOGIN 和 PLAIN
在這種嚴格的限制下,學校老師不管在家裡寄信或在學校寄信(透過 WEB 介面除外),都必須修改 outlook express 的設定,設定如下: 
| access | 定義哪些網域或 ip 來的信可以被接受,哪些不行,當某個主機一直對我們寄出垃圾郵件,我們可以使用此機制來阻擋它,通常 access 會同時檢查收信人與寄信人的郵件地址,只要其中一個符合就算是比對成功,新版 sendmail 推出後大幅擴充 access 的功能,顯得 relay-domains 有點多餘(有將被淘汰的感覺),但其實它們各有各的好處 | | relay-domains | 定義哪些網域或 ip 可以要求寄信,如果您要允許使用者透過其它 ISP 使用 MUA 連上伺服器寄信,您必須先將該 ISP 的 IP 範圍加到這個設定檔內,與 access 不同的是這個檔不用雜湊成 db 資料庫,設定上也比較簡易 | | domaintable | 用來產生網域名稱對應,通常是當學校的網域名稱改變時,為了讓使用舊地址的信件也能正常遞送,因此才設定 | | local-host-names | 定義主機的所有別名 | | mailertable | 定義分信路由,把收到的信依照郵件地址樣式的比對,分給外掛濾信程式處理或轉送給濾信主機處理 | | virtusertable | 定義如何轉送要給虛擬網域或虛擬使用者的信件,這類信件將會轉送給某個真實存在的帳號 ,主要用來讓多個不同網域可以使用同一台郵件主機,對 ISP 公司來說很需要 | | genericstable | 由於 8.12 版的 sendmail 已不再接受郵件地址不完整的信件(例如:shane@my_hostname),因此這類不完整的名稱必須改寫成合法的名稱, 這個檔案用來定義要把哪些名稱改為哪一個名稱,它也可以用來改寫 @ 前面的帳號名稱,作此用途時其作用與 userdb 相同 | | userdb | 當本機是 mail gateway 時,透過這個檔可以得知哪些使用者是位於哪一台郵件主機上,分信時會分給該主機,而非分到本機的 /var/spool/mail 中,這個功能也可以用 aliases 達成 | | aliases | 這個檔也是用來作郵件轉寄,一般拿來作別名對應或郵寄清單來應用,事實上 sendmail 上的轉寄機制很多,而且只要稍微修改設定也都能彼此取代,但我們應該明白其原始設計的用意,盡量不要去混用它們,以避免轉寄規則過於複雜,造成事後除錯的痛苦 |
以上設定檔均擺放在 /etc/mail 目錄,其中 access、domaintable、mailertable、virtusertable、genericstable 等五檔案必須將資料雜湊至資料庫內才能讓 sendmail 引用,我們使用以下指令來進行: makemap hash /etc/mail/access < /etc/mail/access(前一個檔案是指 access.db 省略了附加檔名,後一個是指純文字檔的 access) userdb 必須以 btree 建立索引才能 sendmail 引用,我們使用以下指令來進行: makemap btree /etc/mail/userdb < /etc/mail/userdb.txt 使用 MX 紀錄來簡化郵寄地址 希望讓郵件寄出時能夠直接使用網域名稱而非主機名稱來寄信,例如:shane@spps.tp.edu.tw,這必須修改 /etc/mail/sendmail.mc 中的 Masquerade 設定,修改成: FEATURE(always_add_domain)dnl FEATURE(`masquerade_entire_domain')dnl FEATURE(`masquerade_envelope')dnl FEATURE(`allmasquerade')dnl MASQUERADE_DOMAIN(`spps.tp.edu.tw')dnl MASQUERADE_AS(spps.tp.edu.tw)dnl 要讓寄到 shane@spps.tp.edu.tw 的信件能正確分信,除了在 /etc/mail/sendmail.mc 需包含 FEATURE (`relay_based_on_MX') 設定外,還必須在 DNS 中加入 MX 紀錄,由於加入 DNS 紀錄後必須等三天才能生效(DNS 預設值未修改的話),因此不用急著去測試! 請參考下圖,MX紀錄中應包含三個欄位,首先是郵件遞送的目的地(以網域名稱來判斷),接著指定要處理信件的伺服器,最後是優先權,數字越小越優先。一般觀念中認為 MX 紀錄是用來讓對方寄信給我們時查詢用的,這觀念並不完全正確,事實上當我們的郵件主機嘗試寄信時也會去查詢 MX 紀錄,以便得知是否要將信件傳遞給某台特定主機由它統一轉信,這個機制是用來實作 mail gateway,請用這個觀點來理解 sendmail.mc 中跟 MX 相關的選項,這樣觀念才不會錯誤! 

實作 Mail Gateway 使用 MX 紀錄最主要的目的,是要實作 Mail Gateway,簡化郵寄地址只能算是副產品,假設校園內有兩台郵件主機 mail.spps.tp.edu.tw 和 stu.spps.tp.edu.tw,現在已經在 DNS 內加入 MX 紀錄,將 spps.tp.edu.tw 的郵件交換主機設為 mail.spps.tp.edu.tw,所有寄到 s61533@spps.tp.edu.tw 的信件都將由 mail.spps.tp.edu.tw 來接收,這樣 stu.spps.tp.edu.tw 上的使用者就無法享受簡化郵寄地址的便利了! 解決的方法就是讓 mail.spps.tp.edu.tw 成為 stu.spps.tp.edu.tw 的 mail gateway,首先在 mail.spps.tp.edu.tw 主機上將 spps.tp.edu.tw 加入到 /etc/local-host-names,也可以修改 sendmail.cw 或直接在 sendmail.mc 加入 Cwlocalhost mail.spps.tp.edu.tw spps.tp.edu.tw,這些做法結果都相同,這樣 sendmail 就會把要給 s61533@spps.tp.edu.tw 的信件視為本機郵件,但是要怎樣把信件轉送到 stu.spps.tp.edu.tw 上呢?請修改 /etc/mail/userdb.txt ,如下: s61533 s61533@stu.spps.tp.edu.tw 寫好後不要忘記要用 makemap btree 來建立 userdb.db 檔,這個功能也可以用 virtusertable、genericstable、aliases 來做,但建議不要這樣做,因為當出現問題需要除錯時將會很痛苦! 到這裡已經解決了收信的問題,寄信的問題稍微有點麻煩:首先請在 stu.spps.tp.edu.tw 主機上設定 Smart Host,請在 sendmail.mc 加入 define(`SMART_HOST', `mail.spps.tp.edu.tw')、MASQUERADE_DOMAIN(`spps.tp.edu.tw') 和 MASQUERADE_AS(spps.tp.edu.tw),這樣所有從 stu.spps.tp.edu.tw 寄出的信件將會被轉送到 mail.spps.tp.edu.tw,同時會使用簡化的郵寄地址來寄信。不要忘記 sendmail 預設會擋 relay,因此當 stu.spps.tp.edu.tw 把信件轉送給 mail.spps.tp.edu.tw 時會被拒收,這時我們必須修改 mail.spps.tp.edu.tw 的設定對 stu.spps.tp.edu.tw 主機開放 relay 才行,開放 relay 可以直接把 stu.spps.tp.edu.tw 的 ip 直接寫入 /etc/relay-domains 中,或是使用 access 來控制,也可以直接在 sendmail.mc 加入RELAY_DOMAIN(`stu.spps.tp.edu.tw'),這些做法結果是相同的。 使用 mail gateway 最大的好處是可以統一濾信,擋垃圾信或病毒信的工作只要在 mail gateway 上設定就可以了,不用同時去修改下屬郵件主機,萬一這種機器很多的話,工作負擔會很重。 使用 postfix 取代 sendmail 由於 sendmail 過去的名聲很不好,因此也有些版本的 Linux 直接以 postfix 取代 sendmail,Red Hat 公司也感覺到這股潮流不可擋,因此也提供 postfix 與 sendmail 的 轉換機制,在 Red Hat Linux 上要從 sendmail 轉換成 postfix 是很容易的,直接輸入 redhat-switchmail 指令,然後選擇要轉換的 MTA 即可,轉換後不要忘記將舊的服務停掉,並啟動新的服務,例如: service sendmail stop service postfix start postfix 的組態檔是在 /etc/main.cf 和 /etc/master.cf,請自行參考 postfix 相關系統文件進行設定。 如何防止垃圾郵件 在 sendmail 上,防止垃圾郵件轉寄的問題,可以透過以下四個機制來調整: - 預設不作轉信,換句話說,寄信人或收信人其中之一必須是來自本機的 Domain Name 才受理
- 對寄信人的網址進行 DNS 查詢
- 透過 /etc/mail/access.db 進行存取控管
- 透過信件標頭的特徵比對,來過濾垃圾郵件
以上四種方法其實很難防止垃圾郵件的攻擊,原因是新一代的廣告信發信程式,早已針對這些措施擬出應對的策略,例如: - 將寄信人地址偽裝成來自本機網域
- 寄信給本機網域的使用者,同時將要大量發信的對象使用 BCC 標頭以隱密副本方式發送
- 使用偽裝的 IP 位址來寄信,以規避 DNS 反查(缺點是這樣將無法確認是否交寄成功)
- 透過 socket proxy 交寄郵件來躲避防火牆稽核
- 透過後門程式從防火牆內模擬合法使用者交寄郵件
就是因為廣告信發信程式「道高一尺,魔高一丈」,因此造成系管師人人自危,視提供郵件服務為畏途。事實上 sendmail 複雜的送信機制是造成垃圾郵件之所以難以預防的主因,然而這些送信機制對於郵件的遞送處理又是不可或缺的,想要徹底阻擋垃圾郵件,不能不了解 sendmail 的送信機制,在前幾個小節已經詳細交代 sendmail 裡可以使用的功能和微調選項,筆者特別整理下表來幫助大家了解 sendmail 到底在做些什麼事: | 工作內容 | 處理步驟 | 相關功能選項 | | 信件標頭欄位剖析 | 檢查標頭欄位是否完整 | 略 | 改寫寄信人欄位 (check_mail) | 是否需要改寫 domain | always_add_domain local_no_masquerade limited_masquerade masquerade_entire_domain accept_unresolvable_domains | | 是否需要改寫 username | ldap_routing accept_unqualified_senders | | 檢查寄信人網域是否完整 | nocanonify | | 檢查寄信人網域是否存在 | nodns | 改寫收信人欄位 (check_rcpt) | 是否需要改寫 domain | domaintab allmasquerade local_no_masquerade use_cw_file | | 是否需要改寫 username | virtusertable genericstable redirect userdb | | 檢查收信人網域是否完整 | nocanonify | 轉信存取控制檢查 (check_relay) | 如何進行轉信存取控制檢查 | promiscuous_relay delay_checks | | 檢查哪些 domain 可以 Relay | relay-domains access relay_entire_domain relay_hosts_only relay_based_on_MX relay_mail_from relay_local_from blacklist_recipients dnsbl enhdnsbl lookupdotdomain | | 檢查哪些 user 可以 Relay | use_ct_file blacklist_recipients | | 是否通過帳號驗證 | auth_options | | 遞送信件 | 將待寄信件寫入 mail queue | 略 | | 分信處理 | 給本機的信件要如何進行分信 | mailertable | | 是否為虛擬信箱 | aliases | | 是否需要轉信 | .forward |
利用 access.db 對轉寄要求進行存取控管是 sendmail 裡最重要的功能之一,從底下範例來介紹 access 的設定方法: spammer@aol.com REJECT cyberspammer.com REJECT TLD REJECT 192.168.212 REJECT IPv6:2002:c0a8:02c7 RELAY IPv6:2002:c0a8:51d2::23f4 REJECT | 核對寄信人或收信人信箱是否為 spammer@aol.com 核對寄信人或收信人網域是否為 cyberspammer.com 核對寄信人或收信人網域是否為 TLD 開頭的名稱 核對提出寄信要求的 IP 是否為 192.168.212 開頭 核對提出寄信要求的 IP 是否為 ipv6 格式 核對提出寄信要求的 IP 是否為 ipv6 格式中的子網域 |
除了使用 REJECT 來拒絕轉信要求外,也可以使用 RELAY 來接受轉信要求,如果想讓被拒絕轉信的網域中某些單機仍然可以轉信,或是某個被拒絕的網段中的某個 IP 允許轉信,這兩種情形下可以設定成 OK,類似的情形下想讓某個網段中的某個 IP 或某個網域中的某台主機不要進行比對,則可以使用 SKIP,DISCARD 用來將信件完全丟棄,與 REJECT 不同的是將不會產生退信通知,ERROR 也是用來 REJECT 轉信,但是可以指定退信通知的訊息內容,應用範例如下: cyberspammer.com ERROR:550 "We don't accept mail from spammers" okay.cyberspammer.com OK sendmail.org RELAY 128.32 RELAY 使用 access 除了單純樣本比對外,還可以指定比對欄位,事實上使用這種方式來比對,對於防止垃圾郵件更為有效,舉例來說: mail.spps.tp.edu.tw RELAY 這條規則會允許假冒寄信人地址為 user@mail.spps.tp.edu.tw 的信件,能夠成功透過本機進行轉寄,如果改為: To:mail.spps.tp.edu.tw RELAY Connect:192.57 RELAY 則保證只有收信人地址是 user@mail.spps.tp.edu.tw 的信件,本機才接受,另配合 ip 的比對來讓校內機器可以正常寄信,由於限定比對連線者(Connect)的 ip,所以即使把寄信人地址改為 user@[192.57.1.2] ,本機還是會擋掉不 Relay,這比起單純的樣式比對擋得更徹底。更複雜的應用如下面的例子: From:spammer@some.dom REJECT To:friend.domain RELAY Connect:friend.domain OK Connect:from.domain RELAY From:good@another.dom OK From:another.dom REJECT 當啟用 FEATURE(`delay_checks') 選項時,可以附加以下兩個選項: FEATURE(`delay_checks', `friend') FEATURE(`delay_checks', `hater') 這時候在 access.db 裡,就可以使用下列語法來宣告垃圾郵件的同路人,sendmail 將會在退信通知中,提示對方郵件主機遭人利用轉信的訊息,底下語法分別是比對郵寄地址、使用者名稱和網域名稱。 Spam:abuse@my.domain FRIEND Spam:abuse@ FRIEND Spam:spam.domain FRIEND 想要完全防堵垃圾郵件,最有效的方法就是使用 SMTP AUTH 功能,當你啟用此功能後,如果對方能通過帳號密碼驗證,就可以取得 Relay 的權限,但透過其他方式 Relay 仍然是被接受的,例如:通過 access.db 的檢查、透過 relay-domains 的宣告、透過 MX 紀錄或通過 trusted-user 的宣告......等等。因此想徹底防禦垃圾郵件,第一件事就是必須把其他功能關閉或做最大限制,筆者的做法是: - 不使用 MX 紀錄
- trusted-user 和 relay-domains 保持淨空
- access 中僅包含 127.0.0.1 RELAY 、 localhost RELAY 和 localhost.localdomain RELAY 三行
- 設定驗證機制時,不開放 LOGIN 和 PLAIN
在這種嚴格的限制下,學校老師不管在家裡寄信或在學校寄信(透過 WEB 介面除外),都必須修改 outlook express 的設定,設定如下: 
|