Mail邮件服务
smtp服务器的IP <---
pop3服务器IP
部署一个合法的能够接受和发送互联网邮件的服务器,必须具备以下条件:
1、购买一个合法的域名
2、域名要设定MX记录,解析到邮件服务器的IP
3、邮件服务器的IP必须是公网的IP
一、准备操作
作为邮件服务器的(MTA)必须是静态IP,FQDN主机名,并且绑定到/etc/hosts
如果存在DNS服务器的话,为邮件服务器所使用的域名添加MX记录并且解析到邮件服务器的IP
DNS服务器的IP: 172.16.2.7
邮件服务器的IP: 172.16.2.7
主机名: node5.sex.com
# vim /etc/hosts
172.16.2.7 node5.sex.com node5
# vim /var/named/chroot/var/named/data/master.sex.com.zone
....
@ IN NS node5.sex.com.
@ IN MX 0 node5.sex.com. <---添加邮件记录
node5 IN A 172.16.2.7
....
添加MX记录是为了能够让别的邮件服务器能够把所有发送到[email protected]的邮件发到MX记录指向的服务器
# service named reload
验证MX的记录是否生效
# nslookup
> set type=MX
> sex.com
Server:172.16.2.7
Address:172.16.2.7#53
sex.commail exchanger = 0 node5.sex.com.
二、部署smtp服务器(MTA)
Linux常用的邮件服务软件:
sendmail <---元老级,rhel6默认不是用它
postfix <--- rhel6默认使用它
# rm -rf /etc/postfix
1、安装
# yum reinstall postfix -y
2、设定本机使用的MTA是postfix而不是sendmail
# alternatives --config mta
共有 2 个程序提供“mta”。
选择 命令
-----------------------------------------------
* 1 /usr/sbin/sendmail.sendmail
+ 2 /usr/sbin/sendmail.postfix <---保证是postfix
按 Enter 来保存当前选择[+],或键入选择号码:2
如果原本是sendmail,就必须保证马上停止sendmail服务,而且设定为开机不启动
# service sendmail stop
# chkconfig sendmail off
# chkconfig postfix on <---理论上应该设定为开机启动
3、配置postfix
# cp /etc/postfix/main.cf /etc/postfix/main.cf.default
# vim /etc/postfix/main.cf
...
myhostname = node5.sex.com
mydomain = sex.com
myorigin = $mydomain<--- 能够让服务知道什么邮件地址是属于本机管理
inet_interfaces = all<--- 把localhost修改成all,服务启动的时候在哪些接口进行监听
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain
定义什么的邮件后缀是本机可以接受并且保存起来的。
如果邮件服务器接受到的邮件收件人是 [email protected] 或者 [email protected] 或者 ??@localhost 或者 [email protected] 就会保存起来
mynetworks = 127.0.0.0/8, 172.16.0.0/16, 10.1.1.0/24
# service postfix restart
# lsof -i:25
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
master 3181 root 12u IPv4 15781 0t0 TCP *:smtp (LISTEN)
master 3181 root 13u IPv6 15783 0t0 TCP *:smtp (LISTEN)
# iptables -F
# setenforce 0
使用最原始的命令是了解和测试邮件服务器的工作过程:
# telnet 127.0.0.1 25
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
220 node5.sex.com ESMTP Postfix
helo node5 <---打招呼。
250 node5.sex.com
mail from: [email protected] 发件人
250 2.1.0 Ok
rcpt to: [email protected] 收件人 <--- 如果收件人是其域的,必须保证能够解析该域名的MX记录
250 2.1.5 Ok
data <---编辑邮件内容
354 End data with <CR><LF>.<CR><LF>
can you see me? <---具体的邮件内容
.<---新的一行 以. 开头代表邮件编辑完毕
250 2.0.0 Ok: queued as 0F000661
quit<--退出
221 2.0.0 Bye
查看tom的邮件文件
# cat /var/mail/tom
使用专用的命令发送邮件:收件人是互联网的合法的邮箱地址
前提:
保证smtp服务器可以上网
DNS指向自己配置的DNS服务器(可以解析自己配置sex.com),并且自己配置的DNS服务器也必须要能够解析外网的域名(配置转发)
可选: postfix的DNS直接指向8.8.8.8
# mail -s "test mail title" [email protected] < /etc/fstab
# cat /etc/hosts | mail -s "test mail2" [email protected]
# echo "can you see me? 139.com" | mail -s "test mail" [email protected]
验证邮件是否成功送出去,或者是否被退信了
# mailq
-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------
2669F661 347 Sat Apr 20 08:01:11 [email protected]
(host mx2.mail.139.com[113.108.212.78] said: 450 2eec51724d3e7ad-35999 Mail rejected, please try again (in reply to end of DATA command))
[email protected] <--被退信(拒绝)
# vim /var/log/maillog
======================================================
设定本地的群发帐号
只要[email protected] 都是被[email protected] 和 [email protected] 收到
# vim /etc/aliases
...
it: tom,mary
...
# postalias /etc/aliases
# service postfix restart
测试
# mail -s "groupmail" [email protected] < /etc/fstab
给本定邮件服务器绑定其他域名,让其可以接受其他域名的邮件
当我们邮件服务器接受到收件人为 [email protected]的邮件的时候,会认为这是本邮件 锁管理的帐号,然后把邮件保存到本地对应的用户邮箱中
# vim /etc/postfix/main.cf
。。。
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain, 6nei.com <---增加6nei.com
# service postfix restart
测试
# mail -s "gggggggg" [email protected] < /etc/inittab
例子:两个同学之间配置的邮件服务器相互接受和发送邮件
同学A配置的邮件服务器IP: 172.16.2.7 ,域名: @sex.com
同学B配置的邮件服务器IP: 172.16.2.111 , 域名:@panda.com
A服务器接受到用户[email protected]发送到[email protected]:
邮件会通过MUA发送到A邮件服务器,然后A邮件服务器通过对panda.com域名的MX记录的解析之后,把邮件发送到B邮件服务器,然后B邮件服务器接受到邮件之后,发现收件人[email protected],这个B邮件服务器本身所管理域名,所以把邮件保存到wewe的邮箱。
A邮件服务器所用的DNS服务器必须能够解析到panda.com,所以设定一个指定域名的转发:
A邮件服务器使用的DNS # vim /var/named/chroot/etc/named.conf
...
zone "panda.com" IN {
type forward;
forwarders { 172.16.2.111; };
};
# service named restart
# nslookup
> set type=MX
> panda.com
Server:172.16.2.7
Address:172.16.2.7#53
Non-authoritative answer:
panda.commail exchanger = 0 mail.panda.com.
B邮件服务器使用DNS # vim /var/named/chroot/etc/named.conf
...
zone "sex.com" IN {
type forward;
forwarders { 172.16.2.7; };
};
# service named restart
测试邮件的发送:
A服务器的用户# echo "can you see me ?" | mail -s "testmail" [email protected]
B服务器的用户# echo "can you see me ?" | mail -s "testmail" [email protected]
例子:给postfix添加snmp验证功能。
相关的文档:
/usr/share/doc/postfix-2.6.6/README-Postfix-SASL-RedHat.txt
# vim /etc/postfix/main.cf
...添加以下配置....
smtpd_sasl_auth_enable = yes
smtpd_sasl_security_options = noanonymous
broken_sasl_auth_clients = yes
smtpd_recipient_restrictions =
permit_sasl_authenticated, <--提供正确的用户名和密码都可以发外部域的邮件
permit_mynetworks, <--处于mynetwork定义的网络的用户都可以免验证发外部域的邮件
permit_auth_destination, <--只要收件人的域??@域名实在mydestination列表中定义的域名,都可以处理,才能保证邮件服务器可以接受其他邮件服务器发给本地域名的用户的邮件
reject_unauth_destination,
reject
# yum install cyrus-sasl* -y <--- 验证手段需要用到依赖包
# vim /etc/sasl2/smtpd.conf <---默认就这样,一般不用修改
pwcheck_method: saslauthd
mech_list: plain login <---- 支持明文帐号密码验证
# service saslauthd start <--- postfix接受到客户传输过来的用户名和密码都会交给saslautdh服务协助验证。
# chkconfig saslauthd on
# service postfix restart
查看postfix是否已经支持smtp验证功能
# telnet 127.0.0.1 25
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
220 node5.sex.com ESMTP Postfix
ehlo node5.sex.com <---输出邮件服务器的一些功能
250-node5.sex.com
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH LOGIN PLAIN <---
250-AUTH=LOGIN PLAIN <--- 看到AUTH关键字,说明支持验证
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
以下的邮件发送测试,邮件服务器根本没有要求用户提供用户名和密码就能发送,原因:
连接邮件服务器的用户实在本机,本机的IP在mynetworks列表里
# telnet 127.0.0.1 25
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
220 node5.sex.com ESMTP Postfix
mail from: [email protected]
250 2.1.0 Ok
rcpt to: [email protected]
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
can you see me?
.
250 2.0.0 Ok: queued as B3AE24E27
为了看到强制验证的功能,修改postfix的配置:
# vim /etc/postfix/main.cf
mynetworks = 127.0.0.0/8, 10.1.1.0/24 <---取消172.16.0.0/15
# service postfix restart
# passwd tom <---准备一个帐号
测试: 使用局域网中另外一个机器作为客户端去连接postfix
# telnet 172.16.2.7 25
Trying 172.16.2.7...
Connected to 172.16.2.7.
Escape character is '^]'.
220 node5.sex.com ESMTP Postfix
mail from: [email protected]
250 2.1.0 Ok
rcpt to: [email protected]
554 5.7.1 <[email protected]>: Relay access denied <---客户端的IP不在受信任的网络中,而且又没有提供帐号验证,收件地址也是外部域名(不在mydestinaiton中),所以被拒绝
提供用户和密码:
# telnet 172.16.2.7 25
Trying 172.16.2.7...
Connected to 172.16.2.7.
Escape character is '^]'.
220 node5.sex.com ESMTP Postfix
auth login <---
334 VXNlcm5hbWU6
dG9t <--- 用户名tom经过base64编码之后
334 UGFzc3dvcmQ6
MTIz <--- 密码123经过base64编码之后
235 2.7.0 Authentication successful
ail from: [email protected]
250 2.1.0 Ok
rcpt to: [email protected]
250 2.1.5 Ok <---可以了
data
354 End data with <CR><LF>.<CR><LF>
=========================hhhhhhhhhhhhh
.
250 2.0.0 Ok: queued as 4213B4E27
quit