您的位置:首页 > 其它

postfix之postfix详解

2015-06-28 16:12 351 查看
postfix:

日志:
/var/log/maillog

邮件别名:
将发给a的邮件发给b。
/etc/aliases 别名文件。postfix无法识别。
格式:
USERNAME1@DOMAIN1:USERNAME2@DOMAIN2

/etc/aliases.db 由hash生成的别名文件数据库。postfix读取速度快。

#newaliases [OPTION] 创建别名数据库。将aliases文件通过hash生成aliases.db

中继:
默认将本机IP地址所在网段都识别为本地网络,都予以中继。

配置文件:

master: /etc/postfix/master.cf 主进程配置文件。若maildrop作为postfix的一个模块来使用,则相关的配置都在此文件中。

mail:/etc/postfix/main.cf 实现各项功能的配置文件。

/etc/postfix/main.cf
格式: 参数 = 值 。参数必须卸写在绝对行首,空白开头的行被认为是上一行的延续。

#postconf [OPTION] postfix自带配置main.cf的工具
[OPTION]
-d 显示main.cf的默认字段。
-n 显示main.cf中修改过的字段
-m 显示支持的所有查找表(lookup table)类型。即储存账号的表。
-A 显示可用的sasl客户端插件类型。既所支持的sasl验证类型。
-a 服务器端支持的sasl插件类型。
-e PARMATER=VALUE 编辑main.cf的内容,通过的PARMATER=VALUE格式来更新配置文件。

例如:
#postconf -d

基于客户端的访问控制:
在发送过程中,每个阶段都可以控制,在main.cf中有定义,默认配置如下:
#vim /etc/postfix/main.cf
smtpd_client_restrictions =
限定连接服务器

smtpd_data_restrictions =
限定发送data指令

smtpd_end_of_data_restrictions =
smtpd_etrn_restrictions =
smtpd_helo_restrictions =
限定发送helo指令

smtpd_recipient_restrictions = permit_mynetworks, reject_unauth_destination
限定发送rept to指令,即中继的限定。即使前边几个指令被限定,服务器也会返回正确信息。只有到这步,服务器才会返回相关的限定信息。

smtpd_sender_restrictions =
限定发动mail from指令

限制条件:
permit_mynetworks 允许$mynetworks中定义的网段给与中继。

reject_unauth_destination 拒绝未经认证的目标。

...

访问表(access map):
check_client_access
check_helo_access
check_sender_access
check_recipient_access

访问表文件:
实际上访问表文件名字可以自定义,只要保证配置文件中能互相匹配即可。默认使用access。

/etc/postfix/access 文本文件
格式为PATTERN ACTION
PATTERN
邮件地址:
USERNAME@DOMAIN 匹配指定的邮件地址。

DOMAIN 匹配域名部分符合的所有邮件地址。

USERNAME@ 匹配用户名符合的所有邮件地址。

域名:
DDMAIN 匹配指定域和其子域内的所有主机。

.DOMAIN 匹配指定子域中的所有主机。

IP地址:
IPADDR.IP.IP.IP 匹配指定ip的所有主机。

IPADDR.IP.IP 匹配指定网段内的所有主机。

IPADDR.IP 匹配指定网段内的所有主机。

IPADDR 匹配指定网段内的所有主机。

IPADDR/MASK CIDR格式,匹配指定网段内的所有主机。

ACTION
OK 接受PATTERN所指定的。
NUMS 全部为数字组成,隐式表示OK

REJECT CODENUM TEXT 拒绝
DEFER CODENUM TEXT 拒绝
CODENUM TEXT 自定义拒绝码和信息,注意421和521对postfix有特殊含义,不要使用。

/etc/postfix/access.db hash文件

#postmap [OPTION] /etc/postfix/access 将文本文件转换为hash格式的查找表文件。
例如:
#vim /etc/postfix/main.cf
smtpd_client_restrictions = check_client_access hash: /etc/postfix/access
从文件中检索相关的用户是否可以连接到服务器

mysql:
#vim /etc/postfix/main.cf
smtpd_client_restrictions = check_client_access mysql: /etc/postfix/mysql_user

实例:
1.禁止172.16.100.200这台主机通过工作在172.16.100.1上的postfix服务发送邮件。访问表使用hash的格式。
#vim /etc/postfix/access
172.16.100.200 REJECT
#postmap /etc/postfix/access
#vim /etc/postfix/main.conf
smtpd_client_restrictions = check_client_access hash:/etc/postfix/access
#systemctl restart postfix

