linux用户无法接收邮件,linux 下 搭建邮件邮件服务器(Postfix+Dovecot)(一)-系统账户登陆收发邮件...

linux 下 搭建邮件邮件服务器(一)-系统账户登陆收发邮件

一、安装环境# lsb_release -d

Description:    CentOS release 6.5 (Final)

# uname -i

x86_64

# ifconfig |grep 'inet addr'|grep Bcast|awk -F 'Bcast' '{print $1}'|awk -F ':' '{print $2}'

192.168.151.140

101.230.205.140

二、安装前的准备工作

安装前说明:邮件服务依赖于DNS服务,请事先确信您的DNS服务已经为邮件应用配置完成。

1、安装所需的rpm包,这包括以下这些:httpd,mysql,mysql-server,mysql-devel,openssl-devel,dovecot,perl-DBD-Mysql,tcl,tcl-devel,libart_lgpl,libart_lgpl-

devel,libtool-ltdl,libtool-ltdl-devel,expect

# yum install httpd mysql mysql-server mysql-devel openssl-devel dovecot perl-DBD-Mysql tcl tcl-devel libart_lgpl

libart_lgpl-devel libtool-ltdl libtool-ltdl-devel expect -y

2、关闭sendmail,并将它的随系统启动的功能关闭:# service sendmail stop

# chkconfig sendmail off

若sendmail未安装,跳过此步骤。

3、 安装以下开发所用到的rpm包组:Development libraries

或Server platform Development

Desktop platform Development

Development Tools

方法:# yum groupinstall "packge_group_name"

三、启动依赖的服务

1、启动mysql数据库,并给mysql的root用户设置密码:# service mysqld start

# chkconfig mysqld on

# mysqladmin -uroot password 'your_password'

2、启动saslauthd服务,并将其加入到自动队列:# service saslauthd start

# chkconfig saslauthd on

四、安装配置postfix

如果发现postfix已安装,请用下列命令卸载。# rpm -e  postfix --nodeps

# userdel postfix

# groupdel postdrop

groupadd -g 2525 postfix

useradd -g postfix -u 2525 -s /sbin/nologin -M  postfix

groupadd -g 2526 postdrop

useradd -g postdrop -u 2526 -s /sbin/nologin -M postdrop

# rpm -ql mysql

# rpm -ql mysql-devel

# rpm -ql cyrus-sasl

# rpm -ql cyrus-sasl-devel

安装postfix-2.10.10.tar.gz# tar zxvf postfix-2.10.10.tar.gz

# cd postfix-2.10.10

make makefiles 'CCARGS=-DHAS_MYSQL -I/usr/include/mysql -DUSE_SASL_AUTH -DUSE_CYRUS_SASL -I/usr/include/sasl -DUSE_TLS '

'AUXLIBS=-L/usr/lib64/mysql -lmysqlclient -lz -lm -L//usr/lib64/sasl2 -lsasl2 -lssl -lcrypto'

make

make install

按照以下的提示输入相关路径([]号的是缺省值,"]"后的是输入值,省略的表示采用默认值)

生成别名二进制文件:# newaliases

2.进行一些基本配置,测试启动postfix并进行发信# vim /etc/postfix/main.cf

修改以下几项为您需要的配置myhostname = mail.10fei3.top

mydomain = 10fei3.top

myorigin = 10fei3.top

mydestination = $myhostname, localhost.$mydomain,localhost,$mydomain

mynetworks = 192.168.1.0/24, 127.0.0.0/8

说明:

myorigin参数用来指明发件人所在的域名,即做发件地址的伪装;

mydestination参数指定postfix接收邮件时收件人的域名,即您的postfix系统要接收到哪个域名的邮件;

myhostname参数指定运行postfix邮件系统的主机的主机名,默认情况下,其值被设定为本地机器名;

mydomain 参数指定您的域名,默认情况下,postfix将myhostname 的第一部分删除而作为mydomain的值;

mynetworks 参数指定你所在的网络的网络地址,postfix系统根据其值区别用户是远程的还是本地的,如果是本地网络用户则允许其访问;

inet_interfaces 参数指定postfix系统监听的网络接口;

注意:

1、在postfix的配置文件中,参数行和注释行是不能处在同一行中的;

2、任何一个参数的值都不需要加引号,否则,引号将会被当作参数值的一部分来使用;

3、每修改参数即其值后执行postfix relaod 即可令其生效;但若修改了inet_interfaces,则需要重新启动postfix;

4、如果一个参数的值有多个,可以将他们放在不同的行中,只需要在其后的每个行前多置一个空格即可;postfix会把第一个字符为空格或tab的文

本行视为上一行的延续;

五、为postfix提供Sysv服务脚本/etc/rc.d/init.d/postfix,内容如下(#END 之前)#!/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.

#processbname: 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

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 $"$prong 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 $"$prong 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 $"$prong reload"

RETVAL=$?

echo

return $RETVAL

}

