序言
相信讀者都有自己的郵箱吧,先在我們的工作真是離不開郵箱啦,電子郵件系統的產生便利了我們的通訊交流,電郵的工作模型來源於傳統郵局的工作模型,想想當初通訊業還不發達的時候,我們都是使用書信來進行交流,大致的工作流程如下圖所示
電郵的產生將一切需要人力傳播信件的事情全部都分發給協議來做了 ,以前使用者去郵局寄信的工作由SMTP(簡單郵件傳輸協議)來做了,郵遞員給使用者送信的工作由POP2/POP3/IMAP4協議來做了,這樣一來所有的信件都通過網路來傳輸,那效率便是極高的了,當今的電郵系統大都支援MIME,所以信件的內容就豐富了,可以有音訊、圖片、視訊等,但是讀者應該知道,一切內容到達網路都將存在安全隱患,上述所列的協議在傳輸資訊的時候都是使用的明文,這可不能行啊,還有就是垃圾郵件和病毒的煩惱,那麼如何來解決,讀者現在是不是覺得電郵系統問題多多啊,別急,小編在這篇部落格中將詳細的來實現一個電郵系統,從簡單到複雜,幫助讀者來詳細瞭解電郵系統的搭建。
電郵系統的組成
1. 伺服器
- 傳送伺服器(MTA):為了實現傳送伺服器不同的OS下都有相應的軟體
Windows下:電子郵件服務、 exchange(需要結合域)
Linux下:sendmail 【無驗證、無防垃圾、無防病毒】 、postfix、 extmail,雖然sendmail有很多的缺點,但是由於它是最早出現的,目前任然有很大的使用者群
還有第三方下的qmail
- 接收伺服器(MRA):
Windows下:電子郵件服務
Linux下:dovecot {能實現pop3 imap4 pop3s imaps}
2. 郵件分揀 MDA
maildrop procmail
3. 客戶端(MUA)
Windows下:outlook、foxmail
Linux下:mutt、mail、evolution、thunderbird
4. 電郵安全
- 中繼
郵件中繼(SMTP Relay Service)指在不改變使用者郵件地址(發 件人)的前提下,將使用者郵件通過多鏈路SMTP郵件轉發伺服器 投遞到收件人郵件伺服器。
- 反垃圾郵件
常用軟體:asf、 spamassian
- 防病毒
常用軟體:clamav
接下來的工作就是小編來實現電郵系統,整個過程相當的長啊,小編使用word文件寫了整整59頁啦,因為覺得很有意義,所以分享給讀者,讀者在看的時候一定要有耐心啦,如果有啥不明白的請及時聯絡小編哈。。
Project 1:簡單電郵系統實現
需求描述:
現有兩公司,公司之間業務來往頻繁,兩公司希望建立郵件系統來方便員工之間的通訊,根據需求,實現拓撲如下
準備工作:
小編使用vm虛擬機器來完成案例
兩臺伺服器軟體需求一致server linux 5.4
Bind-9.3.6-4.P1.el5
bind-chroot- 9.3.6-4.P1.el5
caching-nameserver
sendmail-8.13.8-2.el5
sendmail-cf-8.13.8-2.el5
sendmail-devel-8.13.8-2.el5
dovecot-1.0.7-7.el5
上述軟體包,linux映象中帶得都有啦,讀者可以直接使用yum安裝就是了,因為電郵系統也會用到域名解析,所以DNS的搭建是必不可少的
公司一伺服器配置(先實現一個公司內部能相互傳送郵件)
Step 1:首先是網路卡引數的配置,伺服器是有兩塊網路卡的,eth0是內網路卡,eth1是外網路卡,網路卡引數的配置檔案在/etc/sysconfig/network-scripts/目錄下,分別為ifcfg-eth0和ifcfg-eth1
# vim /etc/sysconfig/network-scripts/ifcfg-eth0 修改新增一下內容即可BOOTPROTO=static
IPADDR=192.168.111.20
NETMASK=255.255.255.0
# vim /etc/sysconfig/network-scripts/ifcfg-eth1BOOTPROTO=static
IPADDR=10.0.0.1
NETMASK=255.255.255.0
修改完成之後重新啟動網路服務
# service network restart
因為兩塊網路卡涉及到網路資料轉發問題,所以要開啟資料轉發選項(這裡是為後續的兩個公司之間的電郵通訊做準備的)
# vim /etc/sysctl.conf
net.ipv4.ip_forward = 1
還要新增預設路由能讓兩個公司之間互通
# route add –net default gw 10.0.0.1
要注意的是,這裡的路由是臨時路由每當網路服務重啟的時候都要重新手工新增,當然讀者也可以新增永久靜態路由
step 2:修改主機名,sendmail會檢查主機名的設定,這一步很重要,不然後面啟動sendmail的時候會很慢
# vim /etc/sysconfig/network
HOSTNAME=zzu.com # vim /etc/hosts 192.168.111.20 zzu.com |
最好重新啟動讓主機名生效,這裡還有簡潔的一招就是臨時修改主機名
# hostname zzu.com
Step 3:DNS伺服器的搭建,使用yum分別將Bind-9.3.6-4.P1.el5、bind-chroot- 9.3.6-4.P1.el5、caching-nameserver安裝好,bind的配置檔案在/var/named/chroot/etc/目錄下,官方給了一個樣例檔案,這裡直接拷貝修改即可
# cd /var/named/chroot/etc/
# cp -p named.caching-nameserver.conf named.conf //這裡讀者一定要加上“-p”引數將檔案的許可權帶過來 # vim named.conf //修改以下幾選項(讀者如果複製貼上的話要注意符號) listen-on port 53 { any; }; allow-query { any; }; allow-query-cache { any; }; match-clients { any; }; match-destinations { any; }; |
然後編輯區域配置檔案
# vim named.rfc1912.zones zone “zzu.com” IN {
type master;
file “zzu.com.zone”;
allow-update { none; };
};
之後建立區域檔案
# cd /var/named/chroot/var/named/
# cp -p localhost.zone zzu.com.zone
# vim zzu.com.zone
$TTL 86400
@ IN SOA ns.zzu.com. root (
42 ; serial (d. adams)
3H ; refresh
15M ; retry
1W ; expiry
1D ) ; minimum
@ IN NS ns.zzu.com.
ns IN A 192.168.111.20
mail IN A 192.168.111.20
pop3 IN CNAME mail
smtp IN CNAME mail
@ IN MX 10 mail
這裡可以看到小編的MX記錄了吧
接下來啟動named服務
# service named start //如果啟動失敗要讀者要認真看日誌,最常見的錯誤就是符號問題或者時檔案的許可權問題
將伺服器的域名解析伺服器指向192.168.111.20
# vim /etc/resolv.conf
nameserver 192.168.111.20
在伺服器測試看看可以使用
# nslookup
好啦,到這裡dns伺服器計算搭建完了
Step 4:Sendmail傳送伺服器的搭建
# yum install sendmail # yum install sendmail-cf //實現sendmail.mc轉向sendmail.cf |
sendmail的配置檔案在/etc/mail目錄下,這裡會涉及到修改access(用於實現中繼,修改完後會轉為)、local-host-names(設定sendmail承認的主機名)、sendmail.mc(配置檔案,配置完成之後在sendmail-cf工具的幫助下自動轉為sendmail.cf)
# vim access //新增一下兩行,具體的解釋小編在後面的安全性會介紹到
Connect:192.168.111 RELAY
zzu.com OK
# vim local-host-names //新增本機主機名即可
zzu.com
# vim sendmail.mc //找到116行,修改成以下內容
DAEMON_OPTIONS(`Port=smtp,Addr=0.0.0.0, Name=MTA`)dnl
看到了吧,smtp協議,小編將監聽地址改為0.0.0.0,兩塊網路卡都能夠監聽到
到這裡傳送伺服器就算配置完成了,啟動sendmail服務並檢視埠的監聽狀態
# service sendmail start
# netstat –tupln | grep sendmail
Step 5:Dovecot接收伺服器的搭建
# yum install dovecot |
dovecot的配置檔案在/etc目錄下叫dovecot.conf讀者這裡不用修改即可使用
啟動dovecot服務並檢視埠監聽狀態
# service dovecot start
# netstat –tupln |grep dovecot
到這裡單邊的為實現一個公司內部能郵件通訊的無加密的簡單電郵系統就搭建完成了
郵件系統還要提供合法的賬戶給使用者通訊使用
# useradd user1
# passwd user1
# useradd user2
# passwd user2
Step 6:客戶端(MUA)配置實現
小編這裡的郵件客戶端用的是微軟的outlook
第一步修改網路卡引數
第二步建立賬戶
針對於user2使用者的主機配置大致和user1的相同
網路卡引數
新增賬戶的部分將user1改為user2即可
Step 7:客戶端之間相互郵件通訊試試
User1發信給user2
在伺服器端監控sendmail日誌
# tail –f /var/log/maillog
這只是發到伺服器啦,user2還要接收一下啦
開啟看看
再看看伺服器日誌
用user2 回覆一下啦
在user1上收一下
監控日誌
這樣一來,公司一內部郵件通訊無障礙了吧
Project 2:不同區域郵件互通實現
實現兩個公司相互通訊
這裡就要涉及到郵件中繼的啦,郵件中繼(SMTP Relay Service)指在不改變使用者郵件地址(發件人)的前提下,將使用者郵件通過多鏈路SMTP郵件轉發伺服器投遞到收件人郵件伺服器。
公司二伺服器配置
Step 1:首先是網路卡引數的配置,伺服器是有兩塊網路卡的,eth0是內網路卡,eth1是外網路卡,網路卡引數的配置檔案在/etc/sysconfig/network-scripts/目錄下,分別為ifcfg-eth0和ifcfg-eth1
# vim /etc/sysconfig/network-scripts/ifcfg-eth0 修改新增一下內容即可 BOOTPROTO=static IPADDR=192.168.112.20 NETMASK=255.255.255.0 # vim /etc/sysconfig/network-scripts/ifcfg-eth1 BOOTPROTO=static IPADDR=10.0.0.2 NETMASK=255.255.255.0 |
修改完成之後重新啟動網路服務
# service network restart
因為兩塊網路卡涉及到網路資料轉發問題,所以要開啟資料轉發選項
# vim /etc/sysctl.conf net.ipv4.ip_forward = 1
還要新增預設路由能讓兩個公司之間互通
# route add –net default gw 10.0.0.2
要注意的是,這裡的路由是臨時路由每當網路服務重啟的時候都要重新手工新增,當然讀者也可以新增永久靜態路由
Step 2:修改主機名,sendmail會檢查主機名的設定,這一步很重要,不然後面啟動sendmail的時候會很慢
# vim /etc/sysconfig/network HOSTNAME=ruanjian.com # vim /etc/hosts 192.168.112.20 ruanjian.com |
最好重新啟動讓主機名生效,這裡還有簡潔的一招就是臨時修改主機名
# hostname ruanjian.com
Step 3:DNS伺服器的搭建,使用yum分別將Bind-9.3.6-4.P1.el5、bind-chroot- 9.3.6-4.P1.el5、caching-nameserver安裝好,bind的配置檔案在/var/named/chroot/etc/目錄下,官方給了一個樣例檔案,這裡直接拷貝修改即可
# cd /var/named/chroot/etc/ # cp -p named.caching-nameserver.conf named.conf //這裡讀者一定要加上“-p”引數將檔案的許可權帶過來 # vim named.conf //修改以下幾選項(讀者如果複製貼上的話要注意符號) listen-on port 53 { any; }; allow-query { any; }; allow-query-cache { any; }; match-clients { any; }; match-destinations { any; }; |
然後編輯區域配置檔案
# vim named.rfc1912.zones
zone “ruanjian.com” IN {
type master;
file “ruanjian.com.zone”;
allow-update { none; };
};
之後建立區域檔案
# cd /var/named/chroot/var/named/
# cp -p localhost.zone ruanjian.com.zone
# vim ruanjian.com.zone
$TTL 86400
@ IN SOA ns. ruanjian.com. root (
42 ; serial (d. adams)
3H ; refresh
15M ; retry
1W ; expiry
1D ) ; minimum
@ IN NS ns. ruanjian.com.
ns IN A 192.168.112.20
mail IN A 192.168.112.20
pop3 IN CNAME mail
smtp IN CNAME mail
@ IN MX 10 mail
這裡可以看到小編的MX記錄了吧
接下來啟動named服務
# service named start //如果啟動失敗要讀者要認真看日誌,最常見的錯誤就是符號問題或者時檔案的許可權問題
將伺服器的域名解析伺服器指向192.168.112.20
# vim /etc/resolv.conf
nameserver 192.168.112.20
在伺服器測試看看可以使用
# nslookup
好啦,到這裡dns伺服器計算搭建完了
Step 4:Sendmail傳送伺服器的搭建
# yum install sendmail # yum install sendmail-cf |
sendmail的配置檔案在/etc/mail目錄下,這裡會涉及到修改access(用於實現中繼,修改完後會轉為)、local-host-names(設定sendmail承認的主機名)、sendmail.mc(配置檔案,配置完成之後在sendmail-cf工具的幫助下自動轉為sendmail.cf)
# vim access
Connect:192.168.112 RELAY
ruanjian.com OK
# vim local-host-names //新增本機主機名即可
ruanjian.com
# vim sendmail.mc //找到116行,修改成以下內容
DAEMON_OPTIONS(`Port=smtp,Addr=0.0.0.0, Name=MTA`)dnl
看到了吧,smtp協議,小編將監聽地址改為0.0.0.0,兩塊網路卡都能夠監聽到
到這裡傳送伺服器就算配置完成了,啟動sendmail服務並檢視埠的監聽狀態
# service sendmail start # netstat –tupln | grep sendmail
Step 5:Dovecot接伺服器的搭建
# yum install dovecot |
dovecot的配置檔案在/etc目錄下叫dovecot.conf讀者這裡不用修改即可使用
啟動dovecot服務並檢視埠監聽狀態
# service dovecot start
# netstat –tupln |grep dovecot
到這裡單邊的為實現一個公司內部能郵件通訊的無加密的簡單電郵系統就搭建完成了
郵件系統還要提供合法的賬戶給使用者通訊使用
# useradd user1
# passwd user1
# useradd user2
# passwd user2
客戶端的配置與公司一客戶端配置相似,這裡小編就不細講了
Step 6:開啟兩端伺服器的郵件中繼功能,修改sendmail的access檔案
a) 公司一伺服器,在access檔案新增一下幾行
Connect:192.168.111 RELAY
zzu.com OK
ruanjian.com RELAY
b) 公司二伺服器,在access檔案新增一下幾行
Connect:192.168.112 RELAY
zzu.com RELAY
ruanjian.com OK
還有要注意的是,原來單方郵局內的使用者是可以相互郵件通訊的,當郵局收到客戶端發往其他郵局信件的時候,並不知道另一方郵局是誰,如何解決呢,這裡用到DNS區域傳輸,讓兩個郵局之間的區域相互傳輸就是了,這樣當一個區域的郵局問另一個郵局在哪的時候就知道了對方郵局的IP,這還不算完事,當信件發到對方伺服器,sendmail是根據域名來接受信件的,所以對方郵局還要做反向DNS解析。
配置對於兩端伺服器是相互的
Step 7:公司一伺服器,DNS伺服器增加配置
# vim /var/named/chroot/etc/named.conf //在options節點中新增 forwarders { 10.0.0.2; }; # vim /var/named/chroot/etc/named.rfc1912.zones //新增以下區域 zone “112.168.192.in-addr.arpa” IN { type master; file “192.168.112.local”; allow-update { none; }; }; zone “0.0.10.in-addr.arpa” IN { type master; file “10.0.0.local”; allow-update { none; }; }; |
兩個反向區域檔案的內容
# cd /var/named/chroot/var/named/
# vim 192.168.112.local
$TTL 86400
@ IN SOA 112.168.192. root.localhost. (
1997022700 ; Serial
28800 ; Refresh
14400 ; Retry
3600000 ; Expire
86400 ) ; Minimum
IN NS 112.168.192.
20 IN PTR mail.ruanjian.com.
# vim 10.0.0.loacl
$TTL 86400
@ IN SOA 0.0.10. root.localhost. (
1997022700 ; Serial
28800 ; Refresh
14400 ; Retry
3600000 ; Expire
86400 ) ; Minimum
IN NS 0.0.10.
1 IN PTR mail.zzu.com.
2 IN PTR mail.ruanjian.com.
Step 8:公司二伺服器,DNS伺服器增加配置
# vim /var/named/chroot/etc/named.conf //在options節點中新增 forwarders { 10.0.0.1; }; # vim /var/named/chroot/etc/named.rfc1912.zones //新增以下區域 zone “111.168.192.in-addr.arpa” IN { type master; file “192.168.111.local”; allow-update { none; }; }; zone “0.0.10.in-addr.arpa” IN { type master; file “10.0.0.local”; allow-update { none; }; }; |
兩個個反向區域檔案的內容
# cd /var/named/chroot/var/named/
# vim 192.168.111.local
$TTL 86400
@ IN SOA 111.168.192. root.localhost. (
1997022700 ; Serial
28800 ; Refresh
14400 ; Retry
3600000 ; Expire
86400 ) ; Minimum
IN NS 111.168.192.
20 IN PTR mail.zzu.com.
# vim 10.0.0.loacl
$TTL 86400
@ IN SOA 0.0.10. root.localhost. (
1997022700 ; Serial
28800 ; Refresh
14400 ; Retry
3600000 ; Expire
86400 ) ; Minimum
IN NS 0.0.10.
1 IN PTR mail.zzu.com.
2 IN PTR mail.ruanjian.com.
Step 9:測試兩公司之間員工通訊情況
公司一的user1使用者給公司二的user1使用者發信
收到了吧
回覆郵件試試
公司一的user1收信看看
成功了吧
Project 3:實現郵件的安全通訊
經過上面的兩大步實驗,小編已經實現了不同郵局之間的郵件通訊,可是安全麼,還記得小編在最先前提的smtp和pop3都是明文傳輸的麼,有多可怕,小編這裡就以實驗證明,小編就來在公司一伺服器的eth0介面抓一下資料包來看看,這裡用到的軟體是linux5.4自帶的wireshark,如果沒安裝的話可以使用yum安裝啦
因為這裡sendmail的傳送伺服器,在傳送郵件的時候是沒有認證的,沒有賬號和密碼,那小編就不抓smtp協議的資料啦,抓一下pop3的資料吧
# tshark -ni eth0 -R “tcp.port eq 110” //pop3使用的是tcp110埠 |
看到了吧使用者名稱和密碼都抓到了,這還了得,為了解決安全隱患,人們加入了ssl來幫助解決
Smtp+ssl=smtps 465埠
Pop3+ssl=pop3s 995埠
Imap+ssl=imaps 993埠
要想實現ssl,那就得有根CA啦,這個CA的搭建小編在前面的部落格中已經使用N多次了,這裡兩邊的伺服器都得做
公司一伺服器以及客戶端的配置
Step 1:根CA的搭建
# cd /etc/pki/ # vim tls/openssl.cnf |
然後就是三個資料夾,兩個檔案
# cd /etc/pki/CA
# mkdir certs crl newcerts
# touch index.txt serial
# echo “01” >>serial
生成私鑰
# openssl genrsa 1024 >> private/cakey.pem
# chmod 600 private/cakey.pem
提取證書
# openssl req –new –key private/cakey.pem –x509 –out cacert.pem
Step 2:為smtp生成證書
# mkdir /etc/mail/certs/ # cd /etc/mail/certs/ # openssl genrsa 1024 > sendmail.key # chomd 600 sendmail.key # openssl req –new –key sendmail.key –out sendmail.csr |
這裡的域名要和DNS記錄裡的對應
# openssl ca -in sendmail.csr -out sendmail.crt
Step 3:Smtp+ssl
# cd /etc/mail/ # vim sendmail.mc |
開啟smtps協議
重新啟動sendmail服務
# service sendmail restart
檢視監聽埠
Step 4:為pop3生成證書
# mkdir –p /etc/dovecot/certs # cd /etc/dovecot/certs # openssl genrsa 1024 > dovecot.key # chomd 600 dovecot.key # openssl req -new -key dovecot.key -out pop3.csr |
這裡的域名要和DNS記錄裡的對應
# openssl ca -in pop3.csr -out pop3.crt
Step 5:Pop3+ssl
# vim /etc/dovecot.conf |
Step 6:公司一客戶機單邊測試,user1和user2都使用smtps和pop3s進行郵件通訊
修改user1的賬戶屬性
user2的賬戶屬性和user1相同
使用user1向user2發信
user2收信看看
同時伺服器使用wireshark抓pop3s的包看看
Step 7:為imap生成證書
小編在以前配置DNS的時候別名記錄少加了一條別名記錄,讀者加上啦(zzu.com.zone),不然證書和域名對不上號,會出錯的
imap IN CNAME mail
# cd /etc/dovecot/certs
# openssl req -new -key dovecot.key -out imap.csr
# openssl ca -in imap.csr -out imap.crt
Step 8:Imap+ssl
# vim /etc/dovecot.conf //新增 ssl_cert_file = /etc/dovecot/certs/imap.crt ssl_key_file = /etc/dovecot/certs/dovecot.key |
重新啟動dovecot服務
# service dovecot restart
為了測試,在伺服器端新增user3
# useradd user3
# passwd user3
Step 9:在客戶機建立接收賬戶user3
修改user3的屬性
儲存之後
選擇是
使用這個證書
然後轉到收件箱
因為目前沒有信件就是空的,現在讓user2使用者給user3使用者發信件
user3使用者這邊不用手動收信就能接收到信件,開啟看看
成功了吧
如果公司一郵件伺服器以及客戶端的搭建讀者你已經完全的掌握,那麼“比著葫蘆畫瓢“,公司二的郵件伺服器以及客戶端的配置也是很容易的了,這些任務都交給讀者啦,算是一種考驗吧
小編這裡將驗證結果附上,公司一的user1同公司二的user1通訊使用smtps和pop3s,公司一的user2和公司二的user2通訊使用smtps和imaps
公司一的user1發信給公司二的user1
收到信件
公司二的user1回信給公司一的user1
公司一的user1收信
公司一的user2 發信給公司二的user2
公司二的user2收到信件
回覆公司一的user2
公司一的user2收到信件
好啦,到這裡,證書配合協議的使用已經全部實現啦,這樣一來信件的資訊都是加密的啦
Step 10:賬號認證機制實現
能看到這裡的讀者,說明讀者你很有耐心啊,我表示當小編寫到這裡的時候已經快崩潰啦,哎,不過小編有讀者的支援,加油啦。
讀者你估計在上面的實驗中會發現,當我們有smtp或者smtps協議發信的過程中是不是沒有賬號認證啊,讀者會問了,那我們建立了賬號了啊,咋會沒有賬號認證呢,在細細想想,是不是我們在接收信件的過程中有賬戶的認證過程,這個問題很嚴重啊,想過沒有,一個在伺服器不存在的使用者也能在客戶端發信呢,那麼小編來試一試就成了
在公司一的客戶端隨便建立一個zzu.com域的賬戶,然後試著發信給兩個公司的已經存在的使用者試試
那user1@zzu.com使用者能不能收到呢
哎呦我去,居然收到啦,這還了得,再送給公司二的user1@ruanjian.com
再到公司二的客戶端去看看user1@ruanjain.com的收信情況
這下我表示無語啦,這還了得,這樣垃圾郵件不就氾濫啦,而且還找不到來源,咋辦呢,別急我們可以結合sasl協議(簡單安全認證層)來解決這個問題啦,在linux 5.4的光碟映象中有一個軟體叫cyrus-sasl,使用這個東東就能解決賬號認證問題了,小編這裡直接使用yum安裝一下,改軟體的配置檔案叫Sendmail.conf,不過不用修改啦,服務控制叫saslauthd
# yum install cyrus-sasl # rpm -ql cyrus-sasl //查詢一下軟體產生的檔案 |
在sendmail配置檔案中開啟賬號認證功能
# vim /etc/mail/sendmail.mc
開啟52和53行的註釋
之後重新啟動sendmail服務
# service sendmail restart
啟動sasl服務
# service saslauthd start
之後再使用那個不合法的使用者test給user1@zzu.com發郵件試試
這裡說明要使用賬號認證,那麼小編就給test賬戶使用認證功能啦
再試試
應該會彈出以下介面
當你點選確定登入的時候會發現怎麼都登入不上,但是其他合法的使用者修改完使用者認證後依然能夠正常使用
之後發信給其他使用者就能正常使用了,這裡讀者可能會問了smtps不是使用的465埠麼,你真是把小編問倒了,這個問題小編我也沒解決啊,不過讀者你放心啦,小編一定會找到一個好的解決方案啦,目前就先這麼著吧
至於公司二伺服器的配置也是相同的啦
OK啦,算是大功告成了,非常感謝讀者能看完這篇部落格,你的支援將是小編無限的動力啦,敬請關注小編的其他博文~(≧▽≦)/~啦啦啦