mail使用的协议是:
smtp(sample mail transform protocol)<port:25>
pop3(post office protocol)<port:110>
smtps <port:465/tcp>
pop3s <port:995/tcp>
imap4 <port:143/tcp>
imaps <port:993/tcp>
MTA:mail transfer agent 邮件传输代理
常用软件:
Exchange(微软)
Sendmail 开源的软件 目前有50%的邮件服务器使用这个软件
Postfix 现在用的挺多
Qmail 昙花一现
Exim(英国剑桥大学开发的)
MRA:mail retravial agent 邮件检索代理
常见软件:
courier-imap:pop3,imap4,imaps,pop3s (俄罗斯开发)
dovecot
MDA:mail delivery agent 邮件投递代理
常见软件:
procmail
maildrop
MUA:mail user agent 邮件用户代理
outlook express
Foxmail
pine(linux)
mutt(linux,经常用到的)
MSA:邮件提交代理
SASL:simple authenticaion security layer提供认证机制
邮件服务器会拒绝无法进行正反方向解析的地址,所以配置邮件服务器的时候,
要首先配置好DNS服务器
二、邮件服务器的安装和配置:
修改主机名:
#hostname mail.luowei.com
#vi /etc/sysconfig/network
把里面的HOSTNAME修改为mail.luowei.com
本实验只要是采用postfix来实验,由于Sendmail默认的情况下是启用的,我这里先
关闭Sendmail,最好是卸载了sendmail
# service sendmail stop
# rpm -e sendmail --nodeps
由于本地配置好了yum源,就直接yum安装了
# yum install postfix
启动postfix服务
# service postfix start
这时可以使用
#postconf -d 查看/etc/postfix/main.cf的默认配置
#postconf -a 查看支持sasl的机制
#postconf -n 查看修改后的配置文件
但是这个时候还不能发送邮件,在你发送邮件的时候会出现如下的提示:
#telnet 192.168.1.103 25 (192.168.1.103是我的邮件服务器的IP地址)
telnet: connect to address 192.168.1.103: Connection refused
telnet: Unable to connect to remote host: Connection refused
这个时候需要修改一下/etc/postfix/main.cf文件
myhostname = mail.luowei.com
mydomain = luowei.com
myorigin = $mydomain
inet_interfaces = all
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain,
mail.$mydomain
这样就能实现同一台主机之间的邮件传递了,但是如果我们还要向其他域的用户发邮件
这样就不行了,这就要配置DNS服务器了,需要开启DNS的转发功能,指向对方的域
接线来是就是实现不同域之间的发邮件了:
首先是DNS的配置:
#yum install bind
#vim /etc/named.conf 添加如下内容
options {
directory "/var/named";
};
zone "." IN {
type hint;
file "named.ca";
};
zone "localhost" IN {
type master;
file "localhost.zone";
};
zone "0.0.127.in-addr.arpa" IN {
type master;
file "named.local";
};
zone "luowei.com" IN {
type master;
file "luowei.com.zone";
};
zone "1.168.192.in-addr.arpa" IN {
type master;
file "192.168.zone";
};
zone "a.org" IN {
type forward;
forwarders { 172.16.100.1; };//添加到指定域的地址
};
#chown :named /etc/named.conf
然后到/var/named/下创建对应的区域文件
#dig -t NS . @a.root-servers.net > named.ca (在能连上网的基础上,创建根区域)
创建localhost.zone、named.local、luowei.com.zone、192.168.zone几个文件
#vim localhost.zone 添加如下内容
$TTL 86400
@ 600 IN SOA localhost. admin.localhost. (
2011082001
1H
10M
7D
1D )
IN NS localhost.
localhost. IN A 127.0.0.1
#vim named.local
$TTL 86400
@ 600 IN SOA localhost. admin.local. (
2011082001
1H
10M
7D
1D )
IN NS localhost.
103 IN PTR localhost.
#vim luowei.com.zone
$TTL 86400
@ 600 IN SOA ns.luowei.com. admin.luowei.com. (
2011082001
1H
10M
1D
7D )
IN NS ns.luowei.com.
IN MX 10 mail.luowei.com.
ns.luowei.com. IN A 192.168.1.103
mail.luowei.com. IN A 192.168.1.103
#vim 192.168.zone
$TTL 86400
@ 600 IN SOA ns.luowei.com. admin.luowei.com. (
2011082001
1H
10M
7D
1D )
IN NS ns.luowei.com.
103 IN PTR mail.luowei.com.
103 IN PTR mail.luowei.com.
同时还要在/etc/postfix/main.cf中修改mynetworks
mynetworks = 127.0.0.1/8,192.168.1.0/24,172.16.0.0/16
修改/etc/resolv.conf文件
把nameserver 127.0.0.1是主机通过本DNS进行解析
这时就可以验证了,通常验证的方法如下进行发送邮件:
telnet exi127.0.0.1 25
HELLO mail.luowei.com
mail from:redhat@luowei.com
rcpt to:root@luowei.com
data
Subject:how are you?
内容
.
quit
然后使用
#mail命令的查看邮件
当然也可以查看邮件队列
#postqueue -p 查看邮件队列
#postqueue -f 强制发送邮件
1、smtp的用户认证
现在常用的用户认证机制是sasl,默认的情况下saslauthd是安装了但是没有启动的
所以启动sasl认证
具体步骤:
①启动sasl认证
#service saslauthd start
#chkconfig saslauthd on //开机自动启动服务
在/usr/lib/sasl2/下有一个smtpd.conf文件,如果你使用的是Sendmail的话,下面是
sendmail.conf
#vim /usr/lib/sasl2/smtpd.conf
添加一下内容
pwcheck_method:saslauthd 认证方法
#service saslauthd restart
②调整/etc/postfix/main.cf文件,以便支持认证
#vim /etc/postfix/main.cf
smtpd_sasl_auth_enable=yes
smtpd_sasl_security_options=noanonymous
mynetworks = 127.0.0.1
smtpd_recipient_restrictions=
permit_mynetworks,
permit_sasl_authenticated,
reject_unauth_destination
#service postfix reload 重新加载postfix
③验证
[root@mail ~]# telnet 192.168.1.103 25
Trying 192.168.1.103...
Connected to mail.luowei.com (192.168.1.103).
Escape character is '^]'.
220 mail.luowei.com ESMTP Postfix
EHLO mail.luowei.com
250-mail.luowei.com
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH LOGIN PLAIN //出现了认证的功能
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
接下来就是要输入发信人和接受人了
MAIL FROM:redhat@luowei.com
MAIL FROM:redhat@luowei.com
250 2.1.0 Ok
RCPT TO:root@luowei.com
250 2.1.5 Ok
RCPT TO:redhat@126.com
554 5.7.1 <redhat@126.com>: Relay access denied
由上面可以看出,发送给自己域内的可以OK,而发往其他外域的就denied
但是如果这个时候我没使用
AUTH LOGIN来从新输入发件人的话输入的是通过base64编码的用户名和密码
(注:#printf "redhat" | openssl base64 或者使用echo -n "redhat" |openssl base64
就能转换格式了,然后把转换后的内容粘贴到下面的提示中,当然密码也要编码,
由于我的用户名和密码一样,所有下面的两处需要输入的地方都是一样的)
AUTH LOGIN
334 VXNlcm5hbWU6
cmVkaGF0 //通过转换成base64位的用户名
334 UGFzc3dvcmQ6
cmVkaGF0 //通过转换成base64位的密码
235 2.0.0 Authentication successful //认证成功了
然后在输入
MAIL FROM:redhat@luowei.com
....下面的都一样了
接下来就是整个认证验证的全过程了:
[root@mail ~]# !tel
telnet mail.luowei.com 25 //*测试的开始
Trying 192.168.1.103...
Connected to mail.luowei.com (192.168.1.103).
Escape character is '^]'.
220 mail.luowei.com ESMTP Postfix
EHLO mail.luowei.com //*使用EHLO mail.luowei.com 来查看是否有认证功能
250-mail.luowei.com
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH LOGIN PLAIN //*显示的有认证功能
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
AUTH LOGIN //*使用认证的方式登录
334 VXNlcm5hbWU6
cmVkaGF0 //*输入通过base64编码的用户名(redhat)
334 UGFzc3dvcmQ6
cmVkaGF0 //*输入通过base64编码的用户密码(redhat)
235 2.0.0 Authentication successful //显示认证成功
MAIL FROM:redhat@luowei.com //*发邮件的用户
250 2.1.0 Ok
RCPT TO:test@126.com //*接收邮件的用户
250 2.1.5 Ok
data //*邮件内容
354 End data with <CR><LF>.<CR><LF>
Subject:sasl test //*邮件主题
sasltest //*邮件内容
. //*结束邮件的编辑
250 2.0.0 Ok: queued as EF6826C2EE4
quit //*退出测试
21 2.0.0 Bye
Connection closed by foreign host.(注:带“*”都是要输入的)
接下来就看日志信息来看看整个过程了:
#postqueue -p 查看邮件队列,如果有就没有发出,如果没有就结合着邮件日志来查看整个过程
我这里是没有的
#tail -20 /var/log/maillog
Aug 11 03:51:38 station78 postfix/smtpd[5314]: connect from mail.luowei.com[192.168.1.103]
Aug 11 03:52:44 station78 postfix/smtpd[5314]: EF6826C2EE4: client=mail.luowei.com[192.168.1.103], sasl_method=LOGIN, sasl_username=redhat
Aug 11 03:53:09 station78 postfix/cleanup[5319]: EF6826C2EE4: message-id=<20110810195244.EF6826C2EE4@mail.luowei.com>
Aug 11 03:53:09 station78 postfix/qmgr[5126]: EF6826C2EE4: from=<redhat@luowei.com>, size=372, nrcpt=1 (queue active)
Aug 11 03:53:11 station78 postfix/smtpd[5314]: disconnect from mail.luowei.com[192.168.1.103]
Aug 11 03:53:23 station78 postfix/smtp[5323]: EF6826C2EE4: to=<test@126.com>, relay=126mx01.mxmail.netease.com[220.181.15.141]:25, delay=59, delays=45/0.11/12/2, dsn=5.0.0, status=bounced (host 126mx01.mxmail.netease.com[220.181.15.141] said: 550 User not found: test@126.com (in reply to RCPT TO command))
Aug 11 03:53:23 station78 postfix/cleanup[5319]: E8F136C2EE6: message-id=<20110810195323.E8F136C2EE6@mail.luowei.com>
Aug 11 03:53:23 station78 postfix/qmgr[5126]: E8F136C2EE6: from=<>, size=2226, nrcpt=1 (queue active)
Aug 11 03:53:23 station78 postfix/bounce[5324]: EF6826C2EE4: sender non-delivery notification: E8F136C2EE6
Aug 11 03:53:23 station78 postfix/qmgr[5126]: EF6826C2EE4: removed
Aug 11 03:53:24 station78 postfix/local[5325]: E8F136C2EE6: to=<redhat@luowei.com>, relay=local, delay=0.23, delays=0.02/0.03/0/0.19, dsn=2.0.0, status=sent (delivered to mailbox)
Aug 11 03:53:24 station78 postfix/qmgr[5126]: E8F136C2EE6: removed
Aug 11 03:56:57 station78 postfix/anvil[5258]: statistics: max connection rate 1/60s for (smtp:192.168.1.103) at Aug 11 03:51:38
Aug 11 03:56:57 station78 postfix/anvil[5258]: statistics: max connection count 1 for (smtp:192.168.1.103) at Aug 11 03:51:38
Aug 11 03:56:57 station78 postfix/anvil[5258]: statistics: max cache size 1 at Aug 11 03:51:38
所以可以看出邮件是已经通过认证的方式发出去了,这就是当时我们针对本机设置认证,
如果想和外域的发邮件,就要先认证才能发送邮件,否者是被拒绝的。
2、设置用户别名和邮件群组
所谓的用户别名就是通过给一个一个用户邮件转发给另一个用户
别名有两个功能:地址转发,邮件群发
使用文件/etc/aliases文件
在里面添加记录
格式如下:
别名:地址1,地址2,地址3,...
然后执行newaliases命令转换aliases.cb格式
然后在postfix中添加一个别名机制
步骤如下:
①在/etc/aliases中添加别名记录
#vim /etc/aliases
root: redhat //凡是给root用户发的邮件转发给redhat用户
#newaliases 生成新的aliases.db文件
#service postfix reload
# echo "TO root" |mail -s "to root" root@luowei.com //给root@luowei.com发邮件测试
#tail /var/log/maillog查看日志文件
Aug 11 04:21:33 station78 postfix/qmgr[5126]: D2A056C2EE5: from=<root@luowei.com>, size=294, nrcpt=1 (queue active)
Aug 11 04:21:34 station78 postfix/local[8079]: D2A056C2EE5: to=<redhat@luowei.com>, orig_to=<root@luowei.com>, relay=local, delay=0.3, delays=0.11/0.02/0/0.18, dsn=2.0.0, status=sent (delivered to mailbox)
Aug 11 04:21:34 station78 postfix/qmgr[5126]: D2A056C2EE5: removed
这三行日志显示发给root@luowei.com 最终发给了redhat@luowei.com用户了
#su - redhat
#mail 查看邮件,你会发现刚写的邮件
②在/etc/aliases中添加群组的记录,这样就可以发送群邮件了
#groupadd mygroup
#vim /etc/aliases
mygroup: redhat,student,root
#newaliases
#service postfix reload
测试同上面,查看日志文件
3、邮件加密
邮件传送的时候会经过internet,所以存在安全隐患,为了跟好的保障邮件的传输
以及数据的完整性,所以要对数据进行加密,在加密的过程中,可以使用smtps,pop3s,
imaps方式。
这就需要使用邮件服务的ssl了,接下来就是做这个过程了
首先,使用wireshark抓把工具来进行抓包
#yum install wireshark
#tshark -ni eth0 -R "tcp.scrport eq 110 or tcp.dstport eq 110" 进行抓包
然后在客户端等登录
在window的cmd下输入 telnet 192.168.1.103 110
USER redhat
PASS redhat
LIST //列出邮件
RETR NUM //查看指定编号的邮件
这个时候你分析抓包工具抓的数据包,能看到里面直接就有用户名和密码
所以这样太危险了,为了安全考虑,我们需要使用ssl对数据进行加密,同时考
虑到数据传输的特点,在接受邮件的时候进行加密会更好,所以使用pop3s,或
imaps协议来实现加密功能
具体步骤如下:
①建立ca
#(umask 077;openssl genrsa 1024 >private/cakey.pem) //建立ca的私钥
# openssl req -new -x509 -key private/cakey.pem -out cacert.pem -days 3650//颁发一个自签的证书
Country Name (2 letter code) [CN]:
State or Province Name (full name) [Henan]:
Locality Name (eg, city) [ZZ]:
Organization Name (eg, company) [linux]:
Organizational Unit Name (eg, section) []:ca
Common Name (eg, your name or your server's hostname) []:ca.luowei.com
Email Address []:ca@luowei.com
# mkdir certs newcerts crl
# touch index.txt serial
# echo 01 > serial
②为dovecot创建私钥并申请证书
#mkdir /etc/dovecot
#cd /etc/dovecot
#mkdir ssl
#cd ssl
#openssl genrsa 1024>dovecot.key
#chmod 600 dovecot.key
#openssl req -new -key dovecot.key -out dovecot.csr //申请证书
Country Name (2 letter code) [CN]:
State or Province Name (full name) [Henan]:
Locality Name (eg, city) [ZZ]:
Organization Name (eg, company) [linux]:
Organizational Unit Name (eg, section) []:tech
Common Name (eg, your name or your server's hostname) []:mail.luowei.com
Email Address []:root@luowei.com
③颁发证书
# openssl ca -in dovecot.csr -out dovecot.crt //颁发证书
④编辑/etc/dovecot.conf文件
#cd /etc/dovecot/ssl
#cp /etc/pki/CA/private/cacert.pem ./
#mv cacert.pem cacert.crt
#rm -fr dovecot.csr
#vim /etc/dovecot.conf 修改如下内容
ssl_cert_file = /etc/dovecot/ssl/dovecot.crt
ssl_key_file = /etc/dovecot/ssl/dovecot.key
ssl_ca_file = /etc/dovecot/ssl/cacert.crt
protocols = imap imaps pop3 pop3s
⑤测试:
#mutt -f pop3s://redat@mail.luowei.com
测试会显示一个关于证书的,这样就实现了加密。
这时候在使用抓包工具就不会抓到密码了
4、拒绝指定地址、指定用户发邮件
①指定地址拒绝发送邮件
#vim /etc/postfix/main.cf
smtpd_client_restrictions =hash:/etc/postfix/access_file
#vim /etc/postfix/access_file
192.168.1.103 REJECT
#postmap /etc/postfix/access_file //转换成二进制的格式
#service postfix reload
220 mail.luowei.com ESMTP Postfix
HELO mail.luowei.com
250 mail.luowei.com
MAIL FROM:redhat@luowei.com
250 2.1.0 Ok
RCPT TO:root@luowei.com
554 5.7.1 <unknown[192.168.1.100]>: Client host rejected: Access denied
我在自己的客户机(192.168.1.100)上验证,这样就会拒绝指定的IP地址发送邮件了
②指定网段
在/etc/postfix/access_file中添加网段
如1.2.3 REJECT表示1.2.3.0这个网段的被拒绝
剩下的步骤就和上面的一样了
③拒绝指定的用户发送邮件
#vim /etc/postfix/main.cf
smtpd_sender_restrictions=hash:/PATH/FILE_NAME
#vim /PATH/FILE_NAME
centos@luowei.com REJECT 拒绝指定的用户的指定邮箱
@a.org REJECT 拒绝a.org这个域的用户
gentoo@ REJECT 拒绝gentoo所在的所有的域
#postmap /PATH/FILE_NAME
#service postfix reload