abort() {

/usr/sbin/postfix abort 2>/dev/null 1>&2 && success || failure $"$prong abort"

return $?

}

flush() {

/usr/sbin/postfix flush 2>/dev/null 1>&2 && success || failure $"$prong flush"

return $?

}

check() {

/usr/sbin/postfix check 2>/dev/null 1>&2 && success || failure $"$prong check"

return $?

}

resatrt() {

stop

start

}

# See how we were called.

case "$1" in

start)

start

;;

stop)

stop

;;

restart)

resatrt

;;

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

为此脚本赋予执行权限:# chmod +x /etc/rc.d/init.d/postfix

# chown postfix.postfix -R /var/lib/postfix

# chown postfix.postfix -R /var/spool/postfix

将postfix服务添加至服务列表:# chkconfig --add postfix

设置其开机自动启动:# chkconfig postfix on

使用此脚本重新启动服务,以测试其能否正常执行:# service postfix restart

# yum install -y telnet

此时可使用本地用户测试邮件收发了。

六、实现postfix基于客户端的访问控制

1、基于客户端的访问控制概览

postfix内置了多种反垃圾邮件的机制,其中包括"客户端"发邮件的限制。客户端判别机制可以设定一系列客户信息的判别条件:smtpd_client_restrictions

smtpd_data_restrictions

smtpd_helo_restrictions

smtpd_recipient_restrictions

smtpd_sender_restrictions

上面的每一项参数分别用于检查smtp会话过程中的特定阶段,即客户端提供相应信息阶段,如客户端发起连接请求时,postfix就可以根据配置文件

中定义的smtpd_client_restrictions参数来判别此客户端IP的访问权限。相应的,smtpd_helo_restrictions则用于用户的helo信息判别客户端

的访问能力等等。

如果DATA命令之前的所有内容都被接受,客户端接着就可以传送邮件内容了。邮件内容通常由两部分组成,前半部分是标题(header),其可以由

header_check过滤,后半部分是邮件正文(body),其可以由check_body过滤,这两项实现的是邮件“内容检查”。

postfix的默认配置如下:smtpd_client_restrictions =

smtpd_data_restrictions =

smtpd_end_of_data_restrictions =

smtpd_etrn_restrictions =

smtpd_helo_restrictions =

smtpd_recipient_restrictions = permit_mynetworks,reject_unauth_destination

smtpd_sender_restrictions =

这里限制了只有mynetworks参数中定义的本地网络中的客户端才能通过postfix转发邮件,其他客户端则不被允许,从而关闭了开放式中继(open relay)的功能。

postfix有很多个内置的限制条件,如上面的permit_mynetworks和reject_unauth_destination,但管理员也可以使用访问表(access map)来自

定义限制条件。自定义访问表的条件通常使用check_client_access,

check_helo_access,check_sender_access,check_recipient_access进行,它们后面通常跟上type:mapname格式的访问表类型和名称。其中,

check_sender_access和check_recipient_access用来检查客户端提供的邮件地址,因此,其访问表中可以使用完整的邮件地址,如

admin@hunk.com;也可以只是用域名,如hunk.com;还可以只有用户名的部分,如marion@。

七、为postfix开启基于cyrus-sasl的认证功能vim /etc/sysconfig/saslauthd

#MECH=pam

MECH=shadow

使用以下命令验证postfix是否支持cyrus风格的sasl认证,如果您的输出为以下结果,则是支持的:# /usr/local/postfix/sbin/postconf -a

cyrus

dovecot

或# postconf -a

cyrus

dovecot#vim /etc/postfix/main.cf

添加以下内容:####################CYRUS-SASL##############################

broken_sasl_auth_clients = yes

smtpd_recipient_restrictions = permit_mynetworks,permit_sasl_authenticated,reject_invalid_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  ##postfix2.3之后不再使用

smtpd_sasl_path = smtpd

smtpd_banner = Welcome to my $myhostname ESMTP,Warning: Version not Available!

#smtpd_banner = Welcome to my $myhostname ESMTP $mail_name ($mail_version)!# vim /usr/lib64/sasl2/smtpd.conf

#添加如下内容:log_level: 3

pwcheck_method: saslauthd

mech_list: PLAIN LOGIN# /etc/init.d/saslauthd restart

#让postfix重新加载配置文件# /etc/init.d/postfix reload

修改selinux# getenforce

Enforcing

#下面临时生效# setenforce 0

# getenforce

Permissive

#下面永久生效# vim /etc/sysconfig/selinux

SELINUX=disabled

#

创建系统用户zyz# useradd zyz

# passwd zyz

更改用户 zyz 的密码 。

新的 密码:

无效的密码: 过于简单化/系统化

重新输入新的 密码:

passwd: 所有的身份验证令牌已经成功更新。# testsaslauthd -u zyz -p passwd

0: OK "Success."

#passwd是你为账户设置的密码。# telnet localhost 25

Trying ::1...

telnet: connect to address ::1: Connection refused

Trying 127.0.0.1...

Connected to localhost.

Escape character is '^]'.

220 Welcome to our mail.10fei3.top ESMTP,Warning: Version not Available!

ehlo mail.10fei3.top

250-mail.10fei3.top

250-PIPELINING

250-SIZE 10240000

250-VRFY

250-ETRN

250-AUTH LOGIN PLAIN

250-AUTH=LOGIN PLAIN

250-ENHANCEDSTATUSCODES

250-8BITMIME

250 DSN

八、dovecot 配置# cd /etc/dovecot/

# vim dovecot.conf

protocols = pop3

login_greeting = Welcome to 10fe3.top Mail Pop3 Server.

#login_trusted_networks = 192.168.1.0/24,10.230.205.130/32

login_trusted_networks = 192.168.1.0/24# mkdir ssl

# ls ssl/

dovecot.crt  dovecot.csr  dovecot.key

# vim conf.d/10-ssl.conf

ssl = yes

ssl_cert = 

ssl_key = 

# vim conf.d/10-mail.conf

mail_location = maildir:~/Maildir

# /etc/init.d/dovecot restart

home_mailbox = Maildir/

# /etc/init.d/postfix restart

我们现在用tcpdump 在postfix、dovecot服务器上进行抓包。

无验证登陆postfix:# telnet 192.168.1.140 25

220 Welcome to my mail.10fei3.top ESMTP,Warning: Version not Available!

mail from:zyz@10fei3.top

250 2.1.0 Ok

rcpt to:zyz@126.com

250 2.1.5 Ok

data

354 End data with .

sss

hao

.

250 2.0.0 Ok: queued as 32A582601B1

无认证登陆dovecot:telnet 192.168.1.140 110

+OK Welcome to 10fe3.top Mail Pop3 Server.

user zyz

+OK

pass zyz

+OK Logged in.

认证登陆postfix(用户名和密码需要base64编码):# telnet 101.230.205.140 25

Trying 101.230.205.140...

Connected to 101.230.205.140.

Escape character is '^]'.

220 *******************************************************************

500 5.5.2 Error: bad syntax

ehlo mail.10fei3.top

250-mail.10fei3.top

250-PIPELINING

250-SIZE 10240000

250-VRFY

250-ETRN

250-AUTH PLAIN LOGIN

250-AUTH=PLAIN LOGIN

250-ENHANCEDSTATUSCODES

250-8BITMIME

250 DSN

auth login

334 VXNlcm5hbWU6

enl6

334 UGFzc3dvcmQ6

enl6

235 2.7.0 Authentication successful

SSl安全登陆dovecot:# mutt -f pops://zyz@mail.10fei3.top

# openssl s_client -connect mail.10fei3.top:995

九、小结

问题1:[root@localhost ~]# postfix start

postfix/postfix-script: warning: not owned by postfix: /var/lib/postfix/.

postfix/postfix-script: warning: not owned by postfix: /var/lib/postfix/./master.lock

postfix/postfix-script: warning: not owned by postfix: /var/spool/postfix/private

postfix/postfix-script: warning: not owned by postfix: /var/spool/postfix/public

postfix/postfix-script: warning: not owned by group postdrop: /var/spool/postfix/public

postfix/postfix-script: starting the Postfix mail system

postfix/postfix-script: fatal: mail system startup failed

解决:chown -R postfix.root /var/lib/postfix/

chown -R postfix.root /var/spool/postfix/private

chown -R postfix.root /var/spool/postfix/public

chown -R postfix.postdrop /var/spool/postfix/public

问题2:Jun  7 17:06:43 localhost dovecot: pop3(zyz): Error: chown(/home/zyz/mail/.imap/INBOX, -1, 12(mail)) failed: Operation not

permitted (egid=2528(zyz), group based on /var/mail/zyz)

Jun  7 17:06:43 localhost dovecot: pop3(zyz): Error: mkdir(/home/zyz/mail/.imap/INBOX) failed: Operation not permitted

Jun  7 17:06:43 localhost dovecot: pop3(zyz): Error: Couldn't open INBOX: Internal error occurred. Refer to server log for

more information. [2016-06-07 17:06:43]

解决su - zyz

mkdir -p /home/zyz/mail/.imap/INBOX

问题3:Jun  7 17:15:44 localhost dovecot: pop3(hunk): Error: user hunk: Initialization failed: mail_location not set and

autodetection failed: Mail storage autodetection failed with home=/home/hunk

Jun  7 17:15:44 localhost dovecot: pop3(hunk): Error: Invalid user settings. Refer to server log for more information.

解决:su - hunkmkdir -p /home/hunk/mail/.imap/INBOX

问题4:

foxmail等客户端不能收邮件,能发送邮件

解决:# vim /etc/postfix/main.cf

home_mailbox = Maildir/

# /etc/init.d/postfix restart

# vim /etc/dovecot/conf.d/10-mail.conf

mail_location = maildir:~/Maildir

# /etc/init.d/dovecot restart

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值