欢迎各位兄弟 发布技术文章
这里的技术是共享的
发送邮件时记住 防火墙要关掉
SMTP 明文传输的 -->SMTPS (安全版 ssl版)
ESMTP(SMTP的功能增强版,明文的) -->安全版也是 SMTPS
POP3:(收邮件,邮局协议)
IMAP4: Internet Mail Access Protocol (互联网邮件访问协议)
SASL: (能够实现邮件认证的) Simple Authenticaion Secure Layer
(简单认证安全层)
v1,v2 两个版本
MDA:邮件投递代理
procmail,maildrop
MUA: 邮件用户代理
linux 上 有 mutt 和 mail命令
tom@a.org --> c.com(MX) --> jerry@b.net (mail.b.net)(它不涉及到中继,只要过来的判断不是垃圾邮件,它就接受)
Mail Relay: 中继就是向外转发
MTA: sendmail,qmail,postfix,exim (左边都是linux上的)
exchange (左边是 windows上的)
占据主流位置的是 sendmail
最流行的 postfix: 模块化设计,
主模块 master (/etc/postfix/master.cf)
众多模块程序都是由 master.cf 来控制,谁启动,谁不启动
模块启动后,提供完整意义上的邮件服务,其配置文件 (/etc/postfix/main.cf)
使用 postconf 命令来管理main.cf
postconf
-d 默认配置
-n 新的配置
-m 支持的hash 查找表类型
-A 客户端支持的sasl类型
-a 服务器端支持的sasl类型
-e 修改配置文件 PARA=VALUE
main.cf 每一个参数应该顶格写,顶格有空白表示上一行的延续
SMTP:
0) 首先 telnet 客户端连接 (client连接)
1) helo
2) mail from:
3) rcpt to:
4) data
. 点在单独一行,表示结束
quit 表示退出
MX: 邮件服务器必须要解析当前主机的域 (mail.magedu.com) 对应A记录,对应PTR记录 上一节课由于是在本机工作,所以没有域,没有MX记录,也能工作;;;互联网上,邮件服务器必须要对应MX记录
[root@www ~]# vim /etc/init.d/postfix (为什么最后不要加d,是因为是以x (postfix)结尾?)
#!/bin/bash
#
# postfix Postfix Mail Transfer Agent
#
# chkconfig: 2345 80 30
# description: Postfix is a Mail Transport Agent, which is the program \
# that moves mail from one machine to another.
# processname: master
# pidfile: /var/spool/postfix/pid/master.pid
# config: /etc/postfix/main.cf
# config: /etc/postfix/master.cf
# Source function library.
. /etc/rc.d/init.d/functions
# Source networking configuration.
. /etc/sysconfig/network
# Check that networking is up.
[ $NETWORKING = "no" ] && exit 3
[ -x /usr/sbin/postfix ] || exit 4
[ -d /etc/postfix ] || exit 5
[ -d /var/spool/postfix ] || exit 6
RETVAL=0
prog="postfix"
start() {
# Start daemons.
echo -n $"Starting postfix: "
/usr/bin/newaliases >/dev/null 2>&1
/usr/sbin/postfix start 2>/dev/null 1>&2 && success || failure $"$prog start"
RETVAL=$?
[ $RETVAL -eq 0 ] && touch /var/lock/subsys/postfix
echo
return $RETVAL
}
stop() {
# Stop daemons.
echo -n $"Shutting down postfix: "
/usr/sbin/postfix stop 2>/dev/null 1>&2 && success || failure $"$prog stop"
RETVAL=$?
[ $RETVAL -eq 0 ] && rm -f /var/lock/subsys/postfix
echo
return $RETVAL
}
reload() {
echo -n $"Reloading postfix: "
/usr/sbin/postfix reload 2>/dev/null 1>&2 && success || failure $"$prog reload"
RETVAL=$?
echo
return $RETVAL
}
abort() {
/usr/sbin/postfix abort 2>/dev/null 1>&2 && success || failure $"$prog abort"
return $?
}
flush() {
/usr/sbin/postfix flush 2>/dev/null 1>&2 && success || failure $"$prog flush"
return $?
}
check() {
/usr/sbin/postfix check 2>/dev/null 1>&2 && success || failure $"$prog check"
return $?
}
restart() {
stop
start
}
# See how we were called.
case "$1" in
start)
start
;;
stop)
stop
;;
restart)
stop
start
;;
reload)
reload
;;
abort)
abort
;;
flush)
flush
;;
check)
check
;;
status)
status master
;;
condrestart)
[ -f /var/lock/subsys/postfix ] && restart || :
;;
*)
echo $"Usage: $0 {start|stop|restart|reload|abort|flush|check|status|condrestart}"
exit 1
esac
exit $?
# END
[root@www ~]# chmod +x /etc/init.d/postfix
[root@www ~]# chkconfig --add postfix (加到服务列表中去)
[root@www ~]# chkconfig --list postfix (在服务中看一下postfix 2,3,4,5是on了)
postfix 0:关闭 1:关闭 2:启用 3:启用 4:启用 5:启用 6:关闭
[root@www ~]#
允许使用 $PARAMETER 引用相应参数的值
myhostname = mail.magedu.com
myorigin = magedu.com (给发件人补上magedu.com) 邮件地址伪装(重写)
即使 root@mail.magedu.com ===>(也会改成) root@magedu.com
mydomain = magedu.com (自己当前主机所在的域名)(如果没有定义mydomain 把 myhostname的第一段去了,剩下的就是 mydomain )
mydestination = $myhostname, localhost, $mydomain, localhost, $mydomain
表示所有的邮件目标收件人 @ 后面的字符串,就是本机所为它们负责收邮件的服务器(最终的收件服务器),如果不是@后面的字符串,意味着要中继邮件
mynetworks = 192.168.1.0/24, 127.0.0.0/8 (给来自哪些地址的主机中继)
interface 表示当前主机所监听的地址和端口 (马哥没找到)
[root@www ~]# hostname (跟main host 匹配?跟myhostname匹配,跟dns标记的这台主机名称也要匹配? )
[root@www ~]#
[root@www ~]# hostname mail.magedu.com
[root@www ~]# vim /etc/sysconfig/network
NETWORKING=yes
NETWORKING_IPV6=yes
#HOSTNAME=localhost.localdomain
HOSTNAME=mail.magedu.com
GATEWAY=192.168.1.45
装dns服务器
[root@www ~]# rpm -qa | grep bind
bind97-libs-9.7.0-17.P2.el5_9.2
bind97-utils-9.7.0-17.P2.el5_9.2
bind97-9.7.0-17.P2.el5_9.2
ypbind-1.19-12.el5_6.1
[root@www ~]# rpm -e bind-libs bind-utils
下面是马哥的
真正在网络上,只要A记录指向这台主机,PTR记录能够对应起来就可以了,不一定要把本机做成dns
我们这里把本机做成了dns
# yum install bind97 bind97-utils
[root@www ~]# vim /etc/named.conf
........................
options {
#listen-on port 53; #只监听 53 端口,去掉它吧
directory "/var/named";
recursion yes;
#allow-recursion { innet; };# 这里注释去掉
#allow-transfer
notify yes;
querylog yes;
};
........................
[root@www ~]# netstat -tunlp # 下面可以看到 53 端口已被监听
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:2208 0.0.0.0:* LISTEN 4688/./hpiod
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 4701/php-fpm
tcp 0 0 0.0.0.0:713 0.0.0.0:* LISTEN 4347/rpc.statd
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 4297/portmap
tcp 0 0 192.168.1.45:53 0.0.0.0:* LISTEN 13651/named
tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 13651/named
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 4722/sshd
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 3421/cupsd
tcp 0 0 127.0.0.1:953 0.0.0.0:* LISTEN 13651/named
tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 13192/master
tcp 0 0 127.0.0.1:2207 0.0.0.0:* LISTEN 4693/python
tcp 0 0 :::3306 :::* LISTEN 4916/mysqld
tcp 0 0 :::80 :::* LISTEN 4919/httpd
tcp 0 0 :::22 :::* LISTEN 4722/sshd
tcp 0 0 ::1:953 :::* LISTEN 13651/named
udp 0 0 192.168.1.45:53 0.0.0.0:* 13651/named
udp 0 0 127.0.0.1:53 0.0.0.0:* 13651/named
udp 0 0 0.0.0.0:707 0.0.0.0:* 4347/rpc.statd
udp 0 0 0.0.0.0:710 0.0.0.0:* 4347/rpc.statd
udp 0 0 0.0.0.0:40269 0.0.0.0:* 5118/avahi-daemon
udp 0 0 0.0.0.0:5353 0.0.0.0:* 5118/avahi-daemon
udp 0 0 0.0.0.0:111 0.0.0.0:* 4297/portmap
udp 0 0 0.0.0.0:631 0.0.0.0:* 3421/cupsd
udp 0 0 :::5353 :::* 5118/avahi-daemon
udp 0 0 :::50926 :::* 5118/avahi-daemon
[root@www ~]#
[root@www ~]# vim /etc/named.conf
........................
zone "." IN {
type hint;
file "named.ca";
};
include "/etc/named.rfc1912.zones";
........................
[root@www ~]# vim /etc/named.rfc1912.zones
...............................
zone "magedu.com" IN{
type master;
file "magedu.com.zone";
allow-update { none; };
allow-transfer { none; };
};
zone "1.168.192.in-addr.arpa" IN{
type master;
file "192.168.1.zone";
allow-update { none; };
allow-transfer { none; };
};
.........................
[root@www ~]# named-checkconf #检查语法
[root@www ~]# named-checkconf /etc/named.conf #可以指定文件,检查语法
[root@www named]# cd /var/named
[root@www named]# ls
192.168.1.zone dynamic named.empty slaves
a.net.zone mageedu.com.zone named.localhost telecom.mageedu.com.zone
data named.ca named.loopback unicom.mageedu.com.zone
[root@www named]#
[root@www named]# vim magedu.com.zone
[root@www named]# vim magedu.com.zone
$TTL 600
@ IN SOA ns.magedu.com. admin.magedu.com. (
2013041201
2H
10M
3D
1D)
IN NS ns
IN MX 10 mail
ns IN A 192.168.1.45
mail IN A 192.168.1.45
[root@www named]# vim 192.168.1.zone
$TTL 600
@ IN SOA ns.magedu.com. admin.magedu.com. (
2013040105
2H
10M
3D
1D )
IN NS ns.magedu.com.
1 IN PTR ns.magedu.com.
1 IN PTR mail.magedu.com.
改组 改权限
[root@www named]# chgrp named magedu.com.zone 192.168.1.zone
[root@www named]# chmod 640 magedu.com.zone 192.168.1.zone
[root@www named]#
[root@www named]# named-checkzone "magedu.com" magedu.com.zone
zone magedu.com/IN: loaded serial 2013040105
OK
[root@www named]#
[root@www named]# named-checkzone "1.168.192.in-addr.arpa" 192.168.1.zone
zone 1.168.192.in-addr.arpa/IN: loaded serial 2013040105
OK
[root@www named]# service named restart
Stopping named: . [确定]
Starting named: [确定]
[root@www named]#
[root@www named]# chkconfig named on
[root@www named]#
[root@www named]# dig -t MX magedu.com @192.168.1.45
; <<>> DiG 9.7.0-P2-RedHat-9.7.0-17.P2.el5_9.2 <<>> -t MX magedu.com @192.168.1.45
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 39432
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 2
;; WARNING: recursion requested but not available
;; QUESTION SECTION:
;magedu.com. IN MX
;; ANSWER SECTION:
magedu.com. 600 IN MX 10 mail.magedu.com.
;; AUTHORITY SECTION:
magedu.com. 600 IN NS ns.magedu.com.
;; ADDITIONAL SECTION:
mail.magedu.com. 600 IN A 192.168.1.45
ns.magedu.com. 600 IN A 192.168.1.45
;; Query time: 36 msec
;; SERVER: 192.168.1.45#53(192.168.1.45)
;; WHEN: Sun May 3 13:14:31 2020
;; MSG SIZE rcvd: 98
[root@www named]#
[root@www named]# dig -t A mail.magedu.com (#为什么马哥那边有answer )
; <<>> DiG 9.7.0-P2-RedHat-9.7.0-17.P2.el5_9.2 <<>> -t A mail.magedu.com
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 30954
;; flags: qr rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;mail.magedu.com. IN A
;; Query time: 5 msec
;; SERVER: 192.168.1.11#53(192.168.1.11)
;; WHEN: Sun May 3 13:15:50 2020
;; MSG SIZE rcvd: 33
[root@www named]#
[root@www named]# dig -t A mail.magedu.com @192.168.1.45
(# dig的 mail记录一定要保持一致?啥意思?)
; <<>> DiG 9.7.0-P2-RedHat-9.7.0-17.P2.el5_9.2 <<>> -t A mail.magedu.com @192.168.1.45
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 55760
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 1
;; WARNING: recursion requested but not available
;; QUESTION SECTION:
;mail.magedu.com. IN A
;; ANSWER SECTION:
mail.magedu.com. 600 IN A 192.168.1.45
;; AUTHORITY SECTION:
magedu.com. 600 IN NS ns.magedu.com.
;; ADDITIONAL SECTION:
ns.magedu.com. 600 IN A 192.168.1.45
;; Query time: 2 msec
;; SERVER: 192.168.1.45#53(192.168.1.45)
;; WHEN: Sun May 3 14:05:11 2020
;; MSG SIZE rcvd: 82
[root@www named]#
[root@www named]# dig -x 192.168.1.45 @192.168.1.45 (#为什么马哥那边有answer )
( # 跟mail记录一定要保持一致,啥意思? )
; <<>> DiG 9.7.0-P2-RedHat-9.7.0-17.P2.el5_9.2 <<>> -x 192.168.1.45 @192.168.1.45
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NXDOMAIN, id: 41449
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 0, AUTHORITY: 1, ADDITIONAL: 0
;; QUESTION SECTION:
;45.1.168.192.in-addr.arpa. IN PTR
;; AUTHORITY SECTION:
1.168.192.in-addr.arpa. 600 IN SOA ns.magedu.com. admin.magedu.com. 2013040105 7200 600 259200 86400
;; Query time: 1 msec
;; SERVER: 192.168.1.45#53(192.168.1.45)
;; WHEN: Sun May 3 16:19:17 2020
;; MSG SIZE rcvd: 98
[root@www named]#
下面编辑postfix的配置文件
[root@www named]# cd /etc/postfix/
[root@www postfix]# vim main.cf (#可以使用 postconf命令来修改)
..............
mynetworks = 192.168.1.0/24,127.0.0.0/8
..............
myhostname = mail.magedu.com
..............
mydomain = magedu.com
..............
myorigin = $mydomain
..............
[root@www postfix]# service postfix configtest
用法:/etc/init.d/postfix {start|stop|restart|reload|abort|flush|check|status|condrestart}
[root@www postfix]#
[root@www postfix]# service postfix restart
关闭 postfix: [确定]
启动 postfix: [确定]
[root@www postfix]#
[root@www postfix]# tail /var/log/maillog
May 3 14:57:07 www postfix/smtp[15315]: connect to c.org[104.18.149.74]:25: Connection timed out
May 3 14:57:07 www postfix/smtp[15315]: 326741BB8035: to=<c@c.org>, relay=none, delay=252075, delays=252015/0.01/60/0, dsn=4.4.1, status=deferred (connect to c.org[104.18.149.74]:25: Connection timed out)
May 3 16:06:07 www postfix/qmgr[13193]: 326741BB8035: from=<a@a.org>, size=166, nrcpt=1 (queue active)
May 3 16:06:37 www postfix/smtp[15716]: connect to c.org[104.18.148.74]:25: Connection timed out
May 3 16:07:07 www postfix/smtp[15716]: connect to c.org[104.18.149.74]:25: Connection timed out
May 3 16:07:07 www postfix/smtp[15716]: 326741BB8035: to=<c@c.org>, relay=none, delay=256275, delays=256215/0.02/60/0, dsn=4.4.1, status=deferred (connect to c.org[104.18.149.74]:25: Connection timed out)
May 3 17:06:39 www postfix/postfix-script[16297]: stopping the Postfix mail system
May 3 17:06:39 www postfix/master[13192]: terminating on signal 15
May 3 17:06:39 www postfix/postfix-script[16370]: starting the Postfix mail system
May 3 17:06:39 www postfix/master[16372]: daemon started -- version 2.10.10, configuration /etc/postfix
[root@www postfix]#
[root@www postfix]# vim /etc/resolv.conf
; generated by /sbin/dhclient-script
nameserver 192.168.1.45
search localdomain
#nameserver 218.2.2.2
#search localdomain
#search baidu.com
[root@www postfix]# telnet mail.magedu.com 25
Trying 192.168.1.45...
Connected to mail.magedu.com (192.168.1.45).
Escape character is '^]'.
220 mail.magedu.com ESMTP Postfix
helo mail.magedu.com
250 mail.magedu.com
mail from: abc@abc.com
250 2.1.0 Ok
rcpt to:obama@whitehouse.com (#这个应该本地没有,需要中继,但来自本地的是可以中继的)
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
hello
.
250 2.0.0 Ok: queued as C3D2D1BB803F
quit
221 2.0.0 Bye
Connection closed by foreign host.
[root@www postfix]#
[root@www postfix]# tail /var/log/maillog
May 3 17:23:22 www postfix/cleanup[16486]: C3D2D1BB803F: message-id=<20200503092244.C3D2D1BB803F@mail.magedu.com>
May 3 17:23:22 www postfix/qmgr[16373]: C3D2D1BB803F: from=<abc@abc.com>, size=316, nrcpt=1 (queue active)
May 3 17:23:25 www postfix/smtp[16491]: C3D2D1BB803F: to=<obama@whitehouse.com>, relay=mail.whitehouse.com[54.208.114.32]:25, delay=92, delays=89/0.01/2.1/0.51, dsn=5.0.0, status=bounced (host mail.whitehouse.com[54.208.114.32] said: 550 Unknown user (in reply to RCPT TO command))
May 3 17:23:25 www postfix/cleanup[16486]: B89321BB8041: message-id=<20200503092325.B89321BB8041@mail.magedu.com>
May 3 17:23:25 www postfix/bounce[16492]: C3D2D1BB803F: sender non-delivery notification: B89321BB8041
May 3 17:23:25 www postfix/qmgr[16373]: B89321BB8041: from=<>, size=2170, nrcpt=1 (queue active)
May 3 17:23:25 www postfix/qmgr[16373]: C3D2D1BB803F: removed
May 3 17:23:26 www postfix/smtpd[16435]: disconnect from www.a.org[192.168.1.45]
May 3 17:23:28 www postfix/smtp[16491]: B89321BB8041: to=<abc@abc.com>, relay=abc-com.mail.protection.outlook.com[104.47.46.36]:25, delay=2.7, delays=0.01/0/2.5/0.22, dsn=5.7.1, status=bounced (host abc-com.mail.protection.outlook.com[104.47.46.36] said: 550 5.7.1 Service unavailable, Client host [121.224.232.146] blocked using Spamhaus. To request removal from this list see https://www.spamhaus.org/query/ip/121.224.232.146 AS(1450) (in reply to RCPT TO command))
May 3 17:23:28 www postfix/qmgr[16373]: B89321BB8041: removed
[root@www postfix]#
[root@www postfix]# vim main.cf
.........................
mynetworks = 127.0.0.0/8 # 只有本机才给它中继
........................
[root@www postfix]# service postfix restart
关闭 postfix: [确定]
启动 postfix: [确定]
[root@www postfix]#
通过另一台电脑(192.168.1.85 或 192.168.0.25)看看 (马哥用的是windwos ,我用的是linux)
(不给中继)
[root@localhost ~]# telnet 192.168.0.15 25
Trying 192.168.0.15...
Connected to 192.168.0.15 (192.168.0.15).
Escape character is '^]'.
220 magedu.com ESMTP Postfix
helo mail.maged.com
250 magedu.com
mail from:root@magedu.com
250 2.1.0 Ok
rcpt to:a@b.net
454 4.7.1 <a@b.net>: Relay access denied
通过本机看看 (不给中继) (因为 mail.magedu.com 被解析成 192.168.0.15
(或 192.168.1.45 ))
[root@mail postfix]# telnet mail.magedu.com 25
Trying 192.168.0.15...
Connected to mail.magedu.com (192.168.0.15).
Escape character is '^]'.
220 magedu.com ESMTP Postfix
helo mail.magedu.com
250 magedu.com
mail from:abc@abc.com
250 2.1.0 Ok
rcpt to:obama@whitehouse.com
454 4.7.1 <obama@whitehouse.com>: Relay access denied
通过本机 (使用127.0.0.1) (可以中继)
[root@mail postfix]# telnet 127.0.0.1 25
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
220 magedu.com ESMTP Postfix
helo localhost
250 magedu.com
mail from:a@magedu.com
250 2.1.0 Ok
rcpt to:a@b.net
250 2.1.5 Ok
quit
221 2.0.0 Bye
Connection closed by foreign host.
[root@mail postfix]#
由此可见,所以禁止开放式中继,通过修改 mynetworks 就可以了
main.cf 改回来 mynetworks
[root@mail postfix]# service postfix restart
关闭 postfix: [确定]
启动 postfix: [确定]
[root@mail postfix]#
下面是马哥在windows上做的
在 linux 上 给 hadoop 用户建密码
用户必须是linux 上的 普通用户,还必须有密码,密码在上面已经创建了
[root@mail postfix]# vim main.cf
..............................
mynetworks = 192.168.0.0/24,127.0.0.0/8 #192.168.0.0/24是我的局域网ip,马哥的局域网ip范围不是这样子的
..............................
此时 可以中继了
linux 服务器上 就是本身收到的邮件,所以这里没有中继
su 到 openstack ,可以看到已经收到邮件了
下面是邮件内容 base64编码的
[root@mail postfix]# echo "abc" | openssl base64 #(openssl 子命令 base64,可以进行编码)
YWJjCg==
[root@mail postfix]#
看看能否中继
己经发送出去了
看到发不出去, 但是已经中继了
下面讲 pop3 ,来收邮件
MRA: cyrus-imap, dovecot
dovecot的rpm包依赖于mysql客户端 (它会安装mysql的客户端)
(我们已经安装了mysql服务器,会冲突? 不会,因为我们的mysql安装在了特殊位置)
[root@mail ~]# yum install dovecot
pop3 监听在 tcp 的 110端口
imap4 : 143/tcp
它们都以明文方式工作,有的时候是需要ssl 来实现邮件传输加密的
dovecot 支持四种协议: pop3,imap4,pops(是ssl协议),imaps(是ssl协议)
配置文件 /etc/dovecot.conf
自带 SASL 认证能力,可基于sasl到某处找虚拟用户账号的
(比如把账号放在mysql里,dovecot自己可以到mysql里面去找)
支持两种邮箱格式: mbox(只有一个文件,邮件一个个累加,中间有邮件分隔符,删除其中一
个邮件,会有碎片)
maildir: 一个文件存储一封邮件,所有邮件存储在一个目录中,这个目录就叫做maildir
红帽系统上默认是mbox的邮件格式
dovecot 识别邮件的时候,自动的是 mbox 的方式识别
dovecot 自动能够实现用户认证,不依赖于sasl(当然dovecot也能调用sasl)
[root@mail ~]# vim /etc/dovecot.conf
................................
protocols = imap pop3
................................
[root@mail ~]# service dovecot start
启动 Dovecot Imap: [确定]
[root@mail ~]#
/etc/rc.d/init.d/dovecot (因为使用 rpm包安装的,所以服务脚本直接提供了)
[root@mail ~]# netstat -tnlp
Active Internet connections (only servers)
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
tcp 0 0 127.0.0.1:2208 0.0.0.0:* LISTEN 4688/./hpiod
tcp 0 0 127.0.0.1:9000 0.0.0.0:* LISTEN 4701/php-fpm
tcp 0 0 0.0.0.0:684 0.0.0.0:* LISTEN 4318/rpc.statd
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 4268/portmap
tcp 0 0 192.168.1.45:53 0.0.0.0:* LISTEN 4628/named
tcp 0 0 127.0.0.1:53 0.0.0.0:* LISTEN 4628/named
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 4722/sshd
tcp 0 0 127.0.0.1:631 0.0.0.0:* LISTEN 3401/cupsd
tcp 0 0 0.0.0.0:25 0.0.0.0:* LISTEN 4996/master
tcp 0 0 127.0.0.1:953 0.0.0.0:* LISTEN 4628/named
tcp 0 0 127.0.0.1:2207 0.0.0.0:* LISTEN 4693/python
tcp 0 0 :::3306 :::* LISTEN 4880/mysqld
tcp 0 0 :::110 :::* LISTEN 6920/dovecot
tcp 0 0 :::143 :::* LISTEN 6920/dovecot
tcp 0 0 :::80 :::* LISTEN 5027/httpd
tcp 0 0 :::22 :::* LISTEN 4722/sshd
tcp 0 0 ::1:953 :::* LISTEN 4628/named
[root@mail ~]#
发邮件,看能不能收到 发件人是 hadoop
下面在日志里可以看到已经收到邮件
telnet 也能收邮件的
先把openstack设一下密码
下面 输USER 用户名,PASS 密码,LIST(列出邮件),RETR 1(取出第一封邮件)
# telnet mail.magedu.com 110
Connected to mail.magedu.com
........................
USER openstack
+OK
PASS openstack
+OK Logged in
LIST
......................
RETR 1
......................
RETR 2 取出第二封邮件
quit 退出,即可
通过 linux 发邮件(发给 hadoop ),看 windows 的 outlook (就是用户 hadoop 登进去的) 能不能收到
由日志可见,已经发送了,
看到收件箱里刚发的邮件了
让 postfix + SASL 实现用户认证
1,启动 sasl,启动sasl服务
服务脚本 /etc/rc.d/init.d/saslauthd ,默认是没有启动的
配置文件 /etc/sysconfig/saslauthd
saslauthd -v : 显示当前主机saslauthd服务所支持的认证机制,默认为pam,但是我们并没有配置让 saslauthd 与pam结合起来工作,所以建议改为 shadow, shadow更简单点,它表示到 /etc/passwd 和 /etc/shadow 当中去寻找认证的,验证用户身份的
sasl只是一个认证框架,真正认证是靠模块比如 pam或shadow等来实现
2,
[root@mail ~]# vim /etc/sysconfig/saslauthd
# Directory in which to place saslauthd's listening socket, pid file, and so
# on. This directory must already exist.
SOCKETDIR=/var/run/saslauthd
# Mechanism to use when checking passwords. Run "saslauthd -v" to get a list
# of which mechanism your installation was compiled with the ablity to use.
#MECH=pam #表示认证方式有哪些,这里改为shadow, MECH是mechanism的缩写吧
MECH=shadow
# Additional flags to pass to saslauthd on the command line. See saslauthd(8)
# for the list of accepted flags.
FLAGS=
~
~
[root@mail ~]# saslauthd -v #显示sasl的认证方式有哪些
saslauthd 2.1.22
authentication mechanisms: getpwent kerberos5 pam rimap shadow ldap
[root@mail ~]#
[root@mail ~]# service saslauthd status
saslauthd 已停
[root@mail ~]# service saslauthd start
启动 saslauthd: [确定]
[root@mail ~]#
开机启动
[root@mail ~]# chkconfig saslauthd on
[root@mail ~]#
[root@mail ~]# testsaslauthd -h
testsaslauthd: invalid option -- h
testsaslauthd: usage: testsaslauthd -u username -p password
[-r realm] [-s servicename]
[-f socket path] [-R repeatnum]
[root@mail ~]#
[root@mail ~]# testsaslauthd -u openstack -p 1111111
0: OK "Success."
[root@mail ~]#
[root@mail ~]# postconf -a # -a 是验证的服务器的认证能力
cyrus # 表示支持 sasl
dovecot
[root@mail ~]#
要想postfix 支持sasl的功能,得在配置文件中配置一下
smtp:
connection: (telnet刚开始的建立连接) smtpd_client_restrictions 限定谁能够发起客户端连接
helo: smtpd_client_restrictions = 限定符合某些条件的用户才能发送helo指令
mail from:smtpd_sender_restrictions = 限定谁能够发送mail from指令
rcpt to: smtpd_recipient_restrictions = 限定谁能够发送 rcpt to指令 ,,真正拒绝连接在这儿显示的(在这里显示出来,在这里显示出来,在这里显示出来)
data: smtpd_data_restrictions = 限定谁能够发送 data 指令
smtpd_client_restrictions = check_client_access hash:/etc/postfix/access (这里不能加文件名后缀)
smtpd_helo_restrictions = check_helo_access mysql:/etc/postfix/mysql_user (这个也是一个关于mysql的配置文件)
smtpd_sender_restrictions =
smtpd_recipient_restrictions =
也把 check_client_access 放在 smtp_helo_restrictions 或其它的后面也行
smtpd_recipient_restrictions = permit_mynetworks,reject_unauth_destination (这两个必须要有)由此,所以在mynetworks里面定义的可以中继,其它的不可以中继,另外关闭了 open relay(开放式中继)的功能 其它的值,可以参考 postfix 的官方文档
mail from:obama@ 只要是来自obama的, 不管哪个域,都不让他发邮件
a.com 想拒绝来自 a.com的 怎么办
查找表 access_map (访问映射)
访问控制文件
随便一个文件 /etc/postfix/access -->(内容太多,查找太慢)转为 hash 格式-->/etc/postfix/access.db (以前有个 /etc/aliases-->/etc/aliases.db(hash 二进制格式) 也是这样子的)
obama@aol.com reject
microsoft.com OK
查找文件的格式
[root@mail ~]# postconf -m
btree
cidr
environ
fail
hash
internal
memcache
mysql
nis
pcre
proxy
regexp
socketmap
static
tcp
texthash
unix
[root@mail ~]#
[root@mail ~]# vim /etc/postfix/access #文件名可自己定义
..........................
192.168.1.251 REJECT #其实文档里面是有注释的
..........................
[root@mail ~]# postmap /etc/postfix/access #把文本文件转换成hash二进制格式
[root@mail ~]# ls /etc/postfix/
access canonical main.cf relocated
access.db generic main.cf.default TLS_LICENSE
aliases header_checks makedefs.out transport
bounce.cf.default LICENSE master.cf virtual
[root@mail ~]#
[root@mail ~]# vim /etc/postfix/main.cf
.................................
smtpd_client_restrictions = check_client_access hash:/etc/postfix/access
.................................
看看刚刚更改的配置
[root@mail ~]# postconf -n
command_directory = /usr/sbin
config_directory = /etc/postfix
daemon_directory = /usr/libexec/postfix
data_directory = /var/lib/postfix
debug_peer_level = 2
debugger_command = PATH=/bin:/usr/bin:/usr/local/bin:/usr/X11R6/bin ddd $daemon_directory/$process_name $process_id & sleep 5
html_directory = no
inet_protocols = ipv4
mail_owner = postfix
mailq_path = /usr/bin/mailq
manpage_directory = /usr/local/man
mydestination = $myhostname, $mydomain, localhost, $mydomain,
mydomain = magedu.com
myhostname = mail.magedu.com
mynetworks = 127.0.0.0/8
myorigin = $mydomain
newaliases_path = /usr/bin/newaliases
queue_directory = /var/spool/postfix
readme_directory = no
sample_directory = /etc/postfix
sendmail_path = /usr/sbin/sendmail
setgid_group = postdrop
smtpd_client_restrictions = check_client_access hash:/etc/postfix/access
unknown_local_recipient_reject_code = 550
[root@mail ~]#
重启postfix
[root@mail ~]# service postfix restart
关闭 postfix: [确定]
启动 postfix: [确定]
[root@mail ~]#
马哥发送看看,不能发送 发送邮件时记住 防火墙要关掉
我自己试了 outlook 也是不能发邮件
[root@mail ~]# vim /etc/postfix/access
.........................
#192.168.1.251 REJECT # 先注掉它
whitehouse.com REJECT # 换个域名看看 拒绝mail from 来自某域名的主机 #本文件注释中有示例
.........................
重新转化成hash二进制格式
[root@mail ~]# postmap /etc/postfix/access
...............................
#smtpd_client_restrictions = check_client_access hash:/etc/postfix/access
smtpd_sender_restrictions = check_sender_access hash:/etc/postfix/access
...............................
重启 postfix
[root@mail ~]# service postfix restart post
关闭 postfix: [确定]
启动 postfix: [确定]
[root@mail ~]#
马哥己经发送出去了 我的也发出去了
发送邮件时记住 防火墙要关掉
我们使用 whitehouse.com 冒充 obama@whitehouse.com 看看 会不会拒绝
在本机 linux 上试试吧 (由下可知,已经拒绝了)
[root@mail ~]# telnet 192.168.1.45 25
Trying 192.168.1.45...
Connected to www.a.org (192.168.1.45).
Escape character is '^]'.
220 mail.magedu.com ESMTP Postfix
helo mail.magedu.com # helo 好像是可以省略的
250 mail.magedu.com
mail from:obama@whitehouse.com
250 2.1.0 Ok
rcpt to:openstack@magedu.com
554 5.7.1 <obama@whitehouse.com>: Sender address rejected: Access denied
4NN 表示暂时性错误
5NN 表示永久性错误
假如限定收件人的
[root@mail ~]# vim /etc/postfix/recipient
openstack@ REJECT
转换成 hash 二进制格式
[root@mail ~]# postmap /etc/postfix/recipient
[root@mail ~]# ls /etc/postfix/
access canonical main.cf recipient transport
access.db generic main.cf.default recipient.db virtual
aliases header_checks makedefs.out relocated
bounce.cf.default LICENSE master.cf TLS_LICENSE
[root@mail ~]#
[root@mail ~]# vim /etc/postfix/main.cf
.......................
smtpd_recipient_restrictions = check_recipient_access hash:/etc/postfix/recipient,permit_mynetworks,reject_unauth_destination
# 这个比较特殊,必须要加上 permit_mynetworks,reject_unauth_destination 这两个,并且把 reject_unauth_destination 写到最后,一定要写到最后,一定要写到最后,一定要写到最后 ,最好把 permit_mynetworks,reject_unauth_destination 连在一起写到最后
.......................
[root@mail ~]# service postfix restart
关闭 postfix: [确定]
启动 postfix: [确定]
[root@mail ~]#
(马哥)先试正常的 可以发送
(马哥)正常到收
(马哥)发送给 openstack ,此时无法发送了
通过 在本机 linux 上测试 openstack 也是拒绝的
[root@mail ~]# telnet 192.168.1.45 25
Trying 192.168.1.45...
Connected to www.a.org (192.168.1.45).
Escape character is '^]'.
220 mail.magedu.com ESMTP Postfix
helo mail.magedu.com
250 mail.magedu.com
mail from: root@magedu.com
250 2.1.0 Ok
rcpt to:openstack@magedu.com
554 5.7.1 <openstack@magedu.com>: Recipient address rejected: Access denied
quit
221 2.0.0 Bye
Connection closed by foreign host.
[root@mail ~]#
别名
a@magedu.com -->hadoop@magedu.com
[root@mail ~]# vim /etc/aliases
.......................
#a@magedu.com: hadoop@magedu.com
a: hadoop # 可以后面不加@域名 发给a的都转发给 hadoop
tomcat: hadoop # 可以后面不加@域名 发给tomcat的都转发给 hadoop
.................
修改了别名文件,需要执行一下别名命令 newaliases
[root@mail ~]# newaliases
[root@mail ~]# service postfix restart
关闭 postfix: [确定]
启动 postfix: [确定]
[root@mail ~]#
(马哥) 下面的表面上会发给 tomcat,事实上是发给hadoop
到 tomcat 用户下,看看 是没有收到邮件的
发给 不存在的 a 用户,照样是发给 hadoop
broken_sasl_auth_clients = yes # 是不是要通过sasl来检查client的发送邮件的,是不是要验证客户端身份的
smtpd_recipient_restrictions = ..... 是不是定义收件人限定的
smtpd_sasl_auth_enable = yes 启用sasl认证的功能 与 broken_sasl_auth_clients 结合起来工作
smtpd_sasl_local_domain = $myhostname # 指示不用认证的本地域,只识别本地主机的,所以不用 $mydomain
smtpd_sasl_security_options = noanonymous # sasl的安全选项 不支持匿名用户
smtpd_sasl_application_name = smtpd # 指的是 smtpd 这个程序使用 sasl 的功能
smtpd_banner = ...................没有什么意义,是定义 banner的 定义横幅的
[root@mail ~]# telnet 127.0.0.1 25
Trying 127.0.0.1...
Connected to localhost.localdomain (127.0.0.1).
Escape character is '^]'.
220 mail.magedu.com ESMTP Postfix # smptd_banner 就是定义这条欢迎信息的
[root@mail ~]# vim /etc/postfix/main.cf
............................................
#最后追加
################################
broken_sasl_auth_clients = yes
smtpd_recipient_restrictions=permit_mynetworks,permit_sasl_authenticated,reject_invalid_hostname,reject_non_fqdn_hostname,reject_unknown_sender_domain,reject_non_fqdn_sender,reject_non_fqdn_recipient,reject_unknown_recipient_domain,reject_unauth_pipelining,reject_unauth_destination
smtpd_sasl_auth_enable = yes
smtpd_sasl_local_domain = $myhostname
smtpd_sasl_security_options = noanonymous
smtpd_sasl_application_name = smtpd
smtpd_banner = Welcome to our $myhostname ESMTP,Warning: Version not Available!
我们还需要让 sasl2所支持的 smtp 这个程序,说明白它基于哪种方式进行认证
[root@mail ~]# vim /usr/lib/sasl2/smtpd.conf
pwcheck_method: saslauthd #密码检查方法
mech_list: LOGIN PLAIN #认证机制 两种认证机制 ( mech 是 Mechanism 的缩写吧 ) (outlook 是基于LOGIN的方式来认证的)
重启服务
[root@mail ~]# service postfix restart
关闭 postfix: [确定]
启动 postfix: [确定]
[root@mail ~]#
[root@mail ~]# vim /etc/postfix/main.cf
..................................
mynetworks = 127.0.0.0/8 #只给本机中继 上面 permit_sasl_authenticated 是不是只要通过sasl认证的,就给它中继?
..................................
重启服务
[root@mail ~]# service postfix restart
关闭 postfix: [确定]
启动 postfix: [确定]
[root@mail ~]#
[root@mail ~]# telnet 192.168.1.45 25
Trying 192.168.1.45...
Connected to www.a.org (192.168.1.45).
Escape character is '^]'.
220 Welcome to our mail.magedu.com ESMTP,Warning: Version not Available!
ehlo mail.magedu.com
250-mail.magedu.com
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
mail from: root@magedu.com
250 2.1.0 Ok
rcpt to: hello@aol.com
454 4.7.1 <hello@aol.com>: Relay access denied
用户名登录时,是要base64编码的
[root@mail ~]# echo "hadoop" | openssl base64
aGFkb29wCg==
[root@mail ~]#
echo 是默认换行的,但是 不能让它换行
[root@mail ~]# echo -n "hadoop" | openssl base64
aGFkb29w
[root@mail ~]#
[root@mail ~]# echo -n "123456" | openssl base64
emhvbmcxOTI2
[root@mail ~]#
[root@mail ~]# telnet 192.168.1.45 25
Trying 192.168.1.45...
Connected to www.a.org (192.168.1.45).
Escape character is '^]'.
220 Welcome to our mail.magedu.com ESMTP,Warning: Version not Available!
ehlo mail.magedu.com
250-mail.magedu.com
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
auth login #进行用户名的认证
334 VXNlcm5hbWU6
aGFkb29w
334 UGFzc3dvcmQ6
emhvbmcxOTI2 #进行密码的认证
235 2.7.0 Authentication successful
mail from:root@magedu.com
250 2.1.0 Ok
rcpt to:hello@aol.com
250 2.1.5 Ok
quit
221 2.0.0 Bye
Connection closed by foreign host.
[root@mail ~]#
我这边是好的 ,认证 通过 但是,马哥却不行,认证完后不能通过中继
outlook 打开服务认证的功能