鸟哥的 Linux 私房菜 -- Mail Server -- Postfix

since2012/04/23

     
 
简易 Mail Server 架设 -- Postfix 设定
本文已不再维护,更新文章请参考此处
最近更新日期:2004/04/07
在介绍完了 sendmail 之后,您是否觉得~唉!怎么 sendmail.cf 这个配置文件这么难搞定~还得藉由 m4 scripts 才能搞定!而且, sendmail 需要考虑到相当多的安全设定项目 ( Security ),否则很容易一不小心就被攻击了!那么有没有更简单、更安全的邮件系统啊!当然有啊!那就是 Postfix 这个咚咚!Postfix 的作者有鉴于 sendmail 是这样成功的一个 MTA ,但是偏偏有点小问题,所以该作者站在兼容的立场上面写出这个几乎可以完全取代 sendmail 的 MTA !此外, Postfix 还更加的安全呢,真是很不错的一个 mail server 的替代方案啊!


大标题的图示前言:
在开始介绍 Postfix 这个服务器之前,得先告诉您的是,这个 Postfix 的用途是『邮件服务器』,那么我们在前一章『Sendmail 服务器』里面已经提过了 mail server 的相关原理与运作过程,这个 Postfix 与 sendmail 是类似的东西,那就是『MTA』啦,既然都是 MTA ,使用的协议也相同,同时,这个 Postfix 最早之前的用途也是想要用来『取代 sendmail 』。所以,为了节省笔墨,也为了未来进行修改的时候不要有太多的版本 ( 意思是这里 copy 一份 mail 原理,那里又有一份原稿~ ) ,因此上,在进行本章的学习之前,请『务必』前往『简易 Mail server -- sendmail』读一读 Mail server 的原理与相关的说明啊!
 

本章学习之前你需要先知道的知识
 
上面刚刚提到,学习本章你必须要知道 Mail Server 的相关知识才行,在这里,我们不再说明已经提过的咚咚,请自行再前往翻阅。由于架设某种服务器的第一步就是要了解该服务器的工作原理,因此,在架设 Postfix 之前,您至少要知道以下的几个咚咚:
  1. Mail Server 能否运作与 DNS ( MX 与 A recode )的相关性为何?
  2. 什么是 MTA, MUA, MDA 与 Mail box, Mailing list 等相关的术语,及其内容所代表的意义!
  3. 什么是 smtp, pop3 以及 imap 协议,他们的用途分别是什么?
  4. 什么是 Relay 与 Open Relay ?
  5. 什么是 SMTP 邮件认证?
  6. 什么是邮件的别名与转递( aliases 与 forward )?
  7. 什么是 Procmail 与什么是 ORDB 呢?
如果您不晓得上面问题的答案,请不要『白目』的继续往下看 ^_^,先前往『简易的 sendmail 服务器』瞧一瞧相关的原理之后,再来这里吧!慢点学习不打紧,学的不精....可能会有害啊! @_@
  

为什么要有 Postfix 呢?
 
这是个很有趣的问题:『为什么要有 Postfix 呢?有了 sendmail 不就可以了吗?!』说到这个就要谈到 postfix 的由来了!
 
