| 论坛注册| 加入收藏 | 设为首页| RSS
Google
您当前的位置:首页 > Linux频道 > linux网络与应用 > Linux服务器

linux系统管理员讲义(4)

时间:2006-06-21 18:29:03  来源:Linux联盟收集  作者:上上智
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 目錄,其中 accessdomaintablemailertablevirtusertablegenericstable 等五檔案必須將資料雜湊至資料庫內才能讓 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 檔,這個功能也可以用 virtusertablegenericstablealiases 來做,但建議不要這樣做,因為當出現問題需要除錯時將會很痛苦!

到這裡已經解決了收信的問題,寄信的問題稍微有點麻煩:首先請在 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 取代 sendmailRed 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 上,防止垃圾郵件轉寄的問題,可以透過以下四個機制來調整:

  1. 預設不作轉信,換句話說,寄信人或收信人其中之一必須是來自本機的 Domain Name 才受理
  2. 對寄信人的網址進行 DNS 查詢
  3. 透過 /etc/mail/access.db 進行存取控管
  4. 透過信件標頭的特徵比對,來過濾垃圾郵件

以上四種方法其實很難防止垃圾郵件的攻擊,原因是新一代的廣告信發信程式,早已針對這些措施擬出應對的策略,例如:

  1. 將寄信人地址偽裝成來自本機網域
  2. 寄信給本機網域的使用者,同時將要大量發信的對象使用 BCC 標頭以隱密副本方式發送
  3. 使用偽裝的  IP 位址來寄信,以規避 DNS 反查(缺點是這樣將無法確認是否交寄成功)
  4. 透過 socket proxy 交寄郵件來躲避防火牆稽核
  5. 透過後門程式從防火牆內模擬合法使用者交寄郵件

就是因為廣告信發信程式「道高一尺,魔高一丈」,因此造成系管師人人自危,視提供郵件服務為畏途。事實上 sendmail 複雜的送信機制是造成垃圾郵件之所以難以預防的主因,然而這些送信機制對於郵件的遞送處理又是不可或缺的,想要徹底阻擋垃圾郵件,不能不了解 sendmail 的送信機制,在前幾個小節已經詳細交代 sendmail 裡可以使用的功能和微調選項,筆者特別整理下表來幫助大家了解 sendmail 到底在做些什麼事:

工作內容處理步驟相關功能選項
信件標頭欄位剖析檢查標頭欄位是否完整
改寫寄信人欄位
check_mail
是否需要改寫 domainalways_add_domain
local_no_masquerade
limited_masquerade
masquerade_entire_domain
accept_unresolvable_domains
是否需要改寫 usernameldap_routing
accept_unqualified_senders
檢查寄信人網域是否完整nocanonify
檢查寄信人網域是否存在nodns
改寫收信人欄位
check_rcpt
是否需要改寫 domaindomaintab
allmasquerade
local_no_masquerade
use_cw_file
是否需要改寫 usernamevirtusertable
genericstable
redirect
userdb
檢查收信人網域是否完整nocanonify
轉信存取控制檢查
check_relay
如何進行轉信存取控制檢查promiscuous_relay
delay_checks
檢查哪些 domain 可以 Relayrelay-domains
access
relay_entire_domain
relay_hosts_only
relay_based_on_MX
relay_mail_from
relay_local_from
blacklist_recipients
dnsbl
enhdnsbl
lookupdotdomain
檢查哪些 user 可以 Relayuse_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 的宣告......等等。因此想徹底防禦垃圾郵件,第一件事就是必須把其他功能關閉或做最大限制,筆者的做法是:

  1. 不使用 MX 紀錄
  2. trusted-user relay-domains 保持淨空
  3. access 中僅包含 127.0.0.1 RELAY localhost RELAY localhost.localdomain RELAY 三行
  4. 設定驗證機制時,不開放 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 目錄,其中 accessdomaintablemailertablevirtusertablegenericstable 等五檔案必須將資料雜湊至資料庫內才能讓 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 檔,這個功能也可以用 virtusertablegenericstablealiases 來做,但建議不要這樣做,因為當出現問題需要除錯時將會很痛苦!

到這裡已經解決了收信的問題,寄信的問題稍微有點麻煩:首先請在 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 取代 sendmailRed 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 上,防止垃圾郵件轉寄的問題,可以透過以下四個機制來調整:

  1. 預設不作轉信,換句話說,寄信人或收信人其中之一必須是來自本機的 Domain Name 才受理
  2. 對寄信人的網址進行 DNS 查詢
  3. 透過 /etc/mail/access.db 進行存取控管
  4. 透過信件標頭的特徵比對,來過濾垃圾郵件

以上四種方法其實很難防止垃圾郵件的攻擊,原因是新一代的廣告信發信程式,早已針對這些措施擬出應對的策略,例如:

  1. 將寄信人地址偽裝成來自本機網域
  2. 寄信給本機網域的使用者,同時將要大量發信的對象使用 BCC 標頭以隱密副本方式發送
  3. 使用偽裝的  IP 位址來寄信,以規避 DNS 反查(缺點是這樣將無法確認是否交寄成功)
  4. 透過 socket proxy 交寄郵件來躲避防火牆稽核
  5. 透過後門程式從防火牆內模擬合法使用者交寄郵件

就是因為廣告信發信程式「道高一尺,魔高一丈」,因此造成系管師人人自危,視提供郵件服務為畏途。事實上 sendmail 複雜的送信機制是造成垃圾郵件之所以難以預防的主因,然而這些送信機制對於郵件的遞送處理又是不可或缺的,想要徹底阻擋垃圾郵件,不能不了解 sendmail 的送信機制,在前幾個小節已經詳細交代 sendmail 裡可以使用的功能和微調選項,筆者特別整理下表來幫助大家了解 sendmail 到底在做些什麼事:

工作內容處理步驟相關功能選項
信件標頭欄位剖析檢查標頭欄位是否完整
改寫寄信人欄位
check_mail
是否需要改寫 domainalways_add_domain
local_no_masquerade
limited_masquerade
masquerade_entire_domain
accept_unresolvable_domains
是否需要改寫 usernameldap_routing
accept_unqualified_senders
檢查寄信人網域是否完整nocanonify
檢查寄信人網域是否存在nodns
改寫收信人欄位
check_rcpt
是否需要改寫 domaindomaintab
allmasquerade
local_no_masquerade
use_cw_file
是否需要改寫 usernamevirtusertable
genericstable
redirect
userdb
檢查收信人網域是否完整nocanonify
轉信存取控制檢查
check_relay
如何進行轉信存取控制檢查promiscuous_relay
delay_checks
檢查哪些 domain 可以 Relayrelay-domains
access
relay_entire_domain
relay_hosts_only
relay_based_on_MX
relay_mail_from
relay_local_from
blacklist_recipients
dnsbl
enhdnsbl
lookupdotdomain
檢查哪些 user 可以 Relayuse_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 的宣告......等等。因此想徹底防禦垃圾郵件,第一件事就是必須把其他功能關閉或做最大限制,筆者的做法是:

  1. 不使用 MX 紀錄
  2. trusted-user relay-domains 保持淨空
  3. access 中僅包含 127.0.0.1 RELAY localhost RELAY localhost.localdomain RELAY 三行
  4. 設定驗證機制時,不開放 LOGIN PLAIN

在這種嚴格的限制下,學校老師不管在家裡寄信或在學校寄信(透過 WEB 介面除外),都必須修改 outlook express 的設定,設定如下:

来顶一下
近回首页
返回首页
发表评论 共有条评论
用户名: 密码:
验证码: 匿名发表
相关文章
    无相关信息
栏目更新
栏目热门