2.禁止microsoft.com域向本服务器发送邮件。访问表使用hash的格式。
#vim /etc/postfix/access
microsoft.com REJECT
#postmap /etc/postfix/access
#vim /etc/postfix/main.cf
smtpd_sender_restrictions = check_recipient_access hash:/etc/postfix/access
#systemctl restart postfix

3.禁止所有用户向hadoop发送邮件,访问表使用hash的格式
#vim /etc/postfix/denyhadoop
hadoop@ REJECT
#postmap /etc/postfix/denyhadoop
#vim /etc/postfix/main.cf
smtpd_recipient_restrictions = heck_recipient_access hash:/etc/postfix/denyhadoop, permit_mynetworks, reject_unauth_destination 这里注意优先级顺序。
#systemctl restart postfix

别名相关:

作用:将发给USERNAME1的邮件全部发给USERNAME2。注意不是转发。
文本文件:
/etc/aliases

hash后文件:
/etc/aliases.db

配置文件:
/etc/postfix/aliases
格式:
USERNAME1@DOMAIN1: USERNAME2

#newaliases 生成新的hash查找表文件

#systemctl restart postfix 重启服务后生效。

编译安装配置postfix:
0.创建用户和组:
用户和组的id必须一致,并且尽量大于1000。

#groupadd -g 2525 postfix
#groupadd -g 2526 postdrop postfix自带的MDA,如果换成maildrop可以不创建。
#useradd -M -u 2525 -g 2525 postfix -s /sbin/nologin
#useradd -M -u 2526 -g 2526 postdrop -s /sbin/nologin

1.编译安装:
#tar -xf postfix-xxx.tar.gz
#cd postfix-xx
#make makefiles 'CCARGS=-DHAS_MYSQL -I/usr/local/mysql/include -DUSE_SASL_AUTH -DUSE_CYRUS_SASL -I/usr/include/sasl -DUSE_TLS ' 'AUXLIBS=-L/usr/local/mysql/lib -lmysqlclient -lz -lm -L/usr/lib/sasl2 -lsasl2 -lssl -lcrypto'
#make
#make install

指定相关路径:

install_root: [/] / 默认路径。默认安装在根下。
tempdir: [/root/postfix-XXX] /tmp/postfix 临时文件
config_directory: [/etc/postfix] /etc/postfix 配置文件
daemon_directory: [/usr/libexec/postfix] 进程目录
command_directory: [/usr/sbin] 服务脚本位置
data-directory: [/var/lib/postfix] 工作空间的位置
queue_directory: [/var/spool/postfix] 邮件队列目录
sendmail_path: [/usr/sbin/sendmail] sendmail客户端路径
newaliases_path: [/usr/bin/newaliases] 生成新别名路径
mailq_path: [/usr/bin/mailq] 邮件队列路径
mail_owner: [postfix] 指定用户
setgid_group: [postdrop] 指定用户组
html_directory: [no]/var/www/html/postfix web格式文档路径。
manpages: [/usr/local/man] man文档路径
readme_directory: [no] readme文档路径

编译选项详解:
CCARGS= 功能开关
-DHAS_MYSQL 支持mysql驱动
-I/usr/local/mysql/include 指定mysql头文件的位置
-DUSE_SASL_AUTH 支持SASL认证
-DUSE_TLS 支持TLS认证

AUXLIBS= 指定额外库文件位置
-L/usr/local/mysql/lib 指定mysql库文件
-L/usr/lib/sasl2 制定sasl库文件
-lmysqlclient mysql客户端的库文件
-lz 压缩库文件
-lm 模块文件
-lcrypto 加密的库文件
-lssl ssl的库文件
-lsasl2 sasl2的库文件,需要cyrus-sasl-devel包和cyrus-sasl-plain包。

2.复制服务脚本:
#vim /etc/rc.d/init.d/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 $?

#chmod +x /etc/rc.d/init.d/postfix

3.修改配置文件:
#vim /etc/postfix/main.cf
myhostname = MAILSERVERNAME.DOMAIN
邮件服务器的主机名。要和hostname以及dns服务器中的主机名称保持一致。

myorigin = $mydomain
指定发件人所在的域名。用来邮件地址伪装。发送来的邮件都会被改写成此域的域名。

mydomain = DOMAIN
当前邮件服务器所在的域的域名。若不指定,则会将$myhostname中的第一部分删除作为域名。

mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain, ns.$mydomain
指定目标收件人的域名。包含在其中域,表示本机为这些域的收件服务器,可以不用中继。能否中继取决于$mynetworks中定义。若主机有其他别名也一并添加,例如ns.$mydomain

