架設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.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 RELAYaaa.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.tw 及 aa@bbb.com.tw 其實會被同一個 ID 接收!!
網管人員對於郵件主機最感到棘手的,應該是 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')dnl3.更新 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
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
讓使用者登入時自動發信通知管理員,就可以靠著收信得知系統的狀況!!
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
一般 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!!