Postfix 可用作Mail Server, 它配置起来要比Sendmail简单得多。
Contents
参考文档
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: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: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. hehe test5 . 250 2.0.0 Ok: queued as F10B31FF10 quit 221 2.0.0 Bye Connection closed by foreign host.
过程:
# telnet25 EHLO AUTH LOGIN MAIL FROM: RCPT TO: 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. 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