mynetworks = 192.168.1.0/24, 127.0.0.0/8
本地网络,允许为来自以上网段的进行中继。

inet_interfaces = all postfix进程 监听的IP地址,默认为all。0.0.0.0表示本机的所有可用地址。

4.修改主机名和dns

#vim /etc/hostname
MAILSERVERNAME.DOMAIN

#vim /etc/resolv.conf
nameserver IP

5.生成别名数据库
#newaliases

6.发送邮件测试:
#telnet localhost 25 发送测试
helo localhost
mail from:XXX@XXXX
rcpt to:xxxx
data
Subject: xxxx
XXX
.
quit

7.支持sasl认证:
启用sasl服务:
sasl服务脚本:
/etc/rc.d/init.d/saslauthd

脚本配置文件:
/etc/sysconfig/saslauthd
MECH=shadow 将认证方式从pem改为shadow,即从/etc/shadow中读取账号密码。

#systemctl start saslauthd

#saslauthd [OPTION]
[OPTION]
-v 显示当前sasl服务支持的认证方式,即所支持的认证模块。默认为pam。

#testsaslauthd [OPTION] 测试sasl认证命令。
[OPTION]
-u USERNAME
-p PASSWORD

例如:
#testsaslauthd -u hadoop -p hadoop

8.支持cyrus-sasl认证:
1.验证是否支持cyrus-sasl
#postfixconf -a
cyrus
dovecot

显示如上的话说明支持。

2.编辑main.cf
#vim /etc/postfix/main.cf
############################CYRUS-SASL############################
broken_sasl_auth_clients = yes 是否通过sasl来验证客户端身份。
smtpd_recipient_restrictions= 中继设置,根据实际情况选择。
permit_mynetworks, 允许$mynetworks中定义的的网段(必须有)
permit_sasl_authenticated, 允许sasl验证通过的用户(必须有)
reject_invalid_hostname, 拒绝主机名不合法
reject_non_fqdn_hostname, 拒绝主机名不是FQDN格式。
reject_unknown_sender_domain, 拒绝无法识别的发件人域
reject_non_fqdn_sender, 拒绝没有FQDN的发件人
reject_non_fqdn_recipient, 拒绝没有FQDN的收件人
reject_unknown_recipient_domain, 拒绝没有FQDN的收件人域
reject_unauth_pipelining, 拒绝无法验证的管道
reject_unauth_destination 拒绝无法验证的目标(必须有)
smtpd_sasl_auth_enable = yes 启用sasl验证
smtpd_sasl_local_domain = $myhostname
smtpd_sasl_security_options = noanonymous 禁止匿名用户
smtpd_sasl_path = smtpd 指定要使用sasl功能的服务器程序
smtpd_banner = Welcome to our $myhostname ESMTP,Warning: Version not Available! 定义欢迎信息

3.编辑smtpd.conf,若不存在则手工建立。
#vim /usr/lib/sasl2/smptd.conf sasl对smtp验证的相关配置
log_level: 3 日志级别,3为显示更详细信息。一般用在排错,实际配置可以不写。
pwcheck_method: saslauthd 密码检查方法。
mech_list: PLAIN LOGIN 认证机制列表。

4.重启postfix服务:
#systemctl restart postfix
#systemctl restart saslauthd

5.测试:
#vim /etc/postfix/main.cf
mynetworks=127.0.0.0/8

#telent 172.16.100.1 25
ehlo mail.test.com
...
250-AUTH LOGIN PLAIN 显示以下2行说明启用了验证
250-AUTH=LOGIN PLAIN
...
mail from: root@test.com
rcpt to a@b.org 默认情况下是拒绝的。
554 Realy access deny
#telnet 172.16.100.1 25
ehlo mail.test.com
...
250-AUTH LOGIN PLAIN
250-AUTH=LOGIN PLAIN
...
auth login
334 xxxxxx
USERNAME 这里输入经过base64编码的用户名,例如使用hadoop登录。
334 xxxxxx
PASSWORD 经过base64编码的密码
235 Authentication successful
mail form hadoop@test.com
rcpt to a@b.org

#echo -n "hadoop" | openssl base64
默认echo会打印换行符,-n表示不换行。通过openssl进行base64编码。
USENAME

#echo -n “PASSWD” | openssl base64
PASSWORD

本文出自 “小私的blog” 博客,请务必保留此出处http://ggvylf.blog.51cto.com/784661/1668735
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: