架設MAIL

目錄

sendmail 如何除錯 SMTP 認證功能
POP 設定 開放 relay
怎樣拒收郵件 設定寄件的大小
使用者登入時自動發 e-mail 通知 quota 所造成的限制

 

MUA ( Mail User Ageng ) 郵件使用者

pine , Outlook Express,Netscape 傳訊者,Eudora ...

MTA ( Mail Transport Agent ) 郵件傳輸者

Mail Server

SMTP ( SimpleMailTransportProtocol ) 簡易郵件傳輸通訊協定

POP ( Post Office Protocol )

IMAP ( Internet Message Access Protocol )

1.安裝及設定 SMTP

1.1 安裝 SMTP ( sendmail )

rpm -ivh sendmail-*.rpm

vi /etc/service 檢查一下 port 25 是否開放

smtp 25/tcp mail

2.設定 pop

2.1 先檢查是否有啟動 xinetd or 是否有安裝 xinetd(rpm -qa | grep xinetd)

  /etc/rc.d/init.d/xinetd start

  or

  rpm -ivh xinetd*.rpm

2.2 檢查是否有安裝 imap (rpm -qa | grep imap)

  rpm -ivh imap*

2.3 chkconfig ipop3 on

2.4 檢查

  telnet (你的IP) 110

  應該可以得到"+OK POP3 [你的IP] v7.64 server ready"

2.5 如果還是不行,那就手動加入

  vi /etc/xinetd.d/ipop3

# default: off
# description: The POP3 service allows remote users to access their mail \
# using an POP3 client such as Netscape Communicator, mutt, \
# or fetchmail.
service pop3
{
  disable = no
  socket_type = stream
  wait = no
  user = root
  server = /usr/sbin/ipop3d
  log_on_success += USERID
  log_on_failure += USERID
}

  再重新啟動 xinetd 吧!!

3.設定 Mail Server

3.1 sendmail 8.9.x 以後預設是不 relay (因為廣告信氾濫!!),所以在 /etc/sendmail.cf 中有:

FR-o /etc/mail/relay-domains

...

# SMTP daemon options

#O DaemonPortOptions=Port=smtp,Addr=127.0.0.1, Name=MTA
O DaemonPortOptions=Port=smtp,Addr=192.168.0.1, Name=MTA

將 127.0.0.1 換成您 mail server 的 ip (或者是改成 0.0.0.0 也可以喔!!)

註:若是您的 server 有一個以上的 ip ,建議還是將它改成 0.0.0.0 ,如此才可以接受從每個 ip 過來的信件,若是您的機器有兩個 ip ( ex: 192.168.0.1 ; 192.168.0.2 ) ,而上面那行只設了 192.168.0.1 的話,那麼其他人是無法透過 192.168.0.2 來寄信的!!

然後在 vi /etc/mail/relay-domains

192.168.0.1 Relay --> 允許 192.168.0.1 轉信

172.16.     Relay --> 允許 172.16.X    轉信

經過這樣的設定,使用者就只能在區網內寄信
當他回家用 Hinet,SeeNet....撥接上網就無法用該機器來寄信了
有人就會因此把 hinet.net 也給加入開放名單
但,這樣豈不是又門戶大開了,千萬不可

3.2 vi /etc/mail/access

設定可以幫忙 relay 的網域

localhost.localdomain RELAY
localhost             RELAY
127.0.0.1             RELAY

aaa.com.tw            RELAY
.edu                  RELAY

.tw                   RELAY

...

然後執行

makemap -r hash /etc/mail/access.db < /etc/mail/access

說穿了其實不難,只要您之前設定 DNS 之後,修改 /etc/sendmail.cw ,將你的 domain 加進去就可以了,不過要注意的是,如果你的機器有兩個以上的 domain 的話,那 aa@aaa.com.twaa@bbb.com.tw 其實會被同一個 ID 接收!!

SMTP 認證功能

