注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

itoedr的it学苑

记录从IT文盲学到专家的历程

 
 
 

日志

 
 

postfix配置系统的结构体系分析(from vbird.org)  

2014-08-29 10:34:14|  分类: 邮件系统认证 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
::postfix主机的设定要求

安装完 postfix 之后,接著下来就是设定了!同样的,在设定主机之前,有几个东西是您必需先行准备:
 
1. 具有合法的 hostname ,或者是经过授权的 DNS 主机来设定您自己的主机名称(hostname);
2. 您的 hostname 最好拥有一个 MX 的纪录(record);
3. 至少一定要了解到什么是 Relay 的问题,以及规划一下您所想要开放 relay 的网域;
 
你至少需要有这些资料才行呐!好了,我先假设一下我的案例好了:
 
4. 我的 hostname 为 vbird.adsldns.org;
5. 我的 hostname 还有个别名为 www.vbird.adsldns.org ,也就是说, vbird.adsldns.org 与 www.vbird.adsldns.org 都指向同一个 IP ;
6. 我的 domain name 为 adsldns.org ;
7. 我预计开放的 relay 网域为 vbird.org 这个网域,与内部的 192.168.1.0/24 这个网域,还要可以使用 access 这个档案的设定功能!
 
 Postfix 的配置系统的结构体系
 
         在主机的设定之前我们得先了解一下postfix 的整体构造。
        Postfix 的设定档几乎完全都在 /etc/postfix 里面,至于执行命令则在 /usr/sbin 里面,我们分别来谈一谈几个主要的注意事项吧!
 
8. 设定档: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 也不需要使用了呢!
 
9. 执行档: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 这一种资料格式,所以罗,你可以简单的使用底下的指令方式来格式化。 转换成postfix可以直接读取的文件。

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 显示的内容会一模一样喔!
 
10. 目录:同样的具有邮件伫列与邮件信箱的放置目录啊!
 
/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
在底下的设定当中请特别留意这些设定喔!
 
11. 主机名称的设定: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 名称!
 
12. 发件来源的主机名称:myorigin
 这个项目在设定『邮件标头上面的 mail from 的那个位址』!当我们在本机端使用 mail 这个程式发送信件时,由于没有定义送件者的位址,一般而言, 邮件主机会以目前的主机名称做为邮件的 FROM 的那个主机名称。例如在我的 postfix 上面使用 mail 发送信件时,在发送的邮件当中,就会显示发信人为 vbird@vbird.adsldns.org 的意思啦!不过,我也可以自行指定来源主机的名称,就是在这个 myorigin 设定的!通常,使用 $myhostname 来设定 myorigin 即可,不过,在某些大型主机当中,由于这个大型网域内可能有多部的邮件主机,在此时可指定 myorigin 为 $mydomain ,不过,如此一来还得替每个 user 指定其他相关的参数!所以,如果没有其他要求的话,这个地方设定为底下的样子即可:

myorigin = $myhostname
 
13. 可用来收件的主机名称: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 设定喔!』
 
14. 简易的 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 当中时,那么:
 
任何由 vbird.org 来的信件都会被认为是『信任』的,所以 postfix 主机会自动帮忙 relay ;
由任何地方来的信件,"并且"要往 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
 
15. 设定帐号别名的资料库: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 已经可以:
 
16. 针对 mynetworks 设定的 Client 端,进行 relay 的动作;
17. 针对信件目的为 mydestination 设定的主机名称『接收该信件』!
 
虽然你是使用 Tarball 方式安装 Postfix 的,但是如果你想要使用 /etc/rc.d/init.d/postfix restart 的语法来启动的话,鸟哥已经写了一支简单的 scripts 提供大家这样进行工作呢!可以 前往下載(http://linux.vbird.org/download/index.php#sendmail_postfix) 喔!
 

重要观念:Postfix 预设的 Relay 流程与收受信件流程:
 
在预设的情况下 ( 也就是说,在没有开放 SMTP 这个邮件认证时! ) Postfix 对于收信与寄信的流程是如何呢?!这里我们得分别来谈一谈几个主要的设定项目与邮件传输的动作喔!
 
18. 帮助 Client 发送信件,也就是 Relay 的功能开放的需求项目:在开放哪些项目之后,你的 postfix 主机才会帮助『信任』的 Client 端 Relay 呢?
当 Client 来自信任的网域,也就是 IP 符合 $mynetworks 的设定值时;
当 Client 来自信任的机器,也就是主机名称符合 $relay_domains 的设定项目时;
当 Client 来自不信任的网域,但是去的目的地主机端符合 $relay_domains 的设定时。
当符合上面三点的任何一点时,那么 postfix 将对该信件进行 relay 的动作喔!
 
19. 收信程序:在哪些情况之下,我们的 postfix 会将该封信件收下来呢?
收件者主机名称符合 $inet_interfaces 的设定;
收件者主机名称符合 $mydestination 的设定;
收件者主机名称符合 $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.xx 与 Tarball 的 2.xx 好吗!你要作的动作有:
 
20. 确定 cyrus-sasl 已经安装,并且同时必须要安装 libsasl 相关的 LOGIN 及 PLAIN 的函式库(这个在前面 Postfix 套件安裝 当中已经说明了,分别参考 Tarball 与 RPM 的安装,请前往参考);
21. 确定在 sasl 函式库内已经存在有 smtpd.conf 这个档案 (注意,cyrus-sasl 第一版函式库在 /usr/lib/sasl 而第二版则在 /usr/lib/sasl2 ,目录并不相同,请仔细察看一下您的 sasl 喔! ),这个档案的内容在 Postfix 套件安裝里面已经说明了!并且 sasl 与 sasl2 设定并不相同,请自行参考;
22. 确定已经使用 pwcheck(cyrus-sasl 1.5.xx) 或 saslauthd(cyrus-sasl 2.xx) 这两个 daemon 了,并且已经成功的启动 daemon 了!可以使用『ps -aux | grep pwcheck 』或『ps -aux | grep saslauthd 』察看是否有 process 存在;
23. 修改 /etc/postfix/main.cf 这个档案的设定 (请参考底下的说明);
24. 重新启动 postfix 。
 
基本上,大部分的内容我们在安装的时候已经搞定啦,就剩下需要设定 main.cf 这个档案而已,那么有哪些资料必须要设定的呢?
 
针对主机设定:
25. smtpd_sasl_auth_enable:『确定是否要针对 Client 启动 sasl 的认证呢?』预设是不启用,这里我们必须要将他给启用才行啊!所以要『smtpd_sasl_auth_enable = yes』
 
26. smtpd_sasl_local_domain:『确认已经经过认证的网域』,就是不需要身份认证也可以是『信任』的网域罗,在 1.5.xx 版的 cyrus 可以直接填写为 $myhostname 啦!不过,在 2.xx 版本时,就不能设定了!很重要喔!
 
27. 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 的设定项目罗!
通常我们会设定上面这三个就差不多啦!
 
28. smtpd_client_restrictions:『针对 client 端的限制规则』,经过 mynetworks 这个信任网域的 IP 之后,那未经信任的 Client端 IP 来源你要限制他使用你的 postfix 时,这个项目就要启动 permit_sasl_authenticated 罗!
 
29. smtpd_sasl_security_options:『限制某些登入的方式』,在 Postfix 里面,预设是使用 Plaintext 的方式来认证的,所以自然不能取消掉这个认证罗(noplaintext)!但是我们可以取消掉匿名登入的型态喔(noanonymous)!可以这样做『smtpd_sasl_security_options = noanonymous』
 
针对 Client 设定:
30. 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 里面的应用情况:
 
31. /etc/mail/local-host-names:这个档案是用来书写你的 mail server 可以接收『目的 e-mail server』的名称的一个档案,这在先前的设定项目中已经提过了,就是 /etc/postfix/main.cf 里面的 mydestination 的设定内容啦!
 
32. /etc/mail/access :这个档案用来规定可以 Relay 或者需要 discard 的动作!在 postfix 当中预设是不开启这个档案的设定的,如果要启用的话,需要在 mynetworks 里面规定好档案名称喔!设定方法请参考前几节的说明!
 
33. ~/.forward :这个档案在 sendmail 与 postfix 当中的设定是一模一样的,都是用来帮忙邮件的转递的,可以参考 sendmail 的设定项目!
 
34. /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 呢?最简单的想法你可以这样想:在你接到的一封信中,这封信主要分为底下这两部份:
 
3. 信封上面的资讯 ( Header ):这包含了寄件者、收件者、地址、与信件标题等等!至于在 E-mail 上面,就是所谓的标题 ( Subject ) 、送件者 (From: )、收件者 ( To: )以及其他相关的资讯等等罗!
 
4. 信封内的信纸资讯 ( Body ):这就是对方寄信给你的时候所书写的内容啦!
 
如果我们能够针对这两者来进行规则的过滤,如此一来,呵呵!当然就可以抵挡掉大部分的问题信件咯!这些问题信件主要就是病毒信与广告信了。不过,您必须要了解的是,这个过滤的规则是以正规表示法 ( Regular Expression, RE ) 来进行设定的!因此,您最好能够具有初阶的 RE 概念,如此一来会比较容易看懂底下的资料喔!
 
5. 启用 Postfix 设定档里头的设定:
好了,首先我们当然必须要启动设定档里面针对这个邮件过滤的设定了!这里我们订定为这样:
对于 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
 
6. 开始设定规则:
对于规则的订定其实并不简单的!我们有必要针对 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 範本
 
7. 检查规则档案设定是否正确:
请注意!不是设定好了就 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 之外呢!很不错吧!此外,你可以在接收完信件之后,如果有发现任何不满意的邮件时,想要将他过滤掉,那么:
 
8. 开启该不满意的邮件,并且进入查看『邮件原始档』的内容,找寻出该邮件的『关键字』;
9. 查寻一下该关键字是在 Header 还是在 Body 呢?
10. 将该规则加入 header_checks 或者是 body_checks ;
11. 以 postmap 检查一下该规则是否设定无误,如果显示出错误讯息请持续修改至无错误为只;
 
这样就 OK 啦!简单的很~ ^_^
 

问题信件的送达 notify_classes
 
如果你的 postfix 发生了邮件或者其他方面的问题,应该通知谁呢?预设情况下, Postfix 会通知 postmaster 这个人的,所以,你必须要在 aliases 这个档案里面设定 postmaster 对应的实体用户才行!一般来说,预设的 postfix 已经设定好 postmaster 的邮件会转交给 root 了!所以这里还可以比较不用理他!重要的是,我们必须要将哪些讯息送给 postmaster 呢?有底下这几样:
 
12. bounce:将无法寄出的信件复制一份给 postmaster 罗!不过,为了寄件者的隐私,postmaster 接到的是已经去除原始标头(headers)的邮件;
13. 2bounce:将两次无法寄出的邮件复制一份给 postmaster ;
14. delay :将延误寄出的信件的标头(headers)通知 postmaster ;
15. policy:用户端的寄件需求被 postfix 订定的规则所拒绝时,发送错误的讯息给 postmaster 观察用!
16. protocol:当由于 client 端或者是主机端因为执行某些程式,造成不完整的执行程序时(就是有错误发生啦!),则通知 postmaster 一个协定错误的讯息(protocol errors);
17. resource:当无法寄出的邮件是由于本身 postfix 的资源(resource)所造成的,例如 queue 档案无法写入的错误讯息等,则通知 postmaster 该问题!
18. 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
  评论这张
 
阅读(286)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017