Postfix 是由 Wietse Zweitze Venema 先生(http://www.porcupine.org/wietse/)所发展的。早期的 mail server 都是使用 sendmail 架设的,还真的是『仅此一家,绝无分号!』 ^_^ !不过,Venema 博士觉得 sendmail 虽然很好用,但是毕竟不够安全,尤其效能上面并不十分的理想,最大的困扰是....他的配置文件 sendmail.cf 真的是太难懂了!对于网管人员来说,要设定好 sendmail.cf 这个档案,真不是人作的工作~
 
为了改善这些问题, Venema 博士就在 1998 年利用他老大在 IBM 公司第一个休假年进行一个计划:『设计一个可以取代 sendmail 的软件套件,可以提供网站管理员一个更快速、更安全、而且"完全兼容"于 sendmail 的 mail server 软件!』这个计划还真的成功了!而且也成功的使用在 IBM 内部,可以说是完全取代了 sendmail 这个邮件服务器!在这个计划成功之后, Venema 博士也在 1998 年首次释出这个自行发展的邮件服务器,并定名为 VMailer。不过, IBM 的律师却发现一件事,那就是 VMailer 这个名字与其他已注册的商标很类似,这样可能会引起一些注册上面的困扰。为了避免这个问题,所以 Venema 博士就将名称改为 Postfix !这个 Postfix 有『在什么什么之后修正』的意思。鸟哥个人认为, Venema 先生最早的构想并不是想要『创造一个全新的 Mail server 软件,而是想要制造一个可以完全兼容于 sendmail 的软件』,所以,Venema 先生认为他自行发展的软件应该是『改良 sendmail 的缺失』,所以才称为 Postfix 吧!取其意为:『在 sendmail 之后的改良的邮件服务器软件!』
 
所以啦, Postfix 设计的理念上面,主要是针对『想要完全兼容于 sendmail』所设计出来的一款『内在部分完全新颖』的一个邮件服务器软件。就是由于这个理念,因此,Postfix 改善了 sendmail 安全性上面的问题,改良了 mail server 的工作效率,更由于其配置文件完全为 ASCII 码,且设定内容都是『人类看的懂得语言!』因此,你可以轻易的由 sendmail 改良到 Postfix 上面!这也是当初 Venema 博士的最初构想啊!就是基于这个构想,所以, Postfix 在外部配置文件案的支持度,与 sendmail 几乎没有两样,同样的支持 aliases 这个档案,同样的支持 ~/.forward 这个档案,也同样的支持 SASL 的 SMTP 邮件认证功能等等!所以,呵呵!赶紧来学一学怎样架设 Postfix 这个相当出色的邮件服务器吧! ^_^

大标题的图示套件安装
跟之前一样的,我们需要的 mail server 功能有哪些呢?
  • 具有 smtp 的功能;
  • 具有 pop3 的功能;
  • 具有 procmail 过滤邮件的功能;
  • 具有 Open Relay Data Base 抵挡的功能;
为达成上述的功能,所以你至少需要底下的几个套件:
  • cyrus-sasl
  • procmail
  • postfix
  • imap(同时支持 pop3 及 imap 两个协议)
如果您是使用 Mandrake 后期版本的话,那么恭喜您,由于 Mandrake 预设就是使用 Postfix 做为邮件服务器,并且在安装的时候就已经将 Postfix 安装到你的系统当中了。至于 Red Hat 9 同样的也提供了 Postfix 喔!而如果您是使用非 postfix 为邮件服务器的 Linux distribution ,呵呵!仔细的查看后面介绍的 Tarball 安装的方式吧!
 

使用 RPM 安装完整的 Postfix + POP3 + SMTP + Procmail
 
底下我们分 Mandrake 9.0 与 Red Hat 9 这两个主要 Linux distribution 来介绍 Postfix + Cyrus-SASL 的方法喔!
 
Makdrake 9.x 版本
如果你是使用 Mandrake 之类的 Linux distribution 的话,由于他预设是以 Postfix 这个优良的邮件服务器系统,所以您可以不费吹灰之力的,就将 Postfix 以 RPM 安装完毕啰!基本上,如果是 Mandrake 的话,你需要安装的套件大致上有:
  • SMTP 认证套件: cyrus-sasl ( cyrus-sasl-1.5.27-5mdk 以及其他认证机制函式库 )
  • Postfix 邮件服务器: postfix ( postfix-1.1.11-4mdk )
  • POP3 服务器: imap ( imap-2001a-9mdk, imap-devel-2001a-9mdk 两个 )
  • 邮件分析软件:procmail ( procmail-3.22-3mdk )
你至少要安装的套件就有上面这几个,同时,请拿出您的原版光盘将上面的套件全部安装吧!安装的方法我们在『鸟哥的 Linux 私房菜 -- 基础学习篇』介绍过的 RPM 与 Tarball 安装方法里面提过多次了,请自行参考喔!安装完毕之后,你的主机就已经具有 Postfix 这个系统啦!不过,由于我们还要提供 SMTP 以及其他相关的功能,所以这里我们必需要确认一下各个套件是否都完全的安装了呢?底下我们就一个一个的来设定吧!(注:请特别留意 Cyrus-sasl 的版本,因为不同的版本他的函式库所在目录与配置文件都不相同!因此,在本篇文章中,您会发现我使用 Tarball 安装的 2.xx 版本与使用 RPM 安装的 1.5.xx 版本配置文件的内容不相同,不要怀疑,确实是如此的喔! )
 
安装 cyrus-sasl
1. 安装
# 安装的方法很简单,就是使用 RPM 即可!不过,请先确认是否已经安装!
[root@test root]# rpm -qa | grep sasl
libsasl7-1.5.27-5mdk
cyrus-sasl-1.5.27-5mdk
libsasl7-devel-1.5.27-5mdk
libsasl7-plug-plain-1.5.27-5mdk
libsasl7-plug-login-1.5.27-5mdk

# 如果尚未安装该套件,请拿出你的光盘片, mount 光盘,然后找寻该档案,
# 直接安装他吧!不过要注意的是,上面的档案都要安装喔!因为我们使用的
# 是最基本的 plain 与 login 这两个机制,所以至少我们要安装上面五个咚咚!
[root@test root]# rpm -ivh cyrus-sasl-1.5.27-5mdk.i586.rpm
# 如果有发生属性相依的问题,请自行再将需要的档案自光盘当中找出,
# 然后加以安装吧!

2. 设定与启动
# 由于 Cyrus-sasl 在 Mandrake 当中是 1.5.27 版本,所以他能支持的项目有:
shadow : 使用 /etc/shadow 做为认证码;
pam  : 使用 pam 模块做为认证,这个需要在 /etc/pam.d 这个目录下新增
     一个名为 smtp 的档案,并配置文件案内容才行!
sasldb : 使用 SASL 的认证函式库,使用这个功能时,你必需要额外的
     指定 1.函式库的名称; 2.使用 saslpasswd 程序增加用户!
     鸟哥个人认为这个功能不太好用,因为每新增一个使用者需要主动的
     帮用户新增账号、密码到认证函式库中,不太方便!
     不过如果您还使用其他的服务器如 LDAP, MySQL 等等软件时,
     则这个功能可就大大的有帮助啦!因为他可以分享账号与密码吶!
pwcheck: 这个功能就不错啦! pwcheck 是一个服务(daemon),必需要在
     启动 postfix 之前就启动啦,因为 sasl 的认证就靠这个 daemon,
     基本上,他可以经由读取 /etc/shadow 的数据来提供 client 端
     认证的功能!目前我们 Mandrake 9.0 预设使用的是这个 daemon!
# 给他设定开机时启动 pwcheck 的功能吧!
[root@test root]# vi /etc/rc.d/rc.local
# 在这个档案当中最底下新增一行:
/usr/sbin/pwcheck
# 并且立刻执行这个 daemon 喔:
[root@test root]# /usr/sbin/pwcheck
[root@test root]# ps -aux | grep pwcheck
root   12602  0.0  0.5  1460  348 ?    S  02:59   0:00 /usr/sbin/pwcheck
# 看到没!要出现这个咚咚才算是有启动 pwcheck 喔!

# 在 Sendmail 当中,我们必需建立一个名为 Sendmail.conf 的档案,来告诉
# sasl 我们所需要的认证模式,那么在 postfix 当中也一样,我们必需要建立
# 一个文件名为smtpd.conf来告诉 sasl ,喝!我 postfix 要的认证方式为何!
# 所以你需要这样做:
[root@test root]# cd /usr/lib/sasl
[root@test sasl]# echo 'pwcheck_method: pwcheck'  >  smtpd.conf

# 上面这样做完之后,系统就知道了:
1. postfix 要用 SMTP 认证时会去读取 /usr/lib/sasl/smtpd.conf 并且知道
  是以 pwcheck 这支程序进行身份认证的动作;
2. 而 pwcheck 这支程序会主动去读取 /etc/shadow ,里面的密码做认证
# 到此为止,就已经设定好了 cyrus sasl 的部分啦!

 
安装 postfix
1. 安装
# 安装的方法很简单,就是使用 RPM 即可!不过,请先确认是否已经安装!
[root@test root]# rpm -qa | grep postfix
postfix-1.1.11-4mdk

# 如果尚未安装该套件,请拿出你的光盘片, mount 光盘,然后找寻该档案,
# 直接安装他吧!
[root@test root]# rpm -ivh postfix-1.1.11-4mdk.i586.rpm

# 这样就安装完毕啦!主机设定的部分请参考下一节喔!

 
安装 procmail
1. 安装
[root@test root]# rpm -qa | grep procmail
procmail-3.22-3mdk

2. 设定:
# 在设定方面,这主要与 procmail 有关而已,您可以下载 procmailrc 
# 并放置到 /etc/ 底下即可详细的数据请参考上一章简易 sendmail 之说明

 
安装 imap
1. 安装
[root@test root]# rpm -qa | grep imap
imap-2001a-9mdk
imap-devel-2001a-9mdk

2. 设定:
# 直接设定成为开机启动即可:
[root@test root]# chkconfig --add ipop3
[root@test root]# /etc/rc.d/init.d/xinetd restart
# 这样就已经可以收信件啦!

 
安装的地方当中,重点在于 Cyrus-SASL 的安装啦!由于我们需要有 SASL 的支持,所以必需要安装这个咚咚!并且也需要设定 smtpd.conf 这个档案!这样就已经差不多 OK 啦!接下来请继续参考主机设定的地方噜!
 
Red Hat 9 版本:
什么?!Red Hat 9 也同时提供 Postfix 啊?!没错的啦!呵呵!很高兴吧!所以说, Red Hat 9 不但提供了 sendmail 给我们使用,还额外提供了 Postfix 让我们可以随意的转换邮件服务器软件呢!不过,在 Red Hat 9 的 Cyrus-sasl 已经是 2.xx 版本了,而且还主动的提供兼容于 1.5.xx 版本的函式库呢!真是相当的棒啊!但是因为 Red Hat 9 提供的 Postfix 还是使用 1.xx 版,因此我们在 Red Hat 9 预设的 Postfix 邮件服务器中,还是使用 Cyrus SASL 1.5.xx 的函式库喔!所以也就无法使用 saslauthd 这个机制了!并且, Red Hat 9 并没有提供 pwcheck 这个程序,所以在 Red Hat 9 底下的 Cyrus SASL 认证机制就需要使用 sasldb 了!至于安装的方法最简单的方式就是以我们在 网络升级套件 那一章节提到的 APT 来进行安装即可!
 
1. 安装:
[root@test root]# apt-get install postfix
[root@test root]# apt-get install cyrus-sasl
[root@test root]# apt-get install procmail
 
很简单吧!这样就搞定了 Red Hat 9 的 Postfix 啰!(注意, Mandrake 与 Red Hat 不同版本所使用的 Cyrus SASL 机制并不相同喔!在 Mandrake 当中预设是 pwcheck 而在 Red Hat 则预设使用 sasldb 这个验证机制!并且,由于 Red Hat 9 在编译 postfix 的时候使用的是 SASL version 1 ,所以无法使用 saslauthd 这个好用的机制,鸟哥认为,您最好使用 Tarball 来安装您的 Postfix 在您的 Red Hat 9 上面喔!)
 

使用 Tarball 安装完整的 Postfix + POP3 + SMTP + Procmail (适用任何版本的 Linux 喔!)
 
以 Tarball 安装 Postfix 也不困难,比起 sendmail 来说,要简单的很多喔!我们这里选择的主要套件有: 至于 procmail 与 imap 两个套件都使用 Linux distribution 提供的 RPM 版本就好了,不需要额外的改装啊!那么底下就来谈一谈怎么安装吧!(注: Cyrus SASL 与 Cyrus SASL2 这两个不同版本的 SASL 函式库放置的目录并不相同,所以你可以分别安装 cyrus version 1 与 version 2 喔!在鸟哥的案例当中,还不会发生问题就是了!另外,如果您是 Red Hat 9 的使用者,由于 Red Hat 9 已经提供了 Cyrus SASL version 2 了,所以您可以直接略过 Cyrus SASL 的安装部分,直接到 Postfix 2.xx 的安装呢!)
 
安装 Cyrus SASL 2.xx 版本!
1. 首先将数据解压缩(假设您将我们网站的档案捉到 /root 底下了!)
[root@test root]# cd /usr/local/src
[root@test src]# tar -zxvf /root/cyrus-sasl-2.1.12.tar.gz
.....(略).....最后建立一个 cyrus-sasl-2.1.12 的目录

2. 再来就是设定你的 cyrus SASL 的参数以及编译啰!
[root@test src]# cd cyrus-sasl-2.1.12
[root@test cyrus-sasl-2.1.12]# ./configure   \
> --prefix=/usr/local/cyrus-sasl2 --enable-login --enable-plain \
> --enable-pwcheck --with-saslauthd=/var/run \
# 注意上面的语法!!那个 \ 是跳脱字符喔!后面直接 Enter !
# 不要接任何空白或者是 tab 按键!若有问题,请到 Shell 看看!
# 至于那个 pwcheck 的项目,就是要用来做为密码确认的一个咚咚啰!

[root@test cyrus-sasl-2.1.12]# make clean && make
[root@test cyrus-sasl-2.1.12]# make install
# 上面三个步骤会花去一些时间,请耐心等待~
# 而由于我们刚刚设定了 --prefix=/usr/local/cyrus-sasl2 这个参数,
# 所以, make install 之后,我们有用的函式库会在 
# /usr/local/cyrus-sasl2/lib/sasl2 这个路径当中,但是, cyrus 程序
# 会主动去找 /usr/lib/sasl2 这个目录!所以,我们必需要做连结档!
# 才可以让未来我们的 postfix 可以直接找的到我们所要的函式库喔!

[root@test cyrus-sasl-2.1.12]# cd /usr/lib
[root@test lib]# ln -s /usr/local/cyrus-sasl2/lib/* .
# 这样就建立起连结档啰!很简单吧! ^_^不过要注意喔,
# 上面这一行最后面那个小数点『.』不要忘记加了!

3. 准备建立 Postfix 与 cyrus SASL 使用的简易配置文件:
[root@test lib]# cd /usr/lib/sasl2
[root@test sasl2]# echo 'pwcheck_method: saslauthd' > smtpd.conf 
[root@test sasl2]# echo 'mech_list:plain login'  >>  smtpd.conf 
# 注意了!一般来说, Postfix 会使用 SASL 这个函式库里面相关的配置文件,
# /usr/lib/sasl2/smtpd.conf 这个档案的设定就是 Postfix 的预设使用 SASL 的
# 参数档案,与 1.5.xx 版本不太相同的地方是, 2.xx 版本使用不同的机制:
auxprop :使用 sasldb2 这个共享数据库,同样需要使用共享密码档案喔!
      所以一般来说,单纯的 Postfix 比较少使用这种机制;
saslauthd:使用 saslauthd 这个 daemon 进行认证的工作,所以几乎
      不需要其他的设定值哪,指定 saslauthd 就好啦! ^_^
pwcheck :使用与 1.5 版相似的认证 daemon ,不过在 2.xx 版本里面这个模式
      支持度比较没有这么好的啦,所以请爱用 saslauthd 啰!
# 我们使用 SASL 默认的 saslauthd 这支程序做为密码认证的 daemon。
# 至于 mech_list:plain login 是列出支持的认证机制的意思,我们使用的
# 是极为简单的 login 与 plain 两种机制而已!

4. 建立一些需要的参数:
[root@test sasl2]# vi /etc/man.config
# 新增底下这一行之后,未来我们就可以透过 man 这个工具来查询 sasl 
# 相关的指令的用法了!而不需要修改任何咚咚!不过要注意的是,
# 这个档案在每个 Linux distributions 当中不见得相同,例如 Open Linux 
# 檔名是 /etc/man.conf 呢!
MANPATH /usr/local/cyrus-sasl2/man

5. 检验 saslauthd 这支程序是否可行!
# 在 cyrus-sasl 的原始码里面提供了一支小程序用来判断 saslauthd 的认证机制
# 是否成功的启动了,这个小程序就是 testsaslauthd 啰!在刚刚原始码目录下,
# 所以你可以这样做:
[root@test sasl2]# /usr/local/cyrus-sasl2/sbin/saslauthd -a shadow
# 执行之后, saslauthd 的 PID 会被纪录到 /var/run/mux.pid 这个档案!
[root@test sasl2]# cd /usr/local/src/cyrus-sasl-2.1.12/saslauthd/
[root@test saslauthd]# make testsaslauthd
[root@test saslauthd]# ./testsaslauthd -u userID -p 'yours.passwd'
0: OK "Success."
# 若显示 OK 的话!那么就是成功啦!很好!我喜欢~

6. 设定开机时启动
[root @test saslauthd]# vi /etc/rc.d/rc.local
# 加入这一行:
/usr/local/cyrus-sasl2/sbin/saslauthd -a shadow

 
安装 Postfix 2.xx 版本!
0. 先确认有没有这个档案存在!因为我们的 Postfix 会使用到很多数据库啊!
[root@test root]# locate pcre.h | grep include
/usr/include/pcre.h
# 这个档案也有可能存在于 /usr/include/pcre/pcre.h 里面!不要担心,存在就好了
# 如果没有存在的话,例如 Mandrake 9.0 预设状态可能并不会主动安装这个套件,
# 请自行拿出原版光盘,安装 MDK 的 libpcre0xxxx 档案,至于 redhat 等
# 其他版本,请自行安装 pcre 相关的套件吧!在 Red Hat 9 则是需要
# pcre-devel 这个套件喔! ( apt-get install pcre-devel)

1. 首先将数据解压缩(假设您将我们网站的档案捉到 /root 底下了!)
[root@test root]# cd /usr/local/src
[root@test src]# tar -zxvf /root/postfix-2.0.4.tar.gz
.....(略).....最后建立一个 postfix-2.0.4 的目录

2. 清除规则并且建立新的使用 SMTP 的规则给 postfix
[root@test src]# cd /usr/local/src/postfix-2.0.4
[root@test postfix-2.0.4]# make tidy  # 清除规则
[root@test postfix-2.0.4]# make makefiles CCARGS="-DUSE_SASL_AUTH \
>  -I/usr/local/cyrus-sasl2/include/sasl/"  \
>  AUXLIBS="-L/usr/local/cyrus-sasl2/lib -lsasl2"
# 上面的动作在建立 Makefile 啰!其中那个 -CCARGS 后面接的 -DUSE_SASL_AUHT
# -I/usr/local/cyrus-sasl2/include/sasl 其中 -I 后面的路径就是 SASL2 的
# 函式库所在的目录喔!请依照您安装的 sasl2 目录所在而定!
[root@test postfix-2.0.4]# make
# 就是开始编译啦!过程有点久喔!如果有出现任何 Error 时,
# 请将 error 仔细的查看一下吧!通常最大的原因都是一些
# include 档案没有安装,也就是某些重要的套件没有安装之故,
# 例如 pcre.h 这个档案就是一个例子啰!
# 解决的方法就是将该缺乏的套件安装进去系统啦!
# 如果是 Red Hat 9 的话,可以这样下达指令:
# make makefiles CCARGS="-DUSE_SASL_AUTH -I/usr/include/sasl" \
# AUXLIBS="-L/usr/lib/sasl2 -lsasl2"
# 因为 Red Hat 9 的 SASL2 路径在 /usr/include/sasl ,这里要特别的强调,
# 否则由于 Red Hed 9 同时提供 Cyrus SASL 1.5.x 以及 2.x.x 的版本,
# 可能会造成程序的误判,那么很可能会出现下列的错误喔:
# fatal: SASL per-connection security setup 
# 上面的错误讯息出现在 /var/log/maillog 中!

3. 安装前准备工作:
# 如果您的系统是由 sendmail 要改换到 Postfix 的话,你不需要移除 sendmail ,
# 不过却需要进行一些小手术喔!
[root@test postfix-2.0.4]# mv /usr/sbin/sendmail /usr/sbin/sendmail.OFF
[root@test postfix-2.0.4]# mv /usr/bin/newaliases /usr/bin/newaliases.OFF
[root@test postfix-2.0.4]# mv /usr/bin/mailq /usr/bin/mailq.OFF
[root@test postfix-2.0.4]# chmod 755 /usr/sbin/sendmail.OFF \
/usr/bin/newaliases.OFF /usr/bin/mailq.OFF

# 此外,还需要建立一个名为 postdrop 的群组与 postfix 的使用者喔!
[root@test postfix-2.0.4]# groupadd -r postdrop
[root@test postfix-2.0.4]# useradd -r -s /bin/false postfix
# 建立一个系统数据账号吶!
[root@test postfix-2.0.4]# echo 'postfix:  root' >> /etc/aliases
# 请注意,如果您之前安装过 sendmail 的话,那么不同版本的 sendmail 他的
aliases 放置的目录并不相同,所以上面这行指令请依您的主机来设定!

4. 开始安装 Postfix 到 /etc/postfix 这个目录下:
[root@test postfix-2.0.4]# make install
# 底下会出现一大堆的问题集,不管如何,几乎按下 enter 就对啦!
# 除了底下这两个问题(最后两个)可以选择将 readme 档案存下来喔!
Please specify the destination directory for the Postfix sample
configuration files.
sample_directory: [/etc/postfix] /etc/postfix/sample

Please specify the destination directory for the Postfix README
files. Specify "no" if you do not want to install these files.
readme_directory: [no] /etc/postfix/readme_files

# 这样就安装成功啦!接下来请开始查阅 主机的设定 那一节啰!

 

大标题的图示主机的设定
    安装完毕 postfix 之后,接着下来就是设定了!同样的,在设定主机之前,有几个东西是您必需先取得的喔:
     
    1. 具有合法的 hostname ,或者是经过授权的 DNS 主机来设定您自己的主机名(hostname);
    2. 您的 hostname 最好拥有一个 MX 的纪录(record);
    3. 至少一定要了解到什么是 Relay 的问题,以及规划一下您所想要开放 relay 的网域;
     
    你至少需要有这些数据才行吶!好了,我先假设一下我的案例好了:
     
    1. 我的 hostname 为 vbird.adsldns.org;
    2. 我的 hostname 还有个别名为 www.vbird.adsldns.org ,也就是说, vbird.adsldns.org 与 www.vbird.adsldns.org 都指向同一个 IP ;
    3. 我的 domain name 为 adsldns.org ;
    4. 我预计开放的 relay 网域为 vbird.org 这个网域,与内部的 192.168.1.0/24 这个网域,还要可以使用 access 这个档案的设定功能!
     
    开始来了解 postfix 啰! ^_^
     

    Postfix 的结构
     
    在主机的设定之前我们得先了解一下 postfix 的整体构造,以方便以后来处理我们的档案吶!所以底下我们会先针对 postfix 这个套件的结构做个简单的说明,然后再针对各个设定项目来进行说明啰!Postfix 的配置文件几乎完全都在 /etc/postfix 里面,至于执行档则在 /usr/sbin 里面,我们分别来谈一谈几个主要的注意事项吧!
     
    • 配置文件Postfix 的配置文件都在 /etc/postfix 里面,主要的配置文件有:
     
      • /etc/postfix/main.cf :这个就是最重要的 postfix 的配置文件了!等一下我们谈到的设定都在这个档案里面进行修改的动作!基本上,他本身就是一个简单的说明文件档啦!不过,要注意的是,在你修改完成了 main.cf 之后,请记得『一定要重新 reload 或重新 restart postfix 才行!』
       
      • /etc/postfix/master.cf:这个档案是另外一个重要的 postfix 配置文件!他主要是规定了 postfix 每个程序的运作参数!
       
      • /etc/postfix/access :这个档案与 sendmail 的 access 是相同的!都是用来做为 relay 或者是 deny 某些 IP 与 hostname 的档案!不过,要启用他还是得要修改 main.cf 才行!
       
      • /etc/postfix/aliases : 这个档案与 sendmail 的 aliases 也是相同的!同样的可以做为别名之用,所以您可以回头去翻一翻这个档案的用法喔!
       
      • /etc/postfix/pcre_table regexp_table relocated : 这几个档案可以做为邮件的过滤之用喔!可以使用正规表示法来进行邮件过滤(filter)的规则,呵呵!会使用这几个档案,或许连 procmail 也不需要使用了呢! ^_^
       
    • 执行档:Postfix 的执行档可不少啊!约略提几个主要的执行档吧!

    •  
      • /usr/sbin/postfix:这就是 postfix 的主要执行档案啦!启动与简单的关闭 postfix 可以使用:
        • postfix check :检查 postfix 相关的档案、权限等是否正确!
          postfix start :开始 postfix 的执行
          postfix stop  :关闭 postfix
          postfix flush :强制将目前正在邮件队列的邮件寄出!
          postfix reload:重新读入配置文件,也就是 /etc/postfix/main.cf
        要注意的是,每次更动了 /etc/postfix/main.cf 之后,一定需要执行 postfix reload 喔!
         
      • /usr/sbin/postalias:这个指令是 sendmail 的 newaliases 啦!他可以用来将上面提到的配置文件  aliases 制作成为 postfix 看的懂得『数据库』格式化档案!由于一般来说,我们都是使用 hash 这一种数据格式,所以啰,你可以简单的使用底下的指令方式来格式化。
        • postalias 数据库格式:檔名
          postalias hash:/etc/postfix/aliases  ==>自动建立 /etc/postfix/aliases.db 这个数据库档案!
           
      • /usr/sbin/postcat :这个指令可以用来观察某个邮件队列里面档案的信息!postfix 的邮件队列放置在 /var/spool/postfix 里面,但是这个目录里面的文件格式是 postfix 看的懂得,我们人类看不懂~为了取得这些在邮件队列里面的档案信息,所以我们得使用 postcat 这个指令来读取出信息喔!假如有个档案放在 /var/spool/postfix/deferred,你可以这样看:
        • postcat /var/spool/postfix/deferred/filename
           
      • /usr/sbin/postconf :可以用来读取 main.cf 这个档案里面的设定数据的一个指令!用途多多啊!简单的来说,可以直接将你的 main.cf 里面的设定分门别类的显示给你看,可以帮助除错 (debug) 啦!不错的工具,鸟哥个人蛮喜欢加入 -n 这个参数来了解目前的主要规范文件放置在那个目录下!
        • postconf -n
        显示的结果为:
          alias_database = hash:/etc/postfix/aliases
          alias_maps = hash:/etc/postfix/aliases
          command_directory = /usr/sbin
          config_directory = /etc/postfix
          daemon_directory = /usr/lib/postfix
          debug_peer_level = 2
          .......
        看到了吧!你想要知道的数据立刻一目了然,可以加快你的除错喔!不必每次都要进入 main.cf 里面找好久呢!
       
      • /usr/sbin/postmap:怪怪!这个指令的用法跟上面提到的 postalias 几乎完全一模一样啊! ^_^不过,他是用来取代 sendmail 的 makemap 的!用法是:
        • postmap hash:/etc/postfix/access ==>自动建立 /etc/postfix/access.db 这个数据库档案!
       
      • /usr/sbin/postqueue :这个是在观察邮件队列的一个指令啦!你可以使用 postqueue -p 来显示目前的邮件队列内容!这个:
        • postqueue -p 与 mailq 显示的内容会一模一样喔!
           
    • 目录:同样的具有邮件队列与邮件信箱的放置目录啊!

    •  
      • /var/spool/mail :电子邮件信箱放置目录
      • /var/spool/postfix :邮件队列,里面还有很多次目录,都是一些其他功能的咚咚啊!
     
    整体的架构大致是如此,好啦!了解的一定程度的架构之后,我们要开始来谈谈主机的最基础设定了吧!
     

    基础设定
     
    终于要来搞定我们的配置文件 /etc/postfix/main.cf 啦!先来搞定比较简单的几个部分喔!在 Postfix 安装完毕之初,他仅支持本机寄信而已,如果您想要开放外送邮件,那就必需要做一些手术啦!底下几个重要的项目先来观察一下啰!(注:请使用 vi 来编辑喔!)
     
    在 main.cf 这个档案当中,设定的项目都是以类似变量的设定方法来设定的,例如要设定 postfix 主机名时,就以:
    myhostname = vbird.adsldns.org
    这样的方式来设定的,那么什么是『变量』呢?如果还不清楚,赶紧拿出『鸟哥的 Linux 私房菜 -- 基础学习篇』翻到『认识 BASH 』的章节,好好的瞧一瞧去吧!尤其变量的内容显示需要用 $ 来领头的用法,千万不可忘记!例如:
    myorigin = $myhostname  ==> myorigin = vbird.adsldns.org
    上面两个是一模一样的,只是藉由变量来让我们的设定更加的简单化!不过,与变量设定规则当中比较不同的,在 main.cf 当中的等号两边需要有空白!此外,如果有两个以上的设定呢?那你就必须要逗号『,』或者是空格符『 』来做为分隔了!例如:
    mydestination = $myhostname, $mydomain 
    mydestination = $myhostname $mydomain 
    在底下的设定当中请特别留意这些设定喔!
     
    • 主机名的设定:myhostname 与 mydomain (极重要)

    • 这个设定蛮重要的喔!就是在设定你的主机名啰!请特别留意,这个『 myhostname 』的变数在 main.cf 配置文件的后面会持续的被使用到,所以,不要写错了!至于 mydomain 则是你的网域啦!以鸟哥的 linux.vbird.org 为例,我的主机名为 linux.vbird.org (用 FQDN 的方式来写),此时,我的 domain 就是 vbird.org 啦!在本章的例子当中,主机名为 vbird.adsldns.org 域名为 adsldns.org ,所以你要这样设定:
      myhostname = vbird.adsldns.org   <==这里请书写你的主机名喔!
      mydomain = adsldns.org      <==这里则是你的 domain 名称!
       
    • 送件来源的主机名:myorigin

    • 这个项目在设定『邮件头上面的 mail from 的那个地址』!当我们在本机端使用 mail 这个程序发送信件时,由于没有定义送件者的地址,一般而言, 邮件主机会以目前的主机名做为邮件的 FROM 的那个主机名。例如在我的 postfix 上面使用 mail 发送信件时,在发送的邮件当中,就会显示发信人为 vbird@vbird.adsldns.org 的意思啦!不过,我也可以自行指定来源主机的名称,就是在这个 myorigin 设定的!通常,使用 $myhostname 来设定 myorigin 即可,不过,在某些大型主机当中,由于这个大型网域内可能有多部的邮件主机,在此时可指定 myorigin 为 $mydomain ,不过,如此一来还得替每个 user 指定其他相关的参数!所以,如果没有其他要求的话,这个地方设定为底下的样子即可:
      myorigin = $myhostname
       
    • 可用来收件的主机名:mydestination (极重要)

    • 这个项目可就重要的太多太多了!这个项目就是 sendmail 当中的 /etc/mail/local-host-names 相同的意义啦!你的 postfix 只有在发现 mydestination 这个项目中有写入的主机名做为收信主机时,才会将该封信件收下来!例如,当你的主机名有 vbird.adsldns.org 与 www.vbird.adsldns.org ,这两个主机名均指向同一部主机,那么只有在你将这两个名称都写入 mydestination 项目中,那么两个主机的来信才可以被接受,否则就会被退回喔!这个项目有多种设定方法,最简单的就是直接写入档案中,另外,也可以设定的跟 sendmail 一样,用外部的档案来取代喔!
      方法一:利用变量的型态
      mydestination = $myhostname, www.$myhostname

      方法二:直接给他写入名称
      mydestination = vbird.adsldns.org, www.vbird.adsldns.org

      方法三:使用档案型态
      mydestination = /etc/postfix/local-host-names
      上面的名称可以随便你取喔!然后在该档案内设定
      [root@test root]# vi /etc/postfix/local-host-names
      vbird.adsldns.org,
      www.vbird.adsldns.org

      一般来说,除非您对于 local-host-names 这个文件名情有独钟,否则的话,鸟哥个人建议您直接在 mail.cf 里面直接设定好你的可接受的主机名即可!特别留意的是,如果你的 DNS 里头的设定有 MX 的话,那么请将 MX 指向的那个主机名一定要写在这个 mydestination 内!否则很容易出现错误讯息喔!特别的给他注意这一点!『一般来说,使用者最常发生错误的地方就在这个设定里头呢!需要搭配你的 DNS 设定喔!
       
    • 简易的 Relay 控制:inet_interfaces mynetworks_style mynetworks relay_domains (极重要)

    • 这个项目在控制谁可以利用我们的主机来寄信呢?也就是在 sendmail 里面的 access 那个档案的咚咚啦!分别说明一下几个东西啰!
       
      • inet_interfaces:你的 Postfix 主机能被用来使用的接口,假如你的 Linux 主机有多个接口,例如多张网络卡或者是拨接之后又会产生的 ppp0 这些接口时,如果你不想要全部的接口都开放 postfix 功能,那么就可以在这里指定能用的接口啰 (注:指定的方式是以主机名为主喔!) 一般默认只有自己的内部循环网络可以使用 (localhost) ,不过,如果要连上 Internet 的话,建议就要全部都开放啦! inet_interfaces = all
       
      • mynetworks_style:这是用来设定你所想要的 relay 的信任(trust)网域型态!一般来说,有三种主要的型态,分别是:
       
        • class :表示为 A/B/C 三种 class 其中之一,在拨接或者是 ADSL 的情况下,这种型态设定并不好!因为他会主动的去找你目前的 IP 所在的网域来进行 relay 的功能开放!举个例子来说,如果你是以中华电信的 ADSL 拨接情况,那么你的 IP 很可能会是 61.59.xxx.yyy ,那如果你设定为 A class 的话 ( postfix 会自动的判断,请至"网络基础"一文当中查看 A/B/C 三个 class 的说明 ) ,那么只要是 61 开头的 IP 都可以用你的 postfix 喔!很严重吧!这个设定通常只给内部私有网域来使用的啰!
         
        • subnet:这是 postfix 的默认值,使用 subnet 的型态来设定喔!意义是说,你的网络卡 IP 所在网域的任何一个 IP 都会被接受的意思!例如我的主机网卡私有 IP 为 192.168.1.2 那么所有我内部网域连接到这个网卡的 192.168.1.0/24 这个网域的所有 IP 都会被认为是『合法的』!而自动的提供其 Relay 的功能呢!
         
        • host :在这个设定时, postfix 仅会知道 localhost 设定为 trust (信任) 的网域而已!
         
        基本上,这个设定值你可以指定为 mynetworks_style = subnet ,不过,也可以不要设定啦!直接以底下 mynetworks 来设定 relay 的网域即可!另外,如果您有设定 mynetworks_style 以及 mynetwork 时,那么 mynetworks 这个设定会取代掉 mynetworks_style 喔!因为如此,所以鸟哥个人是不设定 mynetworks_style 的,只设定 mynetworks 而已!
         
      • mynetworks :这个也是用来开放 Relay domain 的一个设定项目!一般来说,也可以设定成很多的方式,包括档案与变量或直接书写需要的 IP/netmask 类型!这里我们假设有 192.168.1.0/24, 127.0.0.0/8 以及 192.168.1.100 这几个咚咚要开放,所以我可以这样写:『mynetworks = 192.168.1.0/24, 127.0.0.0/8, 192.168.1.100/32』!如此一来,连 access 都不需要设定呢! ^_^ ( 注:请注意,如果你没有设定 mynetworks 的话,一定要将 mynetworks_style 设定为 host 喔!不然你的 IP 所在的子域的 IP 会被自动的认为是『合法的』呢!)另外,如果你想要启用 /etc/postfix/access 这个档案的设定功能时,那就必需要再加以修改喔!例如:『mynetworks = 127.0.0.0/8, hash:/etc/postfix/access 』注意文件名使用完整档名!
       
      • relay_domains:相对于 mynetworks 设定的专门针对『来源』的 IP 来设定,那么如果是以主机名,或者是领域名( domain )时,要如何设定呢?那就可以使用这个项目来设定啦! mynetworks 设定『信任网域的来源 IP 』而 relay_domains 则可以设定『信任网域的来源与目标之主机或领域名』啦!举个例子来说,如果你的主机要开放 vbird.org 这个网域的主机的 Relay 功能,那么你将 vbird.org 写入 relay_domains 当中时,那么:
       
        1. 任何由 vbird.org 来的信件都会被认为是『信任』的,所以 postfix 主机会自动帮忙 relay ;
        2. 由任何地方来的信件,"并且"要往 vbird.org 这个网域去的信件,postfix 主机也会帮忙 Relay 的!
         
        所以说,这个 relay_domains 可以设定『来源』与『目标』的主机或领域名喔!一般来说,relay_domains 默认就是我们自己的主机啦!!
       
      上面的设定项目当中,我们可以仅设定两个即可啦!其他的不用管也没有关系!不过,由于我预设还有启动 vbird.org 这个 relay domain ,所以说,整体架设如下:
      inet_interfaces = all
      mynetworks = 192.168.1.0/24, 127.0.0.0/8, 192.168.1.100/32, 
             hash:/etc/postfix/access
      relay_domains = vbird.org

      设定完成之后还需要启动 access 喔!
      1. 先手动修改完任何你想要的动作在 /etc/postfix/access 当中;
      2. 完成数据库的建置:
      [root@test root]# postmap hash:/etc/postfix/access

       
    • 设定帐户别名的数据库:aliases_maps (极重要)

    • 还记得 aliases 这个帐户别名的用途吧?!如果你是以 RPM 的方式来安装 Postfix ,那么这个设定值是没有问题的,但是,如果你是以 Tarball 来安装你的系统时,并且是由 sendmail 升级的,那么由于 sendmail 将 aliases 放置在 /etc/aliases (要视你的 Linux 版本而定!),不过,比较好的作法是将 aliases 放置在 /etc/postfix/aliases 里面,这样设定与目录之间的关系比较容易找啦!那要如何修改呢?首先,你可以将旧有的 aliases 移动到 /etc/postfix/aliases 里面,并且请特别注意,这个旧有的档案里面,一定要存在有『 postfix: root 』这一个设定才行喔!然后透过 /etc/postfix/main.cf 里面的 alias_maps 来修改,通常鸟哥个人喜欢改成这样:
      alias_maps = hash:/etc/postfix/aliases
      alias_database = hash:/etc/postfix/aliases
      改完之后还需要以 postalias 来建置成为 postfix 可以读取的数据库格式喔!
      [root@test root]# postalias hash:/etc/postfix/aliases
       
    呵呵!设定完上面这几个重要的项目之后,基本上,你的 postfix 主机『已经准备好上路啦!』所以,这个时候请将他启动吧!或者是重新启动他吧!
     
    先确认配置文件有没有错误:
    [root@test root]# postfix check  <==检查错误,若没有任何显示,表示正确

    如果是 RPM 安装的情况:
    [root@test root]# /etc/rc.d/init.d/postfix restart

    如果是 Tarball 安装的情况:
    [root@test root]# postfix start

    检查是否正确的启动了呢?
    [root@test root]# netstat -tl | grep smtp
    tcp        0      0 *:smtp                  *:*                     LISTEN

    设定开机的时候立刻启动:
    [root@test root]# chkconfig --add postfix <== RPM 安装时
    [root@test root]# vi /etc/rc.d/rc.local   <== Tarball 安装时
    加入下面这行:
    /usr/sbin/postfix start

     
    当出现上面的那行斜体字显示的内容 ( LISTEN ) 时,哈哈!你的 postfix 已经启动啦!这个时候 postfix 已经可以:
     
    1. 针对 mynetworks 设定的 Client 端,进行 relay 的动作;
    2. 针对信件目的为 mydestination 设定的主机名『接收该信件』!
     
    虽然你是使用 Tarball 方式安装 Postfix 的,但是如果你想要使用 /etc/rc.d/init.d/postfix restart 的语法来启动的话,鸟哥已经写了一支简单的 scripts 提供大家这样进行工作呢!可以 前往下载(http://linux.vbird.org/download/index.php#sendmail_postfix) 喔!
     

    重要观念:Postfix 默认的 Relay 流程与收受信件流程:
     
    在预设的情况下 ( 也就是说,在没有开放 SMTP 这个邮件认证时! ) Postfix 对于收信与寄信的流程是如何呢?!这里我们得分别来谈一谈几个主要的设定项目与邮件传输的动作喔!
     
    • 帮助 Client 发送信件,也就是 Relay 的功能开放的需求项目:在开放哪些项目之后,你的 postfix 主机才会帮助『信任』的 Client 端 Relay 呢?
      1. 当 Client 来自信任的网域,也就是 IP 符合 $mynetworks 的设定值时;
      2. 当 Client 来自信任的机器,也就是主机名符合 $relay_domains 的设定项目时;
      3. 当 Client 来自不信任的网域,但是去的目的地主机端符合 $relay_domains 的设定时。
      当符合上面三点的任何一点时,那么 postfix 将对该信件进行 relay 的动作喔!
       
    • 收信程序:在哪些情况之下,我们的 postfix 会将该封信件收下来呢?
      1. 收件者主机名符合 $inet_interfaces 的设定;
      2. 收件者主机名符合 $mydestination 的设定;
      3. 收件者主机名符合 $virtual_maps 的设定。
      符合上面三点的任何一项时,那么该封信件就会被我们的 postfix 收下来!所以,如果你的 postfix 能寄不能收,或者是能收不能寄,请仔细的观察一下上面的几个重大的设定项目,仔细的在你的 main.cf 重新设定一下,基本上,应该就不会有太大的问题啦!
     

    启动 smtp 邮件认证功能
     
    谈完了 Relay 的功能之后,接下来自然就是重要的『SMTP』邮件认证的部分了!目前邮件认证的功能有相当多种类,请特别留意的是,鸟哥这里使用的是 SASL 释出的 pwcheck 与 saslauthd 这两个 daemons 提供的功能喔!这两个功能分别在 cyrus-sasl 1.5.xx(pwcheck) 里头与 2.xx(saslauthd) 里头设定的啦!但是 Red Hat 9 使用的是 saslauthd 喔!请回到前面的 Postfix 安装里面瞧一瞧 RPM 的 1.5.xxTarball 的 2.xx 好吗!你要作的动作有:
     
    1. 确定 cyrus-sasl 已经安装,并且同时必须要安装 libsasl 相关的 LOGIN 及 PLAIN 的函式库(这个在前面 Postfix 套件安装 当中已经说明了,分别参考 Tarball 与 RPM 的安装,请前往参考);
    2. 确定在 sasl 函式库内已经存在有 smtpd.conf 这个档案 (注意,cyrus-sasl 第一版函式库在 /usr/lib/sasl 而第二版则在 /usr/lib/sasl2 ,目录并不相同,请仔细察看一下您的 sasl 喔! ),这个档案的内容在 Postfix 套件安装里面已经说明了!并且 sasl 与 sasl2 设定并不相同,请自行参考;
    3. 确定已经使用 pwcheck(cyrus-sasl 1.5.xx) 或 saslauthd(cyrus-sasl 2.xx) 这两个 daemon 了,并且已经成功的启动 daemon 了!可以使用『ps -aux | grep pwcheck 』或『ps -aux | grep saslauthd 』察看是否有 process 存在;
    4. 修改 /etc/postfix/main.cf 这个档案的设定 (请参考底下的说明);
    5. 重新启动 postfix 。
     
    基本上,大部分的内容我们在安装的时候已经搞定啦,就剩下需要设定 main.cf 这个档案而已,那么有哪些数据必须要设定的呢?
     
    针对主机设定:
    • smtpd_sasl_auth_enable:『确定是否要针对 Client 启动 sasl 的认证呢?』预设是不启用,这里我们必须要将他给启用才行啊!所以要『smtpd_sasl_auth_enable = yes
     
    • smtpd_sasl_local_domain:『确认已经经过认证的网域』,就是不需要身份认证也可以是『信任』的网域啰,在 1.5.xx 版的 cyrus 可以直接填写为 $myhostname 啦!不过,在 2.xx 版本时,就不能设定了!很重要喔!
     
    • smtpd_recipient_restrictions:『信件收件的限制规则』,既然已经启动了 sasl 的邮件认证,此时必须要规定一下,到底在什么条件之下,我们的 postfix 可以接受 Client 端的 Relay 的功能呢?主要有底下这几种限制的规则:
      • permit_mynetworks:在 mynetworks 这个项目设定的网域 IP 都可以被允许联机喔;
      • permit_authenticated:允许使用者经过 SASL 的认证方式寄信!
      • check_relay_domains:通过一些测试之后的主机可以进行 relay ,与刚刚前几节的 relay_domains 有点关系!不过,在 2.xx 版本下,需要变成底下的项目了!
      • reject_unauth_destination:这是在 2.xx 版本时的设定项目,取代了 check_relay_domains 的设定项目啰!
      通常我们会设定上面这三个就差不多啦!
       
    • smtpd_client_restrictions:『针对 client 端的限制规则』,经过 mynetworks 这个信任网域的 IP 之后,那未经信任的 Client端 IP 来源你要限制他使用你的 postfix 时,这个项目就要启动 permit_sasl_authenticated 啰!
     
    • smtpd_sasl_security_options:『限制某些登入的方式』,在 Postfix 里面,预设是使用 Plaintext 的方式来认证的,所以自然不能取消掉这个认证啰(noplaintext)!但是我们可以取消掉匿名登录的型态喔(noanonymous)!可以这样做『smtpd_sasl_security_options = noanonymous
     
    针对 Client 设定:
    • smtp_sasl_auth_enable:上面是针对主机来设定的,这个项目则是针对 Client 来设定的,在预设的情况之下, Postfix 并不会对 client 提供认证的功能,也就是说, postfix 只会依据 mynetworks 之类的信任网域来提供 Relay 的功能,那么我们要启动对于 client 的身份认证功能时,这里就必需要设定为 yes 才行!不过,如果是在 2.xx 版本时,这个设定就不需要啦!
     
    所以整个设定值就变成这样啦:
     
    [root@test root]# vi /etc/postfix/main.cf
    1.5.xx 版本的 Cyrus SASL
    底下请自行新增在这个档案的最后面:
    smtpd_sasl_auth_enable = yes
    smtpd_sasl_local_domain = $myhostname
    smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, 
         check_relay_domains
    smtpd_client_restrictions = permit_sasl_authenticated
    smtpd_sasl_security_options = noanonymous
    smtp_sasl_auth_enable = yes

    2.xx 版本的 Cyrus SASL
    底下请自行新增在这个档案的最后面:
    smtpd_sasl_auth_enable = yes
    smtpd_sasl_local_domain = ' '
    smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated,
         reject_unauth_destination
    smtpd_client_restrictions = permit_sasl_authenticated
    smtpd_sasl_security_options = noanonymous
    注:有网友来信告知,在 smtpd_sasl_local_domain 的部分,也可以修改成:
    smtpd_sasl_local_domain=
    即可!

     
    另外,由于 RPM 版本的 Postfix 预设会使用 chroot jail 这个比较安全的动作,所以,如果是 RPM 安装时,你还必需要修改一个档案:
     
    [root@test root]# vi /etc/postfix/master.cf
    找到底下的这一行:
    smtp    inet    n       -       y       -       -       smtpd
    将他改成为:
    smtp    inet    n       -       n       -       -       smtpd
     
    注:chroot jail 的功能在于『权限较低的一般身份使用者来进行 postfix 的工作程序,只有在需要的时候才可以进入 /var/spool/postfix 这个邮件队列目录!』,对于系统来说,是有一定程度的安全保障的!所以, Postfix 才会在预设的情况之下以 chroot 的功能来进行 postfix 的!不过,再加上了 SMTP 这个认证机制之后,由于他必需要以比较高等级的用户来执行一些认证个功能,所以除非您额外的加入很多的函式库去到 chroot jail 目录下,否则的话,就不能使用 chroot 啦!所以,如果要启动 SMTP 的话,请务必将 master.cf 这个档案修改过喔! ^_^
     
    这样就算设定完毕啦!然后重新启动 postfix 看看情况是如何:
     
    [root@test root]# /etc/rc.d/init.d/postfix restart
    [root@test root]# telnet localhost 25
    Trying 127.0.0.1...
    Connected to localhost (127.0.0.1).
    Escape character is '^]'.
    220 vbird.adsldns.org ESMTP Postfix (1.1.11) (Mandrake Linux)
    ehlo localhost   <==确认一下你的主机状态
    250-vbird.adsldns.org
    250-PIPELINING
    250-SIZE 10240000
    250-VRFY
    250-ETRN
    250-AUTH PLAIN LOGIN  <==出现这个就是成功啰!
    250-XVERP
    250 8BITMIME
    quit  <==离开吧!
    221 Bye
    Connection closed by foreign host.
     
    然后确定一下你的机器是否真的有在进行认证的工作呢?首先,先取得你的密码,然后再以密码来测试看看认证是否可以通过!举例来说,假如我有一个使用者 test ,test 的密码为 abc 的时候,那么你可以这样做:
     
    [root@test root]# printf 'test\0test\0abc' | mmencode
    dGVzdAB0ZXN0AGFiYw==   <==这个东西就是你的密码啦!
    [root @test root]# telnet localhost 25
    telnet localhost 25
    Trying 127.0.0.1...
    Connected to localhost.
    Escape character is '^]'.
    220 vbird.adsldns.org ESMTP Postfix
    ehlo localhost   <==先打招呼
    250-vbird.adsldns.org
    250-PIPELINING
    250-SIZE 10240000
    250-VRFY
    250-ETRN
    250-AUTH LOGIN PLAIN
    250-XVERP
    250 8BITMIME
    auth plain dGVzdAB0ZXN0AGFiYw==
    235 Authentication successful  <==若出现这一行表示你的 SMTP 已经运作正常
    quit
     

    几个相关的档案说明
     
    在 sendmail 当中有几个颇为重要的档案,例如 ~/.forward 等等的档案!在这里我们也必需说明一下这几个档案在 postfix 里面的应用情况:
     
    • /etc/mail/local-host-names:这个档案是用来书写你的 mail server 可以接收『目的 e-mail server』的名称的一个档案,这在先前的设定项目中已经提过了,就是 /etc/postfix/main.cf 里面的 mydestination 的设定内容啦!
     
    • /etc/mail/access :这个档案用来规定可以 Relay 或者需要 discard 的动作!在 postfix 当中预设是不开启这个档案的设定的,如果要启用的话,需要在 mynetworks 里面规定好文件名喔!设定方法请参考前几节的说明!
     
    • ~/.forward :这个档案在 sendmail 与 postfix 当中的设定是一模一样的,都是用来帮忙邮件的转递的,可以参考 sendmail 的设定项目!
     
    • /usr/sbin/mailq:这个执行档已经被更改过了!目前可以使用 postqueue -p 来显示出还在邮件队列的信件标题喔!
     
    基本上,在 sendmail 当中可以使用的外部配置文件案,在 postfix 底下几乎都能再被使用!所以,由 sendmail 升级到 postfix 真是相当的简便啊! ^_^

大标题的图示客户端的使用说明
所有在 sendmail 当中需要注意的与可以使用的 Client 端的功能,在 postfix 当中都同样的可以使用喔!所以,这部份请回到『sendmail 服务器』那一章去瞧一瞧怎么使用 client 来进行 Mail server 的种种工作吶!其中,需要特别强调的有几个小细节:
  • 如果您有启动 SMTP 的认证时,请千万注意在 client 端的 MUA 必需要启动『我的寄件人需要密码』的项目,详情请参考 sendmail 的设定一文;
  • 在 sendmail 当中,不论 port 25 有没有启动, Linux 本机上面使用 mail 寄信,『还是可以』将信传送出去,不过在 postfix 可不是这么回事了!你若没有启动 port 25 时,那么使用 mail 将会把信暂时的放置邮件队列当中 (/var/spool/postfix) ,直到再次开启 port 25 之后,信件才有可能再次的备传送出去喔!

大标题的图示关于邮件主机安全的设定
    关于邮件主机的安全性方面,我们已经启动了 SMTP 了,那么还有 Open Relay 主机的抵挡,以及 Procmail 的规则要规定呢!关于原理部分我们就不再提了,有兴趣的回到上一篇去瞧一瞧,这里仅介绍作法喔!
     

    关于 Open Relay Data Base
     
    启动 ORDB 的功能只要:
     
    1. 设定 /etc/postfix/main.cf
    2. 重载 postfix
     
    就可以啦!我们可以这样做:
     
    [root@test root]# vi /etc/postfix/main.cf
    smtpd_client_restrictions = hash:/etc/postfix/access, 
         reject_rbl_client   relays.ordb.org,
         reject_rhsbl_client dsn.rfc-ignorant.org
    # 还记得 main.cf 的语法喔!呵呵!上面说的是,我们可以利用/etc/postfix/access
    # 以及relays.ordb.org 以及 dsn.rfc-ignorant.org 等机制来抵挡黑名单主机之意
    # 不过,如果您使用的是旧的 postfix 版本(1.5.xx),那么可能您的设定需要改为
    maps_rbl_domains = relays.ordb.org
    smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated,
         reject_unauth_destination, reject_maps_rbl
     
    [root@test root]# /etc/rc.d/init.d/postfix reload
     
    还有更多的 Open Relay 的机制可以参考这个网页喔:
    http://jimsun.linxnet.com/misc/postfix-anti-UCE.txt
     

    关于 Procmail 用法
     
    在 Postfix 当中启用 procmail 真是太简单啦!同样的设定只要一行就够了!
     
    [root@test root]# vi /etc/postfix/main.cf
    mailbox_command = /usr/bin/procmail

    [root@test root]# /etc/rc.d/init.d/postfix reload

     
    就是这么简单!至于 procmailrc 这个档案,请参考 sendmail 的简易设定一文喔!不过,事实上,使用 Procmail 在 Postfix 上面属于额外新增一项功能的设定,其实我们可以使用 Postfix 默认的邮件过滤功能即可,那就是使用信件的 header 与 body 过滤机制来达成啰!至于作法我们在底下进行介绍啰!
     

    关于邮件过滤的规则设定
     
    相信您如果架设过邮件主机的话,一定有曾经 (1)被广告信件轰炸与 (2)被莫名的病毒信件攻击的窘境发生过~真的是很讨厌!我们一般的作法有可能是利用额外的 Procmail 来进行邮件的分析与过滤,这是一个不错的选择啦!不过,由于使用 Procmail 时,他是另外一支程序,所以可能会造成程序与登录文件属性不合的问题发生呢!那怎么办呢?呵呵!其实在 Postfix 里面他原本就预设了两个邮件过滤的机制了,分别是标头( Header )与内容( Body )这两部份的过滤机制喔!
     
    先来说明一下,什么是 Header 与 Body 呢?最简单的想法你可以这样想:在你接到的一封信中,这封信主要分为底下这两部份:
     
    • 信封上面的信息 ( Header ):这包含了发件人、收件者、地址、与信件标题等等!至于在 E-mail 上面,就是所谓的标题 ( Subject ) 、送件者 (From: )、收件者 ( To: )以及其他相关的信息等等啰!
     
    • 信封内的信纸信息 ( Body ):这就是对方寄信给你的时候所书写的内容啦!
     
    如果我们能够针对这两者来进行规则的过滤,如此一来,呵呵!当然就可以抵挡掉大部分的问题信件咯!这些问题信件主要就是病毒信与广告信了。不过,您必须要了解的是,这个过滤的规则是以正规表示法 ( Regular Expression, RE ) 来进行设定的!因此,您最好能够具有初阶的 RE 概念,如此一来会比较容易看懂底下的数据喔!
     
    1. 启用 Postfix 配置文件里头的设定:

    2. 好了,首先我们当然必须要启动配置文件里面针对这个邮件过滤的设定了!这里我们订定为这样:
      • 对于 Header 的过滤规则以 /etc/postfix/header_checks 来进行设定;
      • 对于 body 的过滤规则以 /etc/postfix/body_checks 来进行设定。
      然后下达这样的参数:
      [root@test root]# vi /etc/postfix/main.cf
      # 在这个档案的最底下加入这两行
      header_checks = regexp:/etc/postfix/header_checks
      body_checks = regexp:/etc/postfix/body_checks
      # 注意一下,那个 regexp 表示『我使用正规表示法来进行过滤的规则订定』的意思
      # 至于后面接的档案就是配置文件啦!
       
      [root@test root]# postfix reload
       
    3. 开始设定规则:

    4. 对于规则的订定其实并不简单的!我们有必要针对 RE 的规则来进行约略的说明:
      • 在规则配置文件里面 ( 就是 header_checks 与 body_checks ) 只要是 # 代表该行为批注,系统或直接略过;
      • 所谓的过滤规则即是 Header 与 body 里面的『关键词』,例如我不想让 192.168.100.5 这个 IP 寄件到我的 mail server ,那么这个 From:.* 192.168.100.5 就是一条规则了!那个 .* 代表什么意思呢?他代表『没有或多个任意字符』的意思~更详细的说明请参考各个正规表示法的标准说明了!常见的正规表示法特殊字符与意义为:
        • 『.』:代表任意字符
          『\』:代表跳脱字符,可以让后面接的一个字符变成一般字符;
          『*』:代表重复零个或多个前一个 RE 的字符,例如『.*』则代表任意零个或多个字符的意思;
          『^』:代表『这一行的第一个字符需要符合规则』的意思;
          『$』:代表这一行的最后一个字符必须要符合这个字符的意思,
      • 单一规则的设定方法为:
        • /规则/  动作  显示在登录文件里面的讯息
        请注意,要使用两个『 / 』将规则包起来喔!举个例子来说明:例如我想要 (1)抵挡掉标题为 A funny game 的信件,(2)并且在登录文件里面显示 drop header deny,我可以这样写:
          /^Subject:.*A funny game/  DISCARD drop header deny
      • 在默认的规则当中,大小写是视为相同的;
      • 如果有两条以上的规则,那么就必须要使用 if 了,例如底下的案例:
        • if /^Content\-Type:.*audio.*x\-midi/
          /^.*name\=.*\.scr/  DISCARD   drop the header inavalid
          endif
        上面的意思是,当一封邮件里面同时包含『 Content-Type: audio.x-midi 』与『name=*.scr』时,该封信件就会被丢弃了!那么如果有三条以上的规则时呢?呵呵!就是使用多个 if 来进行啦!
          if /rule1/
          if /rule2/
          /rule3/  动作   显示字眼
          endif
          endif
        不过请特别留意,这个 if .... endif 的设定我仅在 2.x 版本上面试过,是没有问题的,不过,已经有很多的朋友提出说,在 1.xx 版本上面执行时会有问题发生,所以如果您的 Postfix 不是 2.xx 版本,那么底下鸟哥列出的两个范例就参考看看即可,不可直接套用喔!
      • 关于动作有底下几个动作:
        • REJECT :将该封信件退回给原发信者;
          WARN   :将信件收下来,但是将该封信的基本数据记录在登录文件内;
          DISCARD:将该封信件丢弃,并不给予原发信者回应!
        一般来说我是比较喜欢以 DISCARD 将信件直接丢弃的啦! ^_^
      此外,请特别留意,在各主要 Linux distribution 释出的 1.xx 版本中,并无法使用 DISCARD 的规则喔!所以您只能使用 REJECT 了!底下列出鸟哥的两个范本:
      header_checks 范本
      body_checks 范本
       
    5. 检查规则档案设定是否正确:

    6. 请注意!不是设定好了就 OK 了!你必须要检查一下刚刚设定的规则是否正确?请特别留意喔!如果设定错误的话,很有可能会造成邮件无法顺利的被你的 Mail server 接收下来的困境呢!检查的方法很简单的,利用 postmap 来检查即可!如下所示:
      [root@test root]# postmap -q - regexp:/etc/postfix/header_checks < \
      > /etc/postfix/header_checks
      上面这些字眼『postmap -q - regexp:/etc/postfix/header_checks < /etc/postfix/header_checks』是同一行喔!如果屏幕上没有出现任何的讯息,就表示至少您的规则订定没有疑问了!然后不需要重新 启动 postfix ,刚刚的设定立刻生效啦!
     
    藉由一个这样简单的邮件过滤机制,您就可以轻易的设定个人的邮件规则,并且将他抵挡在你的 mail server 之外呢!很不错吧!此外,你可以在接收完信件之后,如果有发现任何不满意的邮件时,想要将他过滤掉,那么:
     
    1. 开启该不满意的邮件,并且进入查看『邮件原始档』的内容,找寻出该邮件的『关键词』;
    2. 查寻一下该关键词是在 Header 还是在 Body 呢?
    3. 将该规则加入 header_checks 或者是 body_checks ;
    4. 以 postmap 检查一下该规则是否设定无误,如果显示出错误讯息请持续修改至无错误为只;
     
    这样就 OK 啦!简单的很~ ^_^
     

    问题信件的送达 notify_classes
     
    如果你的 postfix 发生了邮件或者其他方面的问题,应该通知谁呢?预设情况下, Postfix 会通知 postmaster 这个人的,所以,你必须要在 aliases 这个档案里面设定 postmaster 对应的实体用户才行!一般来说,预设的 postfix 已经设定好 postmaster 的邮件会转交给 root 了!所以这里还可以比较不用理他!重要的是,我们必须要将哪些讯息送给 postmaster 呢?有底下这几样:
     
    • bounce:将无法寄出的信件复制一份给 postmaster 啰!不过,为了发件人的隐私,postmaster 接到的是已经去除原始标头(headers)的邮件;
    • 2bounce:将两次无法寄出的邮件复制一份给 postmaster ;
    • delay :将延误寄出的信件的标头(headers)通知 postmaster ;
    • policy:客户端的寄件需求被 postfix 订定的规则所拒绝时,发送错误的讯息给 postmaster 观察用!
    • protocol:当由于 client 端或者是主机端因为执行某些程序,造成不完整的执行程序时(就是有错误发生啦!),则通知 postmaster 一个协议错误的讯息(protocol errors);
    • resource:当无法寄出的邮件是由于本身 postfix 的资源(resource)所造成的,例如 queue 档案无法写入的错误讯息等,则通知 postmaster 该问题!
    • software:由于相关软件的问题造成无法寄出信件时的通知!
     
    一般来说,默认值是以 notify_classes = resource, software 来设定的!如果我们仅只要这样的功能,那么就直接将『notify_classes = resource, software 』加在 main.cf 当中吧!

大标题的图示其他应用说明:
在其他应用方面,基本上,与 sendmail 相似的,我们都需要:
  1. 进行备份;
  2. 进行磁盘配额限制(quota);
  3. 进行登录文件的查询与记录
这些动作与 sendmail 都很类似啦!所以您可以回上一章去参考一下喔!那么万一是无法使用 postfix 来寄信呢?你可以这样试看看:
  1. 回归到最原始的状态,也就是不开放任何 SMTP, Open Relay, procmail 等等,以最原始的 main.cf 档案进行 postfix 的运作,然后检查一下重要的 myhostname, mydestination 以及 mynetwork 的设定,来看看 postfix 是否工作的很顺畅,然后再来一个一个的启用其他相关的控制喔!
  2. 万一无法进行 SMTP 时,请确认您的 cyrus SASL 函式库是第几版的,然后在依照本文上面的设定来设定看看,应该不成问题吧!
  3. 还是无法解决您的问题时,请检查一下您的 /var/log/maillog 这个登录档,问题的解决都在里面啊!!!
另外,我们的网友 yangsman 提供了一支不错的 script 用来启动 pwcheck 之用,有兴趣的朋友也可以参考喔! script 内容如下:
 
[root@test root]# vi /etc/rc.d/init.d/pwcheck
#!/bin/sh
#
# Written By Yangsman 2003/05/5 
#
#
# Source function library.
. /etc/rc.d/init.d/functions

# Source networking configuration.
. /etc/sysconfig/network

# Check that networking is up.
[ ${NETWORKING} =  "no" ] && exit 0

[ -f /usr/sbin/pwcheck ] || exit 0

# See how we were called.
case  "$1" in
 start)
    # Start daemons.
    if [ ! -f /var/lock/subsys/pwcheck ]; then
    gprintf  "Starting pwcheck:  "
    /usr/sbin/pwcheck 2>/dev/null
    echo pwcheck
    touch /var/lock/subsys/pwcheck
    else
    $0 status
    fi
    ;;
 stop)
    # Stop daemons.
    if [ -f /var/lock/subsys/pwcheck ]; then
    gprintf  "Shutting down pwcheck:  "
    kill `ps -aux|grep -v ps |grep  "/usr/sbin/pwcheck"| \
        gawk '{print $2}'` 2>/dev/null
    echo pwcheck
    rm -f /var/lock/subsys/pwcheck
    else
    $0 status
    fi
    ;;
 restart)
    $0 stop
    $0 start
    ;;
 status)
       if [ -f /var/lock/subsys/pwcheck ]; then
         gprintf  "pwcheck (pid \c"
         gprintf  "`ps -aux|grep -v ps |grep  "/usr/sbin/pwcheck"| \
            gawk '{print $2}' 2>/dev/null`\c"
         gprintf  ")is runing ...\n"
    else
         gprintf  "pwcheck is't stopped \n"
    fi
    ;;
 *)
    gprintf  "Usage: %s {start|stop|restart|status}\n"  "$0"
    exit 1
esac

exit 0

 

大标题的图示参考资源

大标题的图示本章习题练习
( 要看答案请将鼠标移动到『答:』底下的空白处,按下左键圈选空白处即可察看 )

  • 请问 Cyrus SASL 在 1.5.xx 以及 2.xx 版本中,用来作为 SMTP 的认证的机制有何不同?并请说明不同的版本与 Postfix 的搭配情况。
  • 如果要让 Postfix 可以收发来自非本机的外部信件,您可以修改 main.cf 里面的什么参数?
  • 如何察看您目前的 Postfix 服务器的所有设定参数?(使用什么指令?)
  • 在 Postfix 当中,由于已经具有过滤邮件的机制,所以不太需要使用 procmail 了!请问,我该如何启用信件的 Header 过滤机制?同时,如何设定规则,使得 192.168.100.100 这个主机的来信,以及只要邮件的标头为『 Your account 』的信件就予以丢弃?

  • 前往参考用解答
简易 Mail Server 架设 -- Postfix 设定

2003/03/07:第一次完成
2003/04/19:加入 Posfix 的邮件过滤规则订定
2003/09/12:重新修订一些安装方法!
2004/01/26:订正 Tarball 安装 Postfix + SASL 的方法!如果您的 Postfix 安装完后,却无法执行 SASL 的认证功能,那么大部分的原因应该是出现在 Tarball 安装时没有确定好 SASL 的函式库的原因!如果您的 /var/log/maillog 出现这样的字眼:『fatal: SASL per-connection security setup』那就是这个问题啦!这个时候,请重新编译您的 postfix 即可!如何编译?在 make 的时候,请参考 点这里
2004/04/07:修订了新版的 Postfix 与 Open Relay 的搭配语法,请 点这里 参考新的信息!同时也修改了显示的格式,如同首页的说明喔!
2004/06/22:如果您在使用 postfix + Cyrus-SASL 2.xx 版本时, 却怎么也无法进行邮件认证成功时, 建议您将三个套件移除看看. ( postfix + fetchmail + mutt ) 鸟哥最近在使用 Fedora Core I 同样发生无法进行成功的问题, 后来将上述三个套件移除, 然后重新安装 postfix (不安装 fetchmail/mutt) 怪了, 竟然就认证成功了.
 
     
http://linux.vbird.org is designed by VBird during 2001-2011. ksu.edu 

本网页主要以Firefox配合解析度 1024x768 作为设计依据     鸟哥自由软件整合应用研究室