網管人員對於郵件主機最感到棘手的,應該是 Relay 的問題!!寄信者根本不需要有帳號,只要設定 smtp ,然後直接按下寄信之後,郵件主機一律通通予以接受,予以轉寄!!

解決方法概就是在 /etc/mail 當中的 access 檔案中,將亂發垃圾廣告的電腦 IP 檔掉,不過,由於目前發廣告信件的電腦實在太多了,根本就擋不完!!

而且 Red Hat 7.x 以後的版本,  sendmail 也將預設的 Relay 功能取消了,因此必須設定 /etc/mail/access 這個檔案的內容,才能將合法的 IP 權限開放!!

但是這樣還是太麻煩了,所以用 SMTP 認證功能是個不錯的選擇!!方法非常簡單

1.要安裝 cysus-sasl*.rpm ; sendmail 8.10.0 以上的版本

2.修改 /usr/share/sendmail-cf/cf/redhat.mc

dnl DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')
dnl TRUST_AUTH_MECH(`DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
dnl define(`confAUTH_MECHANISMS', `DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl

改成 

DAEMON_OPTIONS(`Port=smtp,Addr=0.0.0.0, Name=MTA'
TRUST_AUTH_MECH(`DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
define(`confAUTH_MECHANISMS', `DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl

3.更新 sendmail 的設定,並重新啟動 sendmail

cd /usr/share/sendmail-cf/cf
sh Build redhat.cf
mv /etc/sendmail.cf /etc/sendmail.cf.old
cp redhat.cf /etc/sendmail.cf
/etc/rc.d/init.d/sendmail restart

如此一來 server 已經完成了,接著 client 端也要設定!!

4.開 Outlook Express -> "工具" -> "帳號"

5.選定帳號

6.選定 SMTP ,勾"我的伺服器需要查驗身分","設定"

7.可以用原來的 account ,也可以另外用其他 account

大功告成,以後 Mail Server 上會認證身分,才可以發信!!

其他未經授權的 client 會看到以下訊息

無法傳送郵件,因為有一位收件者被伺服器拒絕。被拒絕的電子郵件地址是 'tesitng@example.com"。 主旨 'dhfjgjs', 帳號: 'testing', 伺服器: '192.168.0.xxx', 通訊協定: SMTP, 伺服器回應: '550 5.7.1 <testing@example.com>... Relaying denied', 連接埠: 25, 安全(SSL): 否, 伺服器錯誤: 550, 錯誤碼: 0x800CCC79

您可以到 http://www.edu.tw/tanet/spam.html 試試您的 Mail Server relay 是否有問題!!

 

怎樣拒收郵件


除了透過 /etc/mail/relay-domains 來告訴 sendmail 來自哪一台機器可以幫忙寄信外,還可以用 /etc/mail/access 來做管制
例如:
  virus@test.com 一直發帶有病毒信件給AA,徵詢過AA的同意後我們可以
在 /etc/mail/access 中加入一行
virus@test.com DISCARD 

這樣凡是 virus@test.com 寄來的信通通會直接丟掉

凡是由 test.com 寄來的信就退回去:
test.com REJECT 

凡是寄給 virus 的信就退回並顯示自訂的訊息
virus@ 550 Sorry this user was banned 

可在 access 中用的動作

OK 無條件接受
RELAY 可以幫忙轉寄(Relay)
REJECT 將信退回
DISCARD 把信給丟了
### 訊息 ### 代表 RFC 821 中定義的錯誤代碼
ERROR:### 訊息 同上
ERROR:D.S.N:### 訊息 D.S.N 在 RFC 1893 中定義,和前兩個很像

修改完 access 後必須把它轉換成資料庫
可以用 cd /etc/mail ; make
或是 makemap -r hash /etc/mail/access < /etc/mail/access

sendmail 如何除錯??

1.檢查看看 netstat -a ,看看 sendmail 還有沒有 bind 在 smtp port 25 上?

tcp 0 0 *:smtp *:* LISTEN

2.檢查看看 ps -ef | grep sendmail ,看還有沒有 sendmail 這個 process ?

root 848 1 0 Dec14 ? 00:00:00 sendmail: accepting connections

3.telnet localhost 25 看看 sendmail 還有沒有反應?

Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
220 www.xxx.com.tw ESMTP Sendmail 8.11.2/8.11.2; Tue, 25 Dec 2001 15:26:02 +0800

(附註:用 Ctrl+] 離開,再輸入 quit )

4.用 grep sendmail /var/log/maillog | tail -n 20 (查最後面 20 筆紀錄)看看 sendmail 停掉前有沒有留下什麼 syslog 記錄,如果完全沒有留下什麼記錄,看看最後一筆 sendmail 記錄的時間前後,有誰登入到主機,問問他們做了什麼事,看看那段時間的 syslog(/var/log/messages) 中,發生哪些相關的事(誰登入,登出,做了什麼事,有沒有人在做 port scan...等等的)

如何設定寄件的大小

若老是有人寄大量的圖片,mp3等大型檔案,會讓 SMTP Server loading 很重,要如何去限制寄件的大小呢??

很簡單,只要從 /etc/sendmail.cf 著手就好了!!

# maximum message size
O MaxMessageSize=1000000

將原本 mark 起來的地方打開,然後重新啟動 sendmail 就可以了!!

若是寄件的大小超過 1MB (大小請自行設定),則使用者會看到以下訊息

伺服器回應:[552 5.2.3 Message exceeds maximum fixed size(1000000)].(帳號:[test]),SMTP 伺服器 : [192.168.0.1],錯誤碼: 0x800ccc6d)

那就表示已經可以限制使用者寄件的大小了!!

用E-mail監控主機

在 crontab 裡加個設定

crontab -e

1 * * * * cat /var/log/secure | /sbin/sendmail youremail@youremail.com

這樣系統便會定時將主機的資訊透過 E-mail 告訴您了!! 

另外語法也可以這樣用

mail -s testing -c aa@aa.com -b bb@bb.com cc@cc.com < /var/log/secure

s : subject -- 主旨

c : cc -- 副本 ( option )

b : bcc -- 密件副本 ( option )

後面跟著才是 e-mail address,若是要同時發給一個人以上,則用 , 隔開!!

另外也可以將特定程式產生的 output mail 出去,ex:

netstat -a | mail -s testing -c aa@aa.com -b bb@bb.com cc@cc.com

使用者登入時自動發 e-mail 通知

讓使用者登入時自動發信通知管理員,就可以靠著收信得知系統的狀況!!

vi /etc/profile (加入以下這段在最後面)

# 使用者登入的 Log 
NOW=`date +%Y%m%d:%H%M%S` 
# 格式: [登入時間]: 遠端主機名稱 : 使用者名稱 . 
echo "[$NOW]: $REMOTEHOST : $USER ." > /tmp/userlogin.log 
# mail -s "信件主旨" 收信人 < 記錄檔 
mail -s "User Login!!" youremail@youremail.com < /tmp/userlogin.log 
# 清除檔案 
rm /tmp/userlogin.log 

注意 quota 所造成的限制

一般 mail server 是將信件放在 /var/spool/mail/(user account) 及 /home 底下,所以當 quota 功能打開時,而 quota 又用完了,在 /var/spool/mail 下多了一個檔案,但大小是0 ,也檢查 MAILQ ,是空的,檢查寄信的 SERVER ,寄件人收到一封標題 Returned mail: Can't create output 的信件內容

----- Transcript of session follows -----
procmail: Quota exceeded while writing "/var/spool/mail/test"
550 <test@aaa.com.tw>... Can't create output

檢查 MAIL QUEUE ,是空的!!


所以 mail server 的 /var/spool/mail/* 和 /var/spool/mqueue 最好還是用獨立的 partition 較保險!!


 

Good luck!!