序言
相信读者都有自己的邮箱吧,先在咱的工作真是离不开邮箱啦,电子邮件系统的产生便利了我们的通信交流,电邮的工作模型来源于传统邮局的工作模型,想想当初通信业还不发达的时候,我们都是使用书信来进行交流,大致的工作流程如下图所示
电邮的产生将一切需要人力传播信件的事情全部都分发给协议来做了 ,以前用户去邮局寄信的工作由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域的账户,然后试着发信给两个公司的已经存在的用户试试
那[email protected]用户能不能收到呢
哎呦我去,居然收到啦,这还了得,再送给公司二的[email protected]
再到公司二的客户端去看看[email protected]的收信情况
这下我表示无语啦,这还了得,这样垃圾邮件不就泛滥啦,而且还找不到来源,咋办呢,别急我们可以结合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给[email protected]发邮件试试
这里说明要使用账号认证,那么小编就给test账户使用认证功能啦
再试试
应该会弹出以下界面
当你点击确定登录的时候会发现怎么都登录不上,但是其他合法的用户修改完用户认证后依然能够正常使用
之后发信给其他用户就能正常使用了,这里读者可能会问了smtps不是使用的465端口么,你真是把小编问倒了,这个问题小编我也没解决啊,不过读者你放心啦,小编一定会找到一个好的解决方案啦,目前就先这么着吧
至于公司二服务器的配置也是相同的啦
OK啦,算是大功告成了,非常感谢读者能看完这篇博客,你的支持将是小编无限的动力啦,敬请关注小编的其他博文~\(�R��Q)/~啦啦啦