RHEL6: Postfix的安装与简单配置

Postfix 可用作Mail Server, 它配置起来要比Sendmail简单得多。

参考文档

1. 鸟哥Mail server http://linux.vbird.org/linux_server/0380mail.php
2. Postfix官方文档 http://www.postfix.org/documentation.html
3. 鸟哥DNS server http://linux.vbird.org/linux_server/0350dns.php

实验环境

3台虚拟机,操作系统为CentOS 6.5;
Host1的IP是192.168.56.101, Host2的IP是192.168.56.102,Host2的IP是192.168.56.103;

实验内容

1. Host1与Host2互相收发邮件;
2. 用Telnet发邮件;
3. 邮件Relay;
4. Virtual Alias Domain;
5. Virtual Mailbox Domain;
6. SASL认证;
7. Dovecot.


安装

在RHEL 6.5中,默认安装了Postfix。如果没有安装,在Host1,Host2,Host3中手动安装;

[root@host1 ~]# yum install postfix

搭建简单DNS Server

发邮件时,Postfix需要通过DNS的MX记录来找到投递点。在实验中,我们可以在本地搭建一个简单的DNS Server,专门为Postfix服务。
在Host1中安装

# yum install bind
# yum install bind-chroot

修改 /etc/named.conf 如下的几行。

listen-on port 53 { any; };
allow-query     { any; };

在/etc/named.rfc1912.zones中加入如下几行。

zone "red.com" IN {
        type master;
        file "named.red";
        allow-update { none; };
};


zone "green.com" IN {
        type master;
        file "named.green";
        allow-update { none; };
};

[root@host1 ~]# cd /var/named/
[root@host1 named]# cp -av named.localhost named.red 
[root@host1 named]# cp -av named.localhost named.green

编辑named.red

        NS      127.0.0.1.
        MX      5       mail
mail    A       192.168.56.102

编辑named.green

        NS      127.0.0.1.
        MX   5  mail
mail    A       192.168.56.101

将Host1 和 Host2的DNS都指向192.168.56.101
编辑/etc/resolv.conf

nameserver 192.168.56.101

防火墙设定

在/etc/sysconfig/iptables中修改防火墙规则。
DNS Server的防火墙设定

-A INPUT -p tcp -m state --state NEW -m tcp --dport 53 -j ACCEPT
-A INPUT -p udp -m state --state NEW -m udp --dport 53 -j ACCEPT

Postfix的防火墙设定

-A INPUT -p tcp -m state --state NEW -m tcp --dport 25 -j ACCEPT

Dovecot的防火墙设定

-A INPUT -p tcp -m state --state NEW -m tcp --dport 110 -j ACCEPT
-A INPUT -p tcp -m state --state NEW -m tcp --dport 143 -j ACCEPT

简单配置

在Host2中,配置/etc/postfix/main.cf,Host1同理。

myhostname = mail.red.com
mydomain = red.com
myorigin = $mydomain
inet_interfaces = all
mydestination = $myhostname, localhost.$mydomain, localhost, $mydomain

收发测试

在Host1中,向root@red.com 发送邮件;

[root@host1 ~]# mail root@red.com
Subject: hehe
test1
.
EOT

用mailq命令可以看到正在发送的邮件队列。

在Host2中,可以查看到邮件。

[root@host2 ~]# mail
Heirloom Mail version 12.4 7/29/08.  Type ? for help.
"/var/spool/mail/root": 1 message 1 new
>N  1 root                  Sat Nov 29 23:34  21/699   "hehe"
& 1
Message  1:
From root@green.com  Sat Nov 29 23:34:52 2014
Return-Path: <root@green.com>
X-Original-To: root@red.com
Delivered-To: root@red.com
Date: Sat, 29 Nov 2014 23:46:49 +0800
To: root@red.com
Subject: hehe
User-Agent: Heirloom mailx 12.4 7/29/08
Content-Type: text/plain; charset=us-ascii
From: root@green.com (root)
Status: R

test1

& d
& q

同样,用Host2可以向root@green.com发送邮件。

[root@host2 ~]# mail root@green.com
Subject: hehe
test2
.
EOT
[root@host2 ~]# mailq
-Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------
06D501FF41*     408 Sat Nov 29 23:36:55  root@red.com
                                         root@green.com

-- 0 Kbytes in 1 Request.

在Host1中能收到邮件。

[root@host1 ~]# mail
Heirloom Mail version 12.4 7/29/08.  Type ? for help.
"/var/spool/mail/root": 1 message 1 new
>N  1 root                  Sat Nov 29 23:49  21/697   "hehe"
& 1 
Message  1:
From root@red.com  Sat Nov 29 23:49:12 2014
Return-Path: <root@red.com>
X-Original-To: root@green.com
Delivered-To: root@green.com
Date: Sat, 29 Nov 2014 23:36:55 +0800
To: root@green.com
Subject: hehe
User-Agent: Heirloom mailx 12.4 7/29/08
Content-Type: text/plain; charset=us-ascii
From: root@red.com (root)
Status: R

test2

& d
& q

邮件发送接收记录可以在/var/log/maillog 中查看。


Telnet

用Telnet模拟SMTP的通信过程。
示例:

[root@host1 ~]# telnet mail.red.com 25
Trying 192.168.56.102...
Connected to mail.red.com.
Escape character is '^]'.
220 mail.red.com ESMTP Postfix
EHLO mail.green.com
250-mail.red.com
250-PIPELINING
250-SIZE 10240000
250-VRFY
250-ETRN
250-ENHANCEDSTATUSCODES
250-8BITMIME
250 DSN
MAIL FROM:root@green.com
250 2.1.0 Ok
RCPT TO:root@red.com
250 2.1.5 Ok
DATA
354 End data with <CR><LF>.<CR><LF>
hehe
test5
.
250 2.0.0 Ok: queued as F10B31FF10
quit
221 2.0.0 Bye
Connection closed by foreign host.

过程:

# telnet  <your mail server domain> 25 
EHLO <your mail server domain>
AUTH LOGIN
MAIL FROM:<sender@domain.com>
RCPT TO:<recipient@remotedomain.com>
DATA

Aliases

修改Aliases可以实现“转发功能”。如在Host2上修改/etc/aliases。
最后增加一行,

root:   root,feichashao

保存后执行

[root@host2 ~]# postalias hash:/etc/aliases

则到root的邮件会发给root和feichashao。


Relayhost

做Relayhost的实验需要3台虚拟机,Red, Green, Blue,分别对应域名red.com, green.com, grey.com;
Red作为Nullclient,把邮件relay给Green(MTA),由Green发送到Blue。
删掉Red中/etc/resolv.conf中的nameserver,让Red无法解析域名;
在Red的postfix配置文件中,加上relayhost=< IP addr of green >
在Green的postfix配置文件中,加上mynetworks=< nullclient ip/network >


Postfix transport

在green.com中
在/etc/postfix/main.cf中加上一行

transport_maps = hash:/etc/postfix/transport

在/etc/postfix/transport中加上以下内容。

green.com       :
.green.com      :
grey.com        :[mail.red.com]

执行

[root@host1 ~]# postmap /etc/postfix/transport
[root@host1 ~]# postfix reload

这样,在green.com向grey.com发送邮件,邮件会先交给red.com,再由red.con发给grey.com。


Virtual aliases domain

参考 http://www.postfix.org/VIRTUAL_README.html
实验中,我们想让负责green.com的机器能收到发送到orange.com的邮件。
在 /etc/postfix/main.cf 中,加入

virtual_alias_domains = orange.com
virtual_alias_maps = hash:/etc/postfix/virtual

在/etc/postfix/virtual中,加入

user1@orange.com        root
user2@orange.com        root

执行 #postmap /etc/postfix/virtual
这样,负责green.com的机器也能接收发送到orange.com的邮件啦。
DNS中orange.com的MX要解析mail.green.com那台机器上。


Virtual mailbox domain

现在想做一个“虚拟的邮箱”,也就是,收信人不必是真实存在的用户。
如,发到info@orange.com的邮件,会放到info文件里,而服务器上不需要存在info这个用户。
注意:Virtual aliases domain不能有orange.com的信息。
在 /etc/postfix/main.cf中添加

