sendmail是最重要的郵件傳輸代理程序。Sendmail做爲一種免費的郵件服務器軟件,已被普遍的應用於各類服務器中,它在穩定性、可移植性、及確保沒有bug等方面具備必定的特點,且能夠在網絡中搜索到大量的使用資料。通常狀況下,咱們把電子郵件程序分解成用戶代理,傳輸代理和投遞代理。 用戶代理用來接受用戶的指令,將用戶的信件傳送至信件傳輸代理。而投遞代理則從信件傳輸代理取得信件傳送至最終用戶的郵箱。郵件傳輸是從服務器到服務器的,並且每一個用戶必須擁有服務器上存儲信息的空間(稱爲信箱)才能接受郵件(發送郵件不受這個限制)。能夠看到,一個郵件傳輸代理的主要工做是監視用戶代理的請求,根據電子郵件的目標地址找出對應的郵件服務器,將信件在服務器之間傳輸而且將接收到的郵件緩衝或者 提交給最終投遞程序。有許多的程序能夠做爲信件傳輸代理,可是sendmail是其中最重要的一個,事實證實它能夠支持數千甚至更多的用戶,並且佔用的系統資源至關少。不過,sendmail的配置十分複雜,且無驗證,沒有防範垃圾機制,沒有防病毒機制。當sendmail程序獲得一封待發送的郵件的時候,它須要根據目標地址肯定將信件投遞給對應的服務器,這是經過DNS服務實現的。sendmail首先肯定這個地址是用戶名+機器名的格式,而後,經過查詢DNS來肯定須要把信件投遞給某個服務器。DNS數據中,與電子郵件相關的是MX記錄。
MUA (mail user agent 郵件用戶代理),用於用戶端發送郵件或者閱讀郵件。linux有mutt這個工具 MTA (mail tranfer agent 郵件傳輸代理 ),至關於一個郵局,server端的軟件,主要的功能有,接收MUA發來的郵件和把郵件發送給下一個MTA,能夠說是一個郵件路由(mail router),server端的軟件就屬於MTA,如今開源的有sendmail,postfix,qmail等 。
MDA (mail devilery agent 郵件投遞代理),主要是將MTA所接受的郵件,依照郵件的目的地將此郵件放到本機帳號下或者是給下一個MTA,通常就是指mail這樣的命令。
郵件的協議:
發信: SMTP (simple mail tranfer protocol 簡單郵件傳輸協議) 端口號 TCP的25端口,在發信時,MUA會主動鏈接MTA的port 25,而後經由SMTP協議發送出去,SMTP分爲接受SMTP和發送SMTP,它無論兩端主機的配置或者系統等,只要兩邊SMTP協議OK就能夠發送郵件
收信: POP (post office protocol 郵局協議),來鏈接到MTA,以讀取或者下載郵件,如今經常使用的版本是POP3,端口爲110 IMAP (internet message access protocol 網絡報文件協議),能在下載郵件前先下載郵件頭信息,以可讓用戶選擇性下載 端口 143。
首先來測試一下環境
這裏我用的centos的系統,默認彷佛是安裝過了sendmail的,而且是啓動過的。
接着安裝dovecot:yum install dovecot
啓動dovecot: service dovecot start
這時是能夠發信件的,爲了測試能夠先添加兩個帳號user1、user2,而後向其發送一份郵件
由日誌看出,發送成功了,真的發送成功了嗎,要看user1可否收到這封標題爲1的內容爲12387681498649821的郵件,爲了驗證,要切換到user1,進行收信
說明真的發成功,好神奇呀。。。
在後續操做以前,先安裝一個工具sendmail-cf
接下來來修改/etc/mail/目錄下的三個文件
1 vim sendmail.mc ,讓其監聽全部地址,以達到用客戶端也能夠發信件的目的
2 vim access (作中繼)在後面追加,實現這個網段地址的中繼,及到163.com域的都無條件接受,到sina.com的進行中繼
3 vim local-host-names
通過測試,沒有問題,基於上面的基本配置後,下面來開始對sendmail的搭建
一:163.com部分的基本搭建
首先來安裝並搭建DNS服務器(爲了節省資源,把郵件服務器和ns服務器搭在一臺機器上)
至此,dns就安裝安裝完成了,而後開始搭建
而後切換到安裝目錄,來產生配置文件
而後編輯該配置文件
而後修改區域生成文件vim named.rfc1912.zones (填寫內容只是說明用法)
而後去生成163.com.zone
接着編輯163文件
而後啓動dns服務器:service named start
接着要作DNS指向:編輯/etc/resolv.conf
而後修改主機名: vim /etc/sysconfig/network
接着也要把hosts文件也要修改了
重啓sendmail 和DNS服務器
接下來就是測試來看是否搭建成功
由圖可知,基本搭建成功。
二:sina.com的基本搭建
這裏我用redhat來搭建sendmail,在redhat中sendmail依然默認已經安裝並啓動,下面來安裝dovecot: yum install dovecot
啓動dovecot:service dovecot start
創建用戶user3 user4
接下來依舊來安裝並搭建DNS服務器(爲了節省資源,把郵件服務器和ns服務器搭在一臺機器上)
而後切換到安裝目錄,來產生配置文件
而後編輯該配置文件
而後修改區域生成文件vim named.rfc1912.zones (填寫內容只是說明用法)
而後去生成sina.com.zone
接着編輯sina文件
而後啓動dns服務器:service named start
接着要作DNS指向:編輯/etc/resolv.conf
安裝一個工具sendmail-cf
接下來來修改/etc/mail/目錄下的三個文件
1 vim sendmail.mc ,讓其監聽全部地址,以達到用客戶端也能夠發信件的目的
2 vim access (作中繼)在後面追加,實現這個網段地址的中繼,及到sina.com域的都無條件接受,到163.com的進行中繼
3 vim local-host-names
而後修改主機名: vim /etc/sysconfig/network
接着也要把hosts文件也要修改
重啓sendmail 和DNS服務器
接下來就是測試來看是否搭建成功
由此知,基本搭建也已經成功了。
下面來測試從163想sina發送是否成功
由此知,已成功完成兩者的郵件收發。
爲了實現快速發送,這裏要對兩者的DNS作反向解析
163:
vim /var/named/chroot/etc/named.rfc1912.zones
而後去生成這個文件
編輯生成的192.168.102.local文件
而後執行:rndc reload
接下來作sina的DNS反向解析
sina:
vim /var/named/chroot/etc/named.rfc1912.zones
而後生成192.168.102.local文件
編輯生成的192.168.102.local文件
而後執行:rndc reload
而後分別重啓兩者的sendmail和DNS服務器,這時再進行測試,發現速度快了不少。
利用證書實現對信息的加密:
實現這個功能,在一臺機器上實現就好,這裏我在sina.com上實現
爲了試驗的須要,這裏要安裝一款抓包工具
yum install wireshark
因爲要利用證書,因此要作CA
cd /etc/pki/
vim tls/openssl.cnf
接下來建立三個目錄兩個文件:
建立一個序列號到serial中:echo 01 >serial
建立私鑰並修改權限:
生成證書:
至此,CA架設就完成了。
建立一個目錄來存放爲sendmail申請的證書
切換到所建立的目錄:cd /etc/mail/certs
生成私鑰
作請求
產生證書
openssl ca -in sendmail.csr -out sednmail.crt
chmod 600 sendmail.key
編輯文件,使證書生效
重啓sendmail服務器
測試
此時,接收時仍是明文,這時假如接受時使用pop3s或imaps,又該怎麼作呢,這時,能夠再來建立一證書
mkdir -pv /etc/dovecot/certs
生成私鑰:
作請求:
產生證書: openssl ca -in dovecot.csr -out dovecot.crt
chmod 600 dovecot.key
而後結合dovecot來用,vim /etc/dovecot.conf
重啓服務:
service dovecot restart
測試
啓用抓包工具
在服務器上發以信件,這時在客戶端收發
抓包圖示顯示,沒有任何有價值的東西顯示出來
此時就是先了加密。
認證:
可是sendmail自身沒有身份認證能力,要想實現身份認證,必需要藉助sasl協議,而這個協議要想正常工做,就必需要安裝cyrus-sasl這個包,只有安裝了這個包,纔會造成saslauthd這個服務器軟件,下面就來安裝cyrus-sasl
由此信息可知,這個包已經安裝過了,可是還缺乏devel包,是要裝上的
此時去看一個文件
cd /usr/lib/sasl2/
vim Sendmail.conf
這時可知,saslauthd已與sendmail結合了,下面來啓動這個服務器軟件
接着要去修改sendmail的配置文件,來和saslauthd結合
打開檢測機制:
反紅的那個表達式的意思是讓其強制身份認證。
而後重啓服務
而後來用一個不存在的帳號來測試:
Telnet 127.0.0.1 25
能夠看出要求認證了。
當利用auth login指令測試時,帳號不能輸明文的,要輸入base64編碼的帳號,這時要產生這個base64編碼
接着把密碼也生成base64編碼
繼續剛纔的測試,輸入auth login後加入編碼過的用戶
此時就能發信息了,這時在服務器短能夠發信件了,那在客戶端呢
在客戶端依舊以一個不合法的用戶來測試
說明是不能發送的,說明認證也就成功了。