作者  kenduest (小州)                                      看板  Linux
 標題  [分享] 來談一下撥接用戶的 Mail Relay 問題
 時間  Sun Apr  2 22:03:02 2000
───────────────────────────────────────


  相信大家都知道,在 SendMail 8.8.x 版本之後,已經把 Mail Server
  可以任意被 Relay 的功能關掉了;也就是說,預設的 SendMail
  目前只允許讓本機的連線端可以透過這台 Mail Server 來發信到
  Internet  上,其他的連線端一律都會被拒絕....

  OK.. 若是希望某個網域可以使用這台郵件主機來寄信,那在主機的
  /etc/mail 目錄內可以看到 access 、relay-domains 這兩個檔案可以
  用來開放與限制那些連線端可以使用這台主機來發信。

  關於 access 與 relay-domains 檔案的解說部份,這裡弟就先略過了,
  也就是這裡先假設大家已經知道了access 與 relay-domains 檔案的
  用途,也知道要使用 makemap 程式來產生實際給 sendmail 程式所
  使用的 .db 資料檔案。

  話說目前 SendMail 預設把可以任意被 Relay 的功能關掉了,那的確是
  可以大大減少主機會被拿來亂發信的問題,那 spam 的問題的確是可以
  少了很多... 不過 SendMail 這個目前的限制作法,也造成了一些實際上
  的困擾。

  怎麼說呢?比方有個公司是在台北,這台主機限制了只有屬於該公司
  網域 IP 的連線端才可以使用這台 Mail Server 來寄信到任何 internet
  上。而某個公司的員工他該好出差到南部,現在他使用 notebook 打好
  了 e-mail 準備要寄給公司的客戶,那他現在就使用了 hinet 的撥接上網
  要寄信出去。不過就按下寄信扭後,螢幕出現了 Relaying Denied 的
  錯誤訊息被告知寄信失敗。檢察一下 smtp 發信主機的設定,原來 smtp
  主機是指向台北公司的 Mail Server ,而只因為目前是使用 hinet ISP
  撥接上網,所屬網域並不是在公司的網域內,所以當然會寄信失敗.........

  OK... 那沒有辦法囉,只得去改 SMTP 的設定,所以就把 smtp 的連線
  主機改成任意一台 hinet 的 e-mail 主機,比方是 ms24.hinet.net
  就不會有問題了。

  當他處理完事情,回到台北公司了。現在他人在公司內,正在寫 e-mail
  準備把出差所處理的事情回報給上司。信寫好後要寄出去的時候,螢幕
  誘出現了 Relaying Denied 的錯誤訊息。仔細一看,原來他目前是在公司
  網域內,已經不是用 ISP 網域內,所以 ISP 的 Mail Server 拒絕讓你寄信。
  遇到這樣子的錯誤,他需要再去改 smtp 的主機指向公司的 Mail Server
  就不會有問題了。
                                                                               
  關於上面的情況,弟目前工作的地方,有人的確遇過這個問題,也向的弟
  反應過了,結論他是希望可不可以說就算是他不是在公司內也可以使用公司的
  主機發信呢?而不用說在公司外還需要去改寄信軟體的設定徒增了一些
  不便的地方。

  弟想一想他這麼說的確是沒有錯,而有一些業務人員可能只懂得怎麼操作
  outlook 這類軟體來寫個 e-mail 發信,smtp 的設定細節他可能不是相當清楚;
  而遇到了 Relaying Denied 的錯誤訊息更是不知道要如何處理....

  那弟就在想辦法,看看有沒有一個解決的方式可以允許使用撥接上網的公司
  員工可以使用公司的 Mail 主機寄信,而不會因為上線 IP 並沒有在
  /etc/mail/access 或者是 /etc/mail/relay-domains 內設定開放的區域而
  拒絕這個連線端的寄信。

  首先弟去把整個 sendmail 8.9.x 的文件資料翻過一遍,發現並沒有這方面的
  資訊。 後來 sendmail 8.10.x 有 beta 版出來了 (目前已經正式 release 囉),
  有注意到在這個版本內提供了所謂的 AUTH SMTP 的功能。AUTH SMTP 的功能,
  簡單的說就是通過 sendmail 的認證之後,就可以使用主機任意寄信了,也不會
  遇到因為連線端並未在 sendmail 所允許開放的網域而被拒絕。

  而為了要使用 sendmail 8.10.x 的 auth smtp 功能,耗了一兩個禮拜還是
  搞不定。整個要讓 sendmail 8.10.x 可以支援 auth smtp 還真是不簡單,
  因為還需要另外抓其他的 library 套件回來編譯安裝,還要改 sendmail 的一些
  設定才能夠支援....

  OK... 弄到最後,使用 telnet xxx.xxx.xxx.xxx 25 然後使用 EHLO localhost
  打招呼時的確是已經有看到 AUTH 的回應字串,那也就是說這台 mail server
  是支援 auth smtp 的認證功能。不過這裡到目前還搞不定的是,這個部份 auth
  smtp 的密碼設定部份遲遲無法成功,也就是雖然使用一些 mail client 測試
  的確有丟出了 auth xxxxxx 的字串向 mail server 認證,但是這個部份總是
  認證失敗 >_< 於是的另外想辦法另求其他方式來解決。

  有一天上台大電機與 stevel 說到 sendmail 8.10.x 的認證問題,他是說到目前
  反倒是有個解決的方式叫做 "pop before smtp" 。pop before smtp 的意思
  就是說,先讓某個使用者到主機做 pop3 收信的動作,那完成後在往後幾分鐘內
  mail server 就暫時開放允許這個連線端可以使用這台主機來寄信。等幾分鐘後,
  這個這個連線端可以任意使用主機發信的功能就會被關閉了....

  好,說到重點了,那 pop before smtp 怎麼做呢?
  在 http://www.jdimedia.nl/igmar/relayd/ 網站上可以找到
  Sendmail Relay Daemon 的程式。這個 daemon 程式能夠修改
  /etc/mail/access.db 檔案動態加入某個 ip ,如此 sendmail 程式就接受某個
  連線端來使用主機來寄信了。
                                                                               
  那這個 relay domains 程式怎麼知道有人使用 pop3 收信之後,要去修改
  access.db 檔案暫時讓 sendmail 可以接受這個連線端可以 relay 的動作呢?
  那這個部份還需要修改 imap 套件裡面的原始碼,讓重新編譯出來的 pop3d 程式
  可以配合這個 pop before smtp 的功能。

  大致上整個意思就是這樣子了...  要使用這個功能,那整個操作方式是這樣子的:

  1. 到 http://www.jdimedia.nl/igmar/relayd/ 抓 relayd 的原始碼套件。
     弟目前是使用 RedHat Linux 6.1 的環境下來說的,那的抓取
     relayd-1.3-6.src.rpm 回來使用 rpm --rebuild relayd-1.3-6.src.rpm
     把套件編譯為 .i386.rpm 的 binary 檔案,完成後可以在
     /usr/src/redhat/RPMS/i386 找到 relayd-1.3-6.i386.rpm

  2. 提供收信的 pop3d 程式也需要修正,在網站上可以找到 imap 的 patch 檔案
     為 http://www.jdimedia.nl/igmar/relayd/relayd-ipop3d-4.5.tar.gz
     另外我們還需要 imap 的原始 .src.rpm 套件檔案,請到 CLE ftp
     ftp://cle.linux.org.tw/pub/CLE/SRPMS/SRPMS 裡面就可以找到

  3. 抓回 imap 的 .src.rpm 檔案後,請使用 rpm -ihv imap-xxxxxx.src.rpm
     的方式安裝,該套件的的 imap .tar.gz 檔案會解開到 /usr/src/redhat/SOURCES
     目錄內, .sepc 規格檔案會放置在 /usr/src/redhat/SPECS 目錄內。
     然後也把 relayd-ipop3d-4.5.tar.gz 檔案解開,把裡面解開的所有檔案
     都複製到 /usr/src/redhat/SOURCES 目錄內。

   4. 切換目錄到 /usr/src/redhat/SPECS 目錄內使用 rpm -ba imap.spec 重新把
      imap 套件打包編譯成為 .i386.rpm 的套件檔案。

   5. 接著分別使用 rpm -ihv  relayd-1.3-6.i386.rpm 安裝上該套件,還有就是
      使用 rpm -Uhv imap-4.7.i386.rpm 安裝上該套件。若是安裝新的 imap rpm
      檔案有問題,請先把原先的 imap 移除,然後再安裝這個套件即可。

   6. 執行 chown relayd.relayd /etc/mail/access.db ,好讓 relayd 有權限
      可以修改這個檔案以便於達到動態 relay 的功能。對了,這樣做會讓每次啟動
      sendmail 程式時會出現 access.db 建立失敗的問題,不過這是正常的,
      所以不需要擔心。

    7. 現在就使用 /etc/rc.d/init.d/relayd start 就可以啟動了 relayd 的程式。
       另外可以使用 ntsysv 設定每次開機都啟動這個服務。

  整個步驟就是這樣子了。往後在外面要使用這台主機寄信,先作 "pop"
  收信檢查的動作,那接下來的幾分鐘時間內你就可以使用這台主機來寄信到
  其他非公司的網域也不會出現 Relaying Denied 的錯誤訊息了 ^_^