virtual_mailbox_domains = orange.com
virtual_mailbox_base = /var/mail/vhosts
virtual_mailbox_maps = hash:/etc/postfix/vmailbox
virtual_minimum_uid = 100
virtual_uid_maps = static:5000
virtual_gid_maps = static:5000
virtual_alias_maps = hash:/etc/postfix/virtual

在/etc/postfix/vmailbox中添加(文件要自己建立)

info@orange.com orange.com/info
sales@orange.com        orange.com/sales/
@orange.com     orange.com/catchall/

执行

# postmap /etc/postfix/vmailbox
# postmap /etc/postfix/virtual  (这里virtual文件里没有内容)
# postfix reload

自行建立收信目录

# mkdir -p  /var/mail/vhosts/orange.com
# chown -R 5000:5000 /var/mail/vhosts

于是,别人发到info@orange.com的邮件就会出现在/var/mail/vhosts/orange.com/info这个文件里啦。


sasl

让他人可以通过输入用户密码后使用postfix发送邮件。
1. 在/etc/postfix/main.cf中加入

smtpd_sasl_path = smtpd
smtpd_sasl_auth_enable = yes
broken_sasl_auth_clients = yes
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated,reject_unauth_destination

2. 修改/etc/sasl2/smtpd.conf的内容(一般默认就这样)

    pwcheck_method: saslauthd
    mech_list: PLAIN LOGIN 

3. 修改/etc/sysconfig/saslauthd,使之直接使用本机的用户密码。

MECH=shadow

4. 重启saslauthd

[root@host1 ~]# /etc/init.d/saslauthd restart

5. 设置SELinux,允许saslauthd读取shadow.

[root@host1 ~]# setsebool -P allow_saslauthd_read_shadow 1

6. 测试sasl是否配置成功。
拿本机的feichashao这个用户测试。

[root@host1 ~]# testsaslauthd -u feichashao -p "redhat"
0: OK "Success."
[root@host1 ~]# testsaslauthd -u feichashao -p "wrong"
0: NO "authentication failed"

7. 安装cyrus-sasl-plain.

# yum install cyrus-sasl-plain

8. 测试.

[root@host1 ~]# echo -ne '\000feichashao\000redhat' | openssl base64
AGZlaWNoYXNoYW8AcmVkaGF0

[root@host1 ~]# telnet 127.0.0.1 25
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
220 mail.green.com ESMTP Postfix
ehlo feichashao
250-mail.green.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 plain AGZlaWNoYXNoYW8AcmVkaGF0
235 2.7.0 Authentication successful
mail from: root@green.com
250 2.1.0 Ok
rcpt to: root@red.com
250 2.1.5 Ok
data
354 End data with <CR><LF>.<CR><LF>
heheheheh
hehehehe
.
250 2.0.0 Ok: queued as 7C54B1FFA9
quit
221 2.0.0 Bye
Connection closed by foreign host.

dovecot

dovecot是个MAA,嗯...就是取邮件的一个东东。
1. 安装

# yum install dovecot

2. 配置
在/etc/dovecot/conf.d/10-mail.conf中加上

mail_location = mbox:~/mail:INBOX=/var/mail/%u
mail_access_groups = mail

重启dovecot.

3.测试
先拿其他机器向feichashao@green.com发几封邮件用作测试。

[root@host1 ~]# telnet 127.0.0.1 110
Trying 127.0.0.1...
Connected to 127.0.0.1.
Escape character is '^]'.
+OK Dovecot ready.
user feichashao
+OK
pass redhat
+OK Logged in.
list
+OK 2 messages:
1 695
2 695
.
top 1
+OK

如果出现问题,请检查/var/log/maillog 和配置文件。


Troubleshooting

1. 启动DNS Server (named) 时提示"Generating /etc/rndc.key:"
解决方法:

[root@host1 named]# rndc-confgen -r /dev/urandom -a

2. dig命令不存在

[root@host1 named]# yum install bind-utils

3. 检查防火墙、SELinux。

4. fatal: no SASL authentication mechanisms
配置了SASL但没配置mechanisms.

yum install cyrus-sasl-plain