RHEL5系統 sendmail+qpopper 架設簡易郵件服務器

轉自 “小蝸牛技術之家” 博客  原稿: http://snailwarrior.blog.51cto.com/680306/139098


【小蝸牛奮力之作


目標:在RHEL5系統架設簡易郵件服務器,包括SMTP服務、POP3服務,發信支持SMTP驗證。然後使用客戶端(比如Foxmail,Outlook)連接,進行郵件收發。
【注意】此文檔的配置在我的RHEL5系統上能正確運行
【注意】此文檔的內容不一定說得正確,歡迎大家指正!小蝸牛十分感謝!
===================================================
Sendmail 入門配置
===================================================
在這裏不講sendmail如何安裝,只講述簡單的sendmail配置使用。大多數Linux系統在安裝的時候,一般都默認安裝了senmdail。我使用的RHEL5系統,已經安裝的sendmail包如下:
[root@pps ~]# rpm -qa | grep sendmail
sendmail-8.13.8-2.el5
1、啓動、停止sendmail服務
大多數系統默認開機就啓動sendmail服務了,我們可以查看sendmail服務狀態,停止、啓動sendmail:
[root@pps ~]# service sendmail status
sendmail (pid 3944 3935) 正在運行...
[root@pps ~]# service sendmail stop
關閉 sm-client:                                           [確定]
關閉 sendmail:                                            [確定]
[root@pps ~]# service sendmail start
啓動 sendmail:                                            [確定]
啓動 sm-client:                                           [確定]

【小貼士】--------------------------------------------------------------【小貼士】
可以telnet檢查一下sendmail服務是否真的啓動了:
[root@pps ~]# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
220 pps.hoho.com ESMTP Sendmail 8.13.8/8.13.8; Sat, 14 Mar 2009 00:22:53 +0800
quit
221 2.0.0 pps.hoho.com closing connection
Connection closed by foreign host.
嘿嘿,說明senmail服務啓動正常啦!可以看到sendmail的版本號是 8.13.8,我連接上後啥也沒做,輸入quit命令退出來了!
【小貼士】--------------------------------------------------------------【小貼士】
其實用telnet命令可以測試連接其它端口,檢測端口是否打開(即提供服務),比如檢測80或者8080等,如果端口打開了就會有信息返回提示,即使是連接被blocked的信息,否則就會出現連接被拒的情況(Connection refused)。

2、簡單配置sendmail
當sendmail服務啓動的時候,就可以使用mail工具給系統內別的用戶發郵件(信息),或者給外界發郵件了,如果目標email系統不做什麼反垃圾檢查、IP過濾的話,一般能收到的。

(1)sendmail的主配置文件 /etc/mail/sendmail.cf
這個配置文件差不多有2000行,有點恐怖,不過我們需要做的修改並不多,先入門嘛。我修改的幾個地方如下:
1)SMTP監聽地址參數
# SMTP daemon options
# O DaemonPortOptions=Addr=127.0.0.1,Port=smtp,Name=MTA
O DaemonPortOptions=Port=smtp,Name=HoHo'MTA
這裏我把Addr=127.0.0.1去掉,sendmail就監聽系統的所有IP的smtp(25)端口,否則只監聽127.0.0.1的25端口,系統外的客戶端是無法連接到我的sendmail的,要麼就再寫上我們對外服務的局域網IP地址,如下:
O DaemonPortOptions=Addr=127.0.0.1,Addr=192.168.32.50,Port=smtp,Name=MTA
(有本事你就寫上一個公網IP,哈哈)
2)設置本服務器主機名信息
Cwlocalhost
# file containing names of hosts for which we receive email
Fw/etc/mail/local-host-names
Cw之後寫明所有要收信的主機名,但是接下來Fw這一行說明可以從local-host-names文件讀取所要收信的主機名,我可以這樣:
Cwlocalhost hoho.com pps.hoho.com
或者在 local-host-names 文件裏:
[root@pps mail]# cat /etc/mail/local-host-names
# local-host-names - include all aliases for your machine here.
hoho.com
pps.hoho.com
(經測試,可以同時在Cw裏和Fw裏有相同的主機名,不過我認爲這是無聊的做法)
現在我想發信給本機的hoho用戶,發給 [email protected] 或者 [email protected] 都可以。
【注意】如果本機還有其它別名,比如 bbs.hoho.com:
[root@pps mail]# nslookup bbs.hoho.com
Server:         127.0.0.1
Address:        127.0.0.1#53
bbs.hoho.com    canonical name = pps.hoho.com.
Name:   pps.hoho.com
Address: 192.168.32.50
那麼如果在Cw或Fw裏寫上 pps.hoho.com 但是沒有寫上 bbs.hoho.com ,給 [email protected]發信也是可以的。
但是,如果 bbs.hoho.com 是獨立的A記錄,如下:
[root@pps mail]# nslookup bbs.hoho.com
Server:         127.0.0.1
Address:        127.0.0.1#53
Name:   bbs.hoho.com
Address: 192.168.32.50
那麼此時給 [email protected] 發信將會有退信,說是“system config error, mail loops back to me (MX problem?)"。
【注意】如果此時 bbs.hoho.com 實際爲局域網內另外一臺主機(帶有郵件服務),那麼給 [email protected] 發信,本機就將信件relay到 bbs.hoho.com 主機,不會產生上述錯誤。

(2)sendmail的訪問限制配置文件 /etc/mail/access
[root@pps mail]# cat access
# Check the /usr/share/doc/sendmail/README.cf file for a de.ion
# of the format of this file. (search for access_db in that file)
# The /usr/share/doc/sendmail/README.cf is part of the sendmail-doc
# package.
#
# by default we allow relaying from localhost...
Connect:localhost.localdomain           RELAY
Connect:localhost                           RELAY
Connect:127.0.0.1                          RELAY
# 這一行是我添加的
Connect:192.168.32                        RELAY
編輯保存後,執行以下命令更新訪問數據庫:
[root@pps mail]# makemap hash access.db < access
這裏配置允許本機和 192.168.32.0/24 網段的所有機器的訪問,因此可以在本網段內的機器(假設是Windows XP)上使用Foxmail或者Outlook來設置smtp服務器爲 192.168.32.50 來發送郵件。當然,防火牆需要允許外界對25端口的訪問(防火牆的配置就不扯遠了)。

【小貼士】--------------------------------------------------------------【小貼士】
access文件定義舉例:
hoho.com          RELAY //允許hoho.com域內用戶發送
192.168.32        RELAY //允許192.168.32.0/24網段發送
[email protected]  RELAY //允許特定郵件地址
snailwarrior@     RELAY //允許特定用戶發送
參數說明:
OK               無條件接受或發送
RELAY           允許SMTP代理投遞
REJECT         拒絕接受併發送錯誤消息
DISCARD       丟棄郵件,不發送錯誤消息

(3)sendmail設置SMTP驗證
【注意】如果做了SMTP驗證,上述/etc/mail/access的限制還是起作用的,即使SMTP驗證通過,但是在access裏限制客戶端不能訪問,則客戶端還是無法發信。
sendmail設置smtp驗證需要cyrus-sasl包,我的RHEL5系統已安裝的包如下:
[root@pps mail]# rpm -qa | grep sasl
cyrus-sasl-lib-2.1.22-4
cyrus-sasl-plain-2.1.22-4
cyrus-sasl-2.1.22-4
【注意】如果是用源碼包方式編譯安裝sendmail,如果需要支持SMTP驗證,則需要先安裝sasl(簡單認證和安全層協議)。
sasl 認證方式有多種,我在這裏介紹使用 /etc/shadow 來做用戶密碼驗證,下面談到的Qpopper做POP3服務器時也配置爲用 /etc/shadow 來驗證。
1)關注一下 /usr/lib/sasl2/Sendmail.conf
[root@pps ~]# cat /usr/lib/sasl2/Sendmail.conf
pwcheck_method:saslauthd
有資料說需要將 Sendmail.conf 複製一份,名爲 smtpd.conf,但在我的RHEL5系統不需要這麼做,也不需要修改其默認內容。
2)修改 /etc/mail/sendmail.mc,重新生成sendmail.cf
把以下兩行前面的 dnl 去掉:
dnl TRUST_AUTH_MECH(`EXTERNAL DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
dnl define(`confAUTH_MECHANISMS', `EXTERNAL GSSAPI DIGEST-MD5 CRAM-MD5 LOGIN PLAIN')dnl
把這一行註釋掉:
DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl
添加以下一行:
DAEMON_OPTIONS(`Port=smtp,Name=MSA, M=Ea')dnl
其實也有配置使用SMTP驗證的一行(我們不動它,保持註釋狀態):
dnl DAEMON_OPTIONS(`Port=submission, Name=MSA, M=Ea')dnl
但這裏的Port=submission,也即是在 587 端口上才使用SMTP驗證,這不是我想要的,我需要在SMTP默認的25端口上使用SMTP驗證,於是將 Port=submission 修改爲 Port=smtp。
修改保存好sendmail.mc後,執行以下命令來生成新的 sendmail.cf 配置文件:
[root@pps mail]# m4 sendmail.mc > sendmail.cf
sendmail.mc:10: m4: cannot open `/usr/share/sendmail-cf/m4/cf.m4': No such file or directory
這是因爲沒有安裝sendmai-cf這個包,安裝了就OK了。
3)啓動saslauthd服務
[root@pps ~]# service saslauthd start
【注意】想要saslauthd開機時啓動,RHEL5可以通過ntsysv配置來實現,或者通過在 /etc/rc.local 裏添加 /etc/init.d/saslauthd start 一行。
4)重啓sendmail
[root@pps ~]# service sendmail restart
美麗的時刻,SMTP客戶端連接就需要SMTP驗證了!
【小貼士】--------------------------------------------------------------【小貼士】
使用Telnet檢查SMTP驗證是否生效了:
[root@pps mail]# telnet localhost 25
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
220 pps.hoho.com ESMTP Sendmail 8.13.8/8.13.8; Sun, 15 Mar 2009 14:47:10 +0800
ehlo localhost
250-pps.hoho.com Hello localhost.localdomain [127.0.0.1], pleased to meet you
250-ENHANCEDSTATUSCODES
250-PIPELINING
250-8BITMIME
250-SIZE
250-DSN
250-AUTH LOGIN PLAIN
250-DELIVERBY
250 HELP
quit
221 2.0.0 pps.hoho.com closing connection
Connection closed by foreign host.
可以看到 250-AUTH LOGIN PLAIN 說明SMTP驗證生效了。
OutlookExpress、Foxmail使用LOGIN認證方式。
也可以通過以下命令檢查sasl是否生效:
[root@pps mail]# sendmail -d0.1 -bv root | grep SASL
               NETUNIX NEWDB NIS PIPELINING SASLv2 SCANF SOCKETMAP STARTTLS

嘿嘿,可以看到我的 SASLv2 已經啓用了。

(4)sendmail相關配置文件以及作用
/etc/mail/sendmail.cf        Sendmail主配置文件
/etc/aliases                        Sendmail使用的別名文件(raw data)
/etc/mail/aliases.db           別名數據庫(加快別名查找)
/etc/mail/helpfile               幫助文件
/var/log/mail/statistics     統計文件
/var/spool/mqueue/*        郵件隊列臨時文件
【舉例1】/etc/aliases 我可以通過這個文件實現“羣發”
# 我在文件末尾添加自己想要羣發的“用戶羣” allpeople
allpeople:      mail_user_1,mail_user_2,mail_user_3,mail_user_4,mail_user_5
更新別名:
[root@pps etc]# newaliases 或者 sendmail -bi
下面給 [email protected] 發信,就相當於給上述5個郵件用戶發信了!
allpeople就是一個郵件列表(maillist)!
【補充2】/var/log/maillog 這是sendmail的日誌文件(其實也是下面說的POP3服務的日誌文件)
root可以查看此文件檢查郵件的投遞情況。在這裏也可以看到sendmail和下面講述的POP3服務器Qpopper的啓動相關信息。
[root@pps mail]# service sendmail restart
/var/log/maillog日誌記錄如下:
Mar 14 23:27:38 pps sendmail[20861]: alias database /etc/aliases rebuilt by root
Mar 14 23:27:38 pps sendmail[20861]: /etc/aliases: 76 aliases, longest 10 bytes, 765 bytes total
Mar 14 23:27:39 pps sendmail[20866]: starting daemon (8.13.8): SMTP+queueing@01:00:00
Mar 14 23:27:40 pps sm-msp-queue[20877]: starting daemon (8.13.8): queueing@01:00:00
所有的郵件收發都在這裏有記錄,這裏就不細說了。
===================================================
Qpopper 安裝配置
===================================================
Qpopper是一個POP3服務器,它不支持SMTP等功能,只是和標準的UNIX郵件傳輸代理(MTA)比如sendmail、smail等一起工作。一般Linux安裝的時候不自帶qpopper,需要自己下載安裝。(我沒注意我使用的RHEL5光盤裏是否有qpopper的rpm包)
下面的操作步驟參考Qpopper的手冊GUIDE.pdf,但手冊有很多地方“跟不上”時代了,下面根據自己RHEL5系統的實際情況說說我的安裝配置。
【注意】/var/mail --> /var/spool/mail
【注意】需要防火牆開放110端口
1、安裝步驟
[root@pps software]# tar zxf qpopper4.0.16.tar.gz
[root@pps software]# cd qppoper
[root@pps qpopper4.0.16]# ./configure --enable-standalone
[root@pps qpopper4.0.16]# make
[root@pps qpopper4.0.16]# make install
popper安裝在 /usr/local/sbin/popper
【注意】這裏可執行程序名叫"popper",而不是"qpopper"
手冊裏介紹可以用inetd來啓動qpopper,但目前比較新的系統都採用了xinetd了。我本人也不喜歡使用它們,就喜歡standalone模式。下面介紹如何使用standalone模式運行apopper,因此我在 configure 的時候加上 --enable-standalone 開關。
我實際使用的配置如下:
[root@pps qpopper4.0.16]# ./configure --enable-standalone --enable-specialauth --enable-log-login  
--enable-standalone   使用standalone模式
--enable-specialauth  使得支持RHEL5的用戶密碼shadow
--enable-log-login    Qpopper記錄成功登陸的認證。
2、Qpopper的運行、停止
運行Qpopper,我實際使用的運行參數如下:
[root@pps qpopper4.0.16]# popper -c -C -R -s -T180
-c    將用戶名大寫變爲小寫,因此用戶名可以大小寫混合使用,結果都爲小寫
-C    如果用戶名帶有域名,-C選項將“@域名”去掉,[email protected]變爲hoho
-R    禁用對客戶端IP反向DNS查詢
-s    在日誌中記錄統計數據
-T    設置客戶端的讀取超時時間,默認120秒
下面這個選項也比較有用,就是從文件讀取運行選項,使用時請查看手冊看看注意事項。
-f config-file 從config-file讀取額外的run-time選項
停止Qpopper:
[root@pps mail]# killall popper
/var/log/maillog日記裏的停止、啓動記錄:
Mar 14 23:21:52 pps popper[14759]: popper: Server: cleaning up and exiting normally
Mar 14 23:25:02 pps popper[20740]: popper: Server: listening . 0.0.0.0:110
【提示】我在 /etc/rc.local 裏添加一行 /usr/local/sbin/popper -c -C -R -s -T180 來設置開機自動啓動POP3服務。
3、添加POP3用戶(其實就是添加郵件用戶)
參考了一下資料,發現可以只添加郵件用戶而實際上沒有增加系統用戶,以下命令不用理會警告信息:
[root@pps mail]# useradd mail_user_1 -g mail -d /dev/null -s /bin/false
useradd:警告:此主目錄已經存在。
不從 skel 目錄裏向其中複製任何文件。
因此,可以用shell腳本批量生成郵件用戶,同時使用 chpasswd 命令來批量初始化用戶的密碼。示例如下:
(1)批量生成用戶
先來看看mail用戶的組別:
[root@pps ~]# cat /etc/passwd | grep mail
mail:x:8:12:mail:/var/spool/mail:/sbin/nologin
可見mail用戶的GID爲12
新建mail_users.txt內容如下:
[root@pps ~]# cat mail_users.txt
mail_user_1:x::12::/dev/null:/sbin/nologin
mail_user_2:x::12::/dev/null:/sbin/nologin
mail_user_3:x::12::/dev/null:/sbin/nologin
mail_user_4:x::12::/dev/null:/sbin/nologin
mail_user_5:x::12::/dev/null:/sbin/nologin
【注意】必須嚴格按照/etc/passwd 的格式來書寫
使用newusers命令來批量生成用戶:
[root@pps ~]# newusers mail_users.txt
查看一下/etc/passwd用戶添加情況:
[root@pps ~]# cat /etc/passwd
...
mail_user_1:x:65535:12::/dev/null:/sbin/nologin
mail_user_2:x:65536:12::/dev/null:/sbin/nologin
mail_user_3:x:65537:12::/dev/null:/sbin/nologin
mail_user_4:x:65538:12::/dev/null:/sbin/nologin
mail_user_5:x:65539:12::/dev/null:/sbin/nologin
這裏UID是系統自動分配的。
(2)批量修改用戶密碼
新建mail_users_passwd.txt內容如下:
[root@pps ~]# cat mail_users_passwd.txt
mail_user_1:135790
mail_user_2:135790
mail_user_3:135790
mail_user_4:135790
mail_user_5:135790
【注意】這裏的格式也是固定的
使用chpasswd命令批量修改用戶密碼:
[root@pps ~]# chpasswd < mail_users_passwd.txt
這裏,相當於我初始化所有郵件用戶的密碼爲135790。

如果使用加密的方式修改密碼,則需要使用 -e 參數,可以參考/etc/shadow文件創建密碼。(我個人認爲實在沒有必要用加密方式批量修改用戶密碼,日後用戶自己修改密碼還得管理員來完成,我以後得想個辦法來實現讓用戶自己修改POP3/SMTP密碼。可以用數據庫或者其它的驗證方式)
又一個美麗的時刻,新建好的郵件用戶可以POP3收信了!
【注意】-【注意】-【注意】-【注意】-【注意】-【注意】-【注意】-【注意】-【注意】
如果想從Internet上收取別的系統發來的郵件,你需要有自己的域名和管理域名DNS解釋的權限,主要是做好MX記錄解釋。比如我的域名是 hoho.com(其實這已經是被國外註冊了的域名,可是我的英文名就叫HoHo[SnailWarrior是我的筆名],嗚嗚嗚……好想要回來)我在自己的系統上做了MX記錄解釋,如下:
[root@pps mail]# nslookup -q=mx hoho.com
Server:         127.0.0.1
Address:        127.0.0.1#53
hoho.com        mail exchanger = 10 mx1.hoho.com.
hoho.com        mail exchanger = 10 mx2.hoho.com.
hoho.com        mail exchanger = 10 mx3.hoho.com.
hoho.com        mail exchanger = 10 mail.hoho.com.
我自己無聊就做了4個MX記錄,其實都指向本機的192.168.32.50 IP地址。
因此如果想收取外界的郵件,需要把你的域名的MX記錄指向郵件服務器IP地址即可。或者像我這樣,先做一個郵件服務器主機的A記錄,然後設置MX記錄指向郵件服務器主機。
===================================================
客戶端SMTP/POP3設置
===================================================

以我的機器爲例,Foxmail、Outlook裏,SMTP/POP3服務器都填寫192.168.32.50
用戶可以用 mail_user_1 或者用 [email protected] 或者 [email protected] 都可以,密碼當然就是135790了。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章