欢迎各位兄弟 发布技术文章

这里的技术是共享的

You are here

马哥 25_03 _邮件服务系列之Postifx常用配置【攻城狮论坛の免费分享】有大用

发送邮件时记住 防火墙要关掉


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记录


image.png

image.png

image.png

image.png

image.png

image.png

image.png


[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 ~]#



image.png

image.png

image.png

允许使用 $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标记的这台主机名称也要匹配? )

www.a.org

[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


下面是马哥的

image.png



真正在网络上,只要A记录指向这台主机,PTR记录能够对应起来就可以了,不一定要把本机做成dns

我们这里把本机做成了dns


# yum install bind97 bind97-utils

image.png



[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上做的

image.png

 在 linux 上 给 hadoop 用户建密码

image.png


image.png

用户必须是linux 上的 普通用户,还必须有密码,密码在上面已经创建了


image.png

image.png


image.png


image.png

image.png


image.png


[root@mail postfix]# vim main.cf

..............................

mynetworks = 192.168.0.0/24,127.0.0.0/8          #192.168.0.0/24是我的局域网ip,马哥的局域网ip范围不是这样子的

..............................


此时 可以中继了 

image.png


image.png



linux 服务器上  就是本身收到的邮件,所以这里没有中继

image.png

su 到 openstack ,可以看到已经收到邮件了

image.png

下面是邮件内容  base64编码的

image.png




[root@mail postfix]# echo "abc" | openssl base64   #(openssl 子命令 base64,可以进行编码)

YWJjCg==

[root@mail postfix]#


看看能否中继

image.png

己经发送出去了

image.png


看到发不出去, 但是已经中继了

image.png



下面讲 pop3 ,来收邮件

MRA: cyrus-imap, dovecot


dovecot的rpm包依赖于mysql客户端 (它会安装mysql的客户端)

(我们已经安装了mysql服务器,会冲突? 不会,因为我们的mysql安装在了特殊位置)


[root@mail ~]# yum install dovecot

image.png


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

image.png


下面在日志里可以看到已经收到邮件

image.png





telnet 也能收邮件的

先把openstack设一下密码

image.png


下面 输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

......................

image.png

RETR 2 取出第二封邮件


image.png


quit 退出,即可

image.png



通过 linux 发邮件(发给 hadoop ),看 windows 的 outlook (就是用户 hadoop 登进去的) 能不能收到

image.png


由日志可见,已经发送了,

image.png





image.png

看到收件箱里刚发的邮件了

image.png



让 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 ~]#



image.png

image.png

image.png

image.png


image.png




要想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 ~]#


马哥发送看看,不能发送     发送邮件时记住 防火墙要关掉

image.png


我自己试了 outlook 也是不能发邮件

image.png




[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 ~]#


马哥己经发送出去了  我的也发出去了

发送邮件时记住 防火墙要关掉


image.png



image.png



我们使用 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 ~]#



 (马哥)先试正常的 可以发送

image.png

(马哥)正常到收

image.png

(马哥)发送给 openstack ,此时无法发送了

image.png

image.png



通过 在本机 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.comhadoop@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    

image.png

image.png

到 tomcat 用户下,看看   是没有收到邮件的

image.png


发给 不存在的 a 用户,照样是发给 hadoop

image.png


image.png



image.png

image.png

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


image.png



用户名登录时,是要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 ~]#

我这边是好的 ,认证 通过 但是,马哥却不行,认证完后不能通过中继

image.png



image.png

image.png


outlook 打开服务认证的功能


image.png


image.png



image.png


image.png


image.png















普通分类: