sendmail在企業網中的應用

一,sendmail簡介

     人們在互聯網上最常使用的就是電子郵件,很多企業用戶也經常使用免費電子郵件系統。本文就以step by step的方式引導用戶從sendmail源代碼開始構建一個可以滿足基本工作需要的郵件系統。

sendmail是最重要的郵件傳輸代理程序。理解電子郵件的工作模式是非常重要的。一般情況下,我們把電子郵件程序分解成用戶代理,傳輸代理和投遞代理。 用戶代理用來接受用戶的指令,將用戶的信件傳送至信件傳輸代理,如:outlook express、foxmail等。而投遞代理則從信件傳輸代理取得信件傳送至最終用戶的郵箱,如:procmail。

當用戶試圖發送一封電子郵件的時候,他並不能直接將信件發送到對方的機器上,用戶代理必須試圖去尋找一個信件傳輸代理,把郵件提交給它。信件傳輸代理得到了郵件後,首先將它保存在自身的緩衝隊列中,然後,根據郵件的目標地址,信件傳輸代理程序將找到應該對這個目標地址負責的郵件傳輸代理服務器, 並且通過網絡將郵件傳送給它。對方的服務器接收到郵件之後,將其緩衝存儲在本地,直到電子郵件的接收者查看自己的電子信箱。

顯然,郵件傳輸是從服務器到服務器的,而且每個用戶必須擁有服務器上存儲信息的空間(稱爲信箱)才能接受郵件(發送郵件不受這個限制)。可以看到,一個郵件傳輸代理的主要工作是監視用戶代理的請求,根據電子郵件的目標地址找出對應的郵件服務器,將信件在服務器之間傳輸並且將接收到的郵件緩衝或者 提交給最終投遞程序。有許多的程序可以作爲信件傳輸代理,但是sendmail是其中最重要的一個,事實證明它可以支持數千甚至更多的用戶,而且佔用的系統資源相當少。不過,sendmail的配置十分複雜,因此,也有人使用另外的一些工具,如qmail、postfix等等。

當sendmail程序得到一封待發送的郵件的時候,它需要根據目標地址確定將信件投遞給對應的服務器,這是通過DNS服務實現的。例如一封郵件的目標地址是[email protected],那麼sendmail首先確定這個地址是用戶名(ideal)+機器名(linuxaid.com.cn)的格式,然後,通過查詢DNS來確定需要把信件投遞給某個服務器。

DNS數據中,與電子郵件相關的是MX記錄,例如在linuxaid.com.cn這個域的DNS數據文件中有如下設置:

IN MX 10 mail

IN MX 20 mail1

mail IN A 202.99.11.120

mail1 IN A 202.99.11.121

顯然,在DNS中說明linuxaid.com.cn有兩個信件交換(MX)服務器,於是,sendmail試圖將郵件發送給兩者之一。一般來說,排在前面的的MX服務器的優先級別比較高,因此服務 器將試圖連接mail.linuxaid.com.cn的25端口,試圖將信件報文轉發給它。如果成功,你的smtp服務器的任務就完成了,在這以後的任務,將由mail.linuxaid.com.cn來完成。在一般的情況下,mail換器會自動把信件內容轉交給目標主機,不過,也存在這樣的情況,目標主機(比如linuxaid.com.cn)可能並不存在,或者不執行smtp服務,而是由其mx交換器來執行信件的管理,這時候,最終的信件將保存在mx機器上,直到用戶來察看它。

如果DNS查詢無法找出對某個地址的MX記錄(通常因爲對方沒有信件交換主機),那麼sendmail將是試圖直接與來自郵件地址的主機對話並且發送郵件。例如,[email protected]中沒有對應的MX記錄,因此sendmail在確定MX交換器失敗後,將從DNS取得對方的IP地址並直接和對方對話試圖發送郵件。

二,sendmail使用技巧 1、爲什麼不能配置郵件服務器爲open relay的?

如果系統管理員將自己的郵件服務器設置爲open relay,將會導致一些垃圾郵件發送者將你的郵件服務器作爲轉發自圾郵件的中繼站,這將使垃圾郵件的接收者將矛頭對準你,可能會導致報復性的郵件炸彈;垃圾郵件還能消耗你大量的資源,佔用你的帶寬。更爲糟糕的事情可能是你的名字可能會上了黑名單,成爲其他郵件接收者共同抵制的目標,你的郵件將被這些接收者所拒絕。

2、什麼是郵件轉發(mail relay)

設置好一個email服務器以後,該服務器將具有一個或若干個域名,這時email服務器將監聽25號端口,等待遠程的發送郵件的請求。網絡上其他的mail服務器或者請求發送郵件的MUA(Mail User Agent,如outlook express、foxmail等等)會連接email服務器的25號端口,請求發送郵件,SMTP會話過程一般是從遠程標識自己的身份開始,過程如下:

HELO remote.system.domainname

250 qmailserver.domain

MAIL FROM:[email protected]

250 OK

RCPT TO: [email protected]

郵件的接收者[email protected]中的域名並不一定是本地域名,這時候本地系統可能有兩種回答,接受它:

250 OK

或者拒絕接受它:

553 sorry,.that domain isnot in my domain list of allowed recphosts

第一種情況下,本地email服務器是允許relay的,它接收並同意傳遞一個目的地址不屬於本地域名的郵件;而第二種情況則不接收非本地郵件。

email一般都有一個配置文件,其決定了是否接受一個郵件。只有當一個RCPT TO命令中的接收者地址的域名存在於該文件中時,才接受該郵件,否則就拒絕該郵件。若該文件不存在,則所有的郵件將被接受。當一個郵件服務器不管郵件接收者和郵件接收者是誰,而是對所有郵件進行轉發(relay),則該郵件服務器就被稱爲開放轉發(open relay)的。當email服務器沒有設置轉發限制時,其是開放轉發的。

3、sendmail如何限制郵件轉發

因爲Send Mail 爲了怕變成廣告信轉信站所以安裝後只線本機上的使用者寄信,要讓它爲你轉信需要修改一點東西。 修改 /etc/mail/access 檔案在裏面增加下面幾行。

localhost RELAY

192.168.1 RELAY

就可以將 192.168.1 網域裏的信轉出去了。

三,sendmail服務器的搭建:

1,搭建163.com sendmail服務器

實驗拓撲

2012-09-10_093001

安裝dns服務並配置mx記錄

[root@station2 ~]# cd /var/named/chroot/etc/
[root@station2 etc]# vim named.conf

2012-09-09_125343

[root@station2 etc]# vim /etc/named.rfc1912.zones

2012-09-09_125850

[root@station2 etc]# cd ../var/named/
[root@station2 named]# cp -p localhost.zone 163.com.zone
[root@station2 named]# vim 163.com.zone
2012-09-09_130835 

[root@station2 named]# service named start
[root@station2 named]# vim /etc/resolv.conf

2012-09-09_131154

加載sendmail

[root@station2 Server]# mkdir /mnt/cdrom/
[root@station2 Server]# mount /dev/cdrom /mnt/cdrom/
[root@station2 Server]# cd /mnt/cdrom/Server/
[root@station2 Server]# rpm -ivh sendmail-cf-8.13.8-2.el5.i386.rpm

[root@mail Server]# rpm -ivh m4-1.4.5-3.el5.1.i386.rpm
[root@station2 Server]# cd /etc/mail/
[root@station2 mail]# vim sendmail.mc 

 
2012-09-09_131836

[root@station2 mail]# vim access

2012-09-09_132355

[root@station2 mail]# vim local-host-names

2012-09-09_132614

[root@station2 mail]# service sendmail restart
測試
[root@mail ~]# mail -s ok user1
jx
.
Cc:

2012-09-09_133821

[root@mail ~]# cd /mnt/cdrom/Server/
[root@mail Server]# yum install dovecot-1.0.7-7.el5.i386.rpm
[root@mail ~]# useradd user1
[root@mail ~]# passwd user1
[root@mail ~]# useradd user2
[root@mail ~]# passwd user2

 

 

2012-09-09_164835

2012-09-09_164921

2012-09-09_165008

2012-09-09_165058

2012-09-09_165223

2012-09-09_170106

2012-09-09_170210

查看日誌

2012-09-09_170643

2012-09-09_170809

2012-09-09_170826

2012-09-09_170932

2012-09-09_171024

 

 

2012-09-09_171336

 

郵件別名 實現郵件羣發

[root@mail ~]# vim /etc/aliases

2012-09-09_171724

[root@mail ~]# mail jx
Subject: jx
111111111111111111

2012-09-09_171922

克隆一臺主機 做sina服務器


sh-3.2# cd/var/named/chroot/etc/
sh-3.2#vim named.rfc1912.zones
2012-09-09_175459sh-3.2#cd /var/named/chroot/var/named/
sh-3.2#mv 163.com.zone sina.com.zone
sh-3.2#vim sina.com.zone
2012-09-09_182118

sh-3.2#cd /etc/mail
sh-3.2#vim access

2012-09-09_182459 

sh-3.2#vim local-host-names

2012-09-09_182647

sh-3.2#vim /etc/sysconfig/network

2012-09-09_182927

[root@mail ~]# userdel -r user1
[root@mail ~]# userdel -r user2
[root@mail ~]# passwd user3
[root@mail ~]# passwd user4
[root@mail ~]# vim /etc/resolv.conf

2012-09-09_184036

測試圖
2012-09-09_185153

2,實現163與新浪郵件服務器通信

拓撲圖:

2012-09-10_103629

 

[root@mail ~]# vim /var/named/chroot/etc/name.conf

2012-09-09_191136

在新浪服務器上
[root@mail ~]# vim /var/named/chroot/etc/named.conf

2012-09-09_191616
反向解析
[root@mail ~]# cd /var/named/chroot/etc/
[root@mail etc]# vim named.rfc1912.zones

2012-09-09_193419

[root@mail named]# cp -p named.local 192.168.220.zone

[root@mail named]# vim 192.168.220.zone

2012-09-09_200242
新浪
[root@mail etc]# vim named.rfc1912.zones

[root@mail etc]# cd ../var/named/
[root@mail named]# cp -p named.local 192.168.220.zone
[root@mail named]# vim 192.168.220.zone

2012-09-09_200108 

測試

163向新浪發郵件
[root@mail ~]# telnet 127.0.0.1 25
mail from:[email protected]
rcpt to:[email protected]
data
subject:123
111111111111111111111111
.
新浪user3用戶接受
[root@mail ~]# su - user3
[user3@mail ~]$ mail

2012-09-09_233010

2012-09-09_233058

3,測試不安全性 用wireshark抓包
[root@mail Server]# yum install
wireshark-1.0.8-1.el5_3.1.i386.rpm
[root@mail Server]# tshark -ni eth0 -R "tcp.dstport eq 110"

不安全
安全性考慮首先創建CA詳情見本博客其他文章

4,實現加密通信
將一系列私鑰證書請求申請證書鑰匙放入目錄
[root@mail CA]# mkdir -pv /etc/mail/certs
[root@mail CA]# cd /etc/mail/certs/
[root@mail certs]# openssl genrsa 1024 >sendmail.key放私鑰
[root@mail certs]# openssl req -new -key sendmail.key -out sendmail.csr產生證書請求文件
 
2012-09-10_001428

[root@mail certs]#  openssl ca -in sendmail.csr -out sendmail.cert由請求得到證書
證書服務器捆綁
[root@mail certs]# vim /etc/mail/sendmail.mc
 
2012-09-10_002505

2012-09-10_002649
不安全改權限
[root@mail certs]# chmod 600 *
[root@mail certs]# service sendmail restart
測試
[root@mail certs]# telnet 127.0.0.1 25
ehlo 127.0.0.1
圖啓用了 starttls

2012-09-10_003418

實現了郵件加密
測試郵件客戶端

2012-09-10_003739

2012-09-10_003809

測試安全的傳送

2012-09-10_004318

2012-09-10_004558

 

抓包圖
[root@mail ~]# tshark -ni eth0 -R "tcp.dstport eq 25"
抓包給另一個用戶發信
加密的圖

加密的
接收加密
[root@mail ~]# mkdir -pv /etc/dovecot/certs
[root@mail ~]# cd /etc/dovecot/certs/
[root@mail certs]# openssl genrsa 1024 >dovecot.key
[root@mail certs]# openssl req -new -key dovecot.key -out dovecot.csr
[root@mail certs]# openssl ca -in dovecot.csr -out dovecot.cert
[root@mail certs]# vim /etc/dovecot.conf

2012-09-10_010207

2012-09-10_010420

 

[root@mail certs]# service dovecot restart
測試客戶端設置 圖

2012-09-10_010611

 


抓包[root@mail ~]# tshark -ni eth0 -R "tcp.dstport eq 995 or tcp.srcport eq 995"
 
2012-09-10_011000

實現加密傳輸

5,實現賬號驗證

[root@mail Server]# vim /etc/mail/sendmail.mc

2012-09-10_172549

2012-09-10_172642

牆紙身份驗證

 

[root@mail ~]# service saslauthd start
測試驗證機制起來沒

2012-09-10_172836

再次測試身份驗證

2012-09-10_173328

測試:用外部主機telnet到服務器上測試

2012-09-10_174708
[root@mail ~]# echo -n "[email protected]" |openssl base64
dXNlcjFAMTYzLmNvbQ==
[root@mail ~]# echo -n "123" |openssl base64
MTIz

 

2012-09-10_175033

查看日誌結果

2012-09-10_174803

 

[root@localhost ~]# vim /etc/sysconfig/network

##修改主機名 必須是本地dns域中能解析的主機名

3 HOSTNAME=mail.163.com
測試開臺XP虛擬機使用outlook客戶端工具
圖 
 

與squrrelmail結合

[root@station2 Server]# yum install squirrelmail-1.4.8-5.el5_3.7.noarch.rpm
[root@mail Server]# cd /var/www/html/
[root@mail html]# ln -s /usr/share/squirrelmail/ mail
[root@mail html]# cd mail
[root@mail mail]# cd config/
[root@mail config]# ./conf.pl

 

 

此處如果是postfix則需要選擇3中sendmail改爲smtp

[root@mail config]# vim /etc/httpd/conf/httpd.conf

[root@mail config]# service httpd restart

 

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