鸟哥的 Linux 私房菜
为取得较佳浏览结果,请爱用 firefox 浏览本网页
目录 | Linux 基础文件 | Linux 架站文件 | Linux 企业运用 | 新手讨论 |
     
 
最近更新日期:2007/02/27
在这个邮件伺服器的架设中,我们首先谈论 Mail 与 DNS 的重要相关性,然后依序介绍 Mail Server 的相关名词,以及 Mail Server 的运作基本流程与协定,也会谈到相关的 Relay 与邮件认证机制等项目, 这些项目对于未来邮件主机的管理与设定是重要的,请不要忽略了这方面问题的讨论喔。 在这篇文章中,我们将 sendmail 与 postfix 合在一起讲了,因为目前 Postfix 这个伺服器的设定上面具有比较佳的亲和力, 所以 sendmail 我们仅作个简单的介绍,主要在以 Postfix 为主的邮件主机架设喔!

1. 本章的行前准备工作
2. 邮件伺服器的功能与运作原理
  2.1 电子邮件的功能与问题
  2.2 Mail server 与 DNS 之间的关系
  2.3 邮件传输所需要的元件 (MTA, MUA, MDA) 以及相关协定
  2.4 使用者收信时伺服器端所提供的相关协定
  2.5 Relay 与认证机制的重要性
  2.6 电子邮件的资料内容
  2.7 邮件伺服器架设前提
3. Sendmail 伺服器的简易架设介绍
  3.1 所需要的套件与套件结构
  3.2 开放 sendmail 的监听介面与收信主机名称设定
  3.3 开放使用 MTA Relay 权限设定 /etc/mail/access
4. 用 Postfix 达成 MTA 功能
  4.1 Postfix 的产生
  4.2 所需要的套件与套件结构
  4.3 让 Postfix 可监听 Internet 来收发信件
  4.4 信件传送流程与收信、relay 等重要观念
  4.5 设定邮件主机使用权限与过滤机制 /etc/postfix/access
  4.6 设定邮件别名
  4.7 邮件转递 ~/.forward
  4.8 察看信件伫列资讯
  4.9 设定 relay 的进阶功能
5. 让你的 MTA 接受 MUA 的读信要求:POP/IMAP等协定
6. 用户端的收发信软体 (MUA)
  6.1 Linux mail
  6.2 Linux telnet
  6.3 Thunderbird 好用的跨平台 (Windows/Linux X) 软体
7. 邮件主机的进阶设定:
  7.1 一些设定档所需要注意的‘权限’问题
  7.2 简单的广告信抵挡机制: postgrey 的动作
  7.3 关于黑名单的抵挡机制
  7.4 开放 SMTP 身份认证之 relay 机制
  7.5 基础的邮件过滤机制
  7.6 非固定 IP 也可以有春天: relayhost
  7.7 邮件扫瞄器:amavisd-new+f-port+spamassanssin (广告信自动学习)
  7.8 其他设定小技巧
8. 其他应用说明
  8.1 问题检查
  8.2 哪些资料要备份
  8.3 quota 与目录移转
9. 重点回顾
10.课后练习
11.参考资料
12.针对本文的建议:http://phorum.vbird.org/viewtopic.htm?p=117550

大标题的图示本章的行前准备工作
玩过邮件主机的朋友都很清楚,在现在的环境当中想要搞定 Mail server 是很难的一件事情, 因为目前网路社会的广告信、垃圾信、病毒信实在是多的不像话,所以各主要的 ISP 对于邮件控管上面越来越严格, 因此如果你没有好好的规划好一些防备的工作,以及一些事前考虑规划的动作, 那么由你的邮件主机寄出去的信件很可能老是无法到达目标主机的!而且很重要的一件事情是, 邮件主机与 DNS 是不可分割的,尤其是 DNS 的 MX 标志,还有正反解的结果。无论如何,想要搞定 Mail server 你必需要:
  • 你一定要知道 DNS 的相关意义, 否则你的邮件主机肯定会发生不明原因的错误!
  • 网路基础也很重要,尤其是一些传输与检查方面的动作;
  • 正规表示法你最好要熟悉一些,因为很多邮件过滤机制是用他来处理的。
  • 套件与行程管理也要熟悉,因为 mail server 应用很多额外的程式来管理邮件。
  • 无论如何都要强调的,防火墙设定要正确, SELinux 记得先关闭!

大标题的图示邮件伺服器的功能与运作原理
电子邮件是个啥玩意儿?他是利用网路传递一些资讯给远端主机的一种资讯传递行为,虽然讯息文字是很冷很硬的电脑文字, 确实比不上手写信件来的让人觉得温暖,不过,对于具有时效性的资讯来说,电子邮件可是个不可多得的好帮手! 但是,电子邮件系统蓬勃发展的现在却被某些少部分的特定人士所乱用,导致垃圾信件、色情广告信件等等的泛滥! 真是啊~伤脑筋~底下我们就先来谈一谈这个电子邮件相关的功能吧!


小标题的图示电子邮件的功能与问题
在目前的社会当中,没有电子邮件 (e-mail) 似乎是蛮奇怪的一件事!可以说,现在 e-mail 已经成为一个很普遍的人与人之间的沟通管道了, 电子邮件可以很快速的帮你将文件或讯息传送到地球上的任何一个有网路存在的角落,当然, 你也可以在任何有网路的地方,连上 Internet 去收取你的信件!很快乐不是吗?

不过,遗憾的是,只要是有人类的地方,就会有很多你意想不到的事情会出现了,当然 e-mail 也不例外,怎么说呢? 我们来慢慢的分析一下电子邮件产生的一些问题吧:
  • 夹带病毒的电子邮件问题:
    你可以常常听到电子邮件可能夹带病毒对吧!没错,利用电子邮件以及人们对于电子邮件的漫不经心的态度, 使得以电子邮件为媒介的电脑病毒更容易‘深入人群’当中呐!这个问题造成大大小小的伤害, 如果发生在大企业当中,那可真是受不了那~哪个主管受的了一天到晚电脑重新安装的~ 而且万一中毒的是大型主机,光是资料的损毁就可能让公司倒闭了....

  • 怪客透过邮件程式入侵:
    只要是开放给 Internet 用的程式就没有绝对安全的,只要在 Internet 上面跑的资料就没有绝对保密的! 你可以轻易的使用怪客软体 (Cracker) 就可以取得使用者在利用 e-mail 传送过程当中所输入的帐号与密码, 若经过分析之后,还可能破解对方的邮件主机~哇!真是乱可怕一把的!

  • 广告信与垃圾信等:
    这个可说是目前各大 ISP 心中永远的痛~这些垃圾信件可以占掉很多那少的可怜的频宽, 使得正常使用者连线速度与品质下降,更可能造成网路的停顿~当然,常常收到垃圾信件的你,大概也不好过吧!

  • 主机被大量不明信件塞爆:
    万一你没有将邮件主机设定好,嘿嘿!送信者可以藉由你主机收信的功能,发送大量的信件, 让你‘一次收个够!’灌爆你的主机硬碟,想要不当机都粉难~

  • 真实社会的讨厌情事:
    ‘黑函’!听到会不会很害怕?当然很害怕啦!偏偏,使用 e-mail 就可以作很多的坏事~这真是太不道德了~

  • 不实的信件内容:
    只要注意到消基会的讯息就可以知道啦,不明来源的电子邮件说的内容,不要轻易的相信! 因为很多可是以讹传讹,结果,大家都被耍了的~例如,你的朋友收到一封信,认为‘哇!这是大事情’, 所以在没有求证的情况下,将信‘转寄’给你看,嘿!你的朋友寄给你的,当然要相信他啦! 立刻再转寄,如此一再地循环,嘿嘿!这个错误内容的讯息马上就让大家知道, 更可怕的是‘还会让大家接受~’所以,看到任何讯息时,请千万要记得求证一下呐!
可怕吧!电子邮件会衍生出这么多的问题说~另外,这个 email 伺服器的设定与管理真的是网管人员心中永远的痛! 为什么呢?因为人都是想要越便利越简单越好,但越便利越不管制的邮件主机就越容易被攻击或遭利用! 反过来说,如果你针对邮件主机管得太严厉,那就不太人性化,相信至少您的主管可能就不太满意, 怎么办?

呵呵!没错啦!邮件主机就是这么回事,让人又爱又怕的一个玩意儿,搞定他,恭喜您啊一切顺利圆满! 搞不定他,主机被当成垃圾信件转运站事小,丢掉工作那可是‘兹事体大’呦! 就因为他是这么重要又难以搞定,所以我们可得好好的学学他呐!


小标题的图示Mail server 与 DNS 之间的关系
既然要使用 e-mail ,当然就需要邮件伺服器啰 (Mail Server)!不然你的信要怎样寄出去呢?事实上, mail server 的原理说难不难,但是说简单吗~似乎又有点难以理解ㄋㄟ~,所以, 底下我们要来谈一谈他的原理部分,然后再针对主机的设定来进行说明咯!我们首先要讲的就是‘ Mail server 系统与 DNS 系统有什么关连性?’ 这个部分新手最容易被搞混哩,是否要架设 mail server 就‘宿命’的一定得架设 DNS server 在你的主机上面吗?

  • Mail server 与合法的主机名称
  • 事实上目前已经没有人会使用 IP 来寄信了,我们通常接收到的 email 都是使用‘帐号@主机名称’的方式来处理的, 所以说,你的邮件伺服器‘就一定要有一个合法注册过的主机名称’才可以。为什么呢? 因为邮件伺服器就是一部电脑主机嘛!这部电脑主机是利用 TCP/IP 来进行网路资料的传输, 所以当然需要有 IP 。不过因为网路使用泛滥的种种因素,导致我们不允许直接利用主机的 IP 来寄信了! 因此,你想要架设 mail server 就‘必需’要有合法的主机名称啰。

    OK!既然我只要一个合法的主机名称即可,那么表示我不需要架设一部 DNS 主机啰? 是的,你可以这样认为!只要你拥有合法的主机名称,亦即在 DNS 的查询系统当中你的主机名称拥有一个 A 的标志, 理论上你的 mail server 就可以架设成功 (相关的 DNS 与合法主机名称的注册请参考前面章节的说明)。 只不过由于目前网际网路上面的广告信、垃圾信与病毒信等占用了太多的频宽, 导致整个网路社会花费过多的成本在消耗这些垃圾资料。 所以为了杜绝可恶的垃圾信件,目前的大型邮件主机供应商 (ISP) 都会针对不明来源的邮件加以限制, 这也就是说‘想要架设一部简单可以运作的 mail server 越来越难了’。

  • DNS 的反解也很重要!
  • 对于一般的伺服器来说,我们只要使用正解让用户端可以正确的找到我们伺服器的 IP 即可架站, 举例来说 WWW 伺服器就是这样。不过,由于目前收信端的邮件主机会针对邮件来源的 IP 进行反解, 而如果你的网路环境是由拨接取得非固定的 IP 时,该种 IP 在 ISP 方面通常会主动的以 xxx.dynamic.xxx 之类的主机名称来管理,偏偏这样的主机名称会被主要的大型邮件伺服器 (例如 hotmail, yahoo 等) 视为垃圾信件, 所以你的邮件主机所发出的信件将可能被丢弃,那可就伤脑筋了!

    所以啊,如果你想要架设一部 Mail server 的话,请‘务必’向您的上层 ISP 申请 IP 反解的对应, 不要再使用预设的反解主机名称,否则很容易导致您的邮件主机所发出的信件会在 Internet 上面流浪啊!
    Tips:
    其实你还是可以不用申请 IP 的反解,不过就得要利用所谓的 relayhost 或者是 smarthost 来处理邮件转递的问题, 这个部分又涉及到上层 ISP 的问题,挺复杂!我们会在后续作说明!
    鸟哥的图示
  • 需要 DNS 的 MX 及 A 标志啊!
  • 那么我们的邮件伺服器系统到底是如何使用 DNS 的资讯来进行邮件的传递的? 还记得在 DNS 章节里面谈到的 MX 这个标志吗?当时我们仅说过这个 MX 代表的是 Mail eXchanger, 当一封邮件要传送出去时,邮件主机会先分析那封信的‘目标主机的 DNS ’,先取得 MX 标志, 注意,MX 标志可能会有多部主机喔!然后以最优先 MX 主机为准将信发送出去。 看不懂吗?没关系,我们以底下这个 DNS 范例来说:
    xyz.com.vbird  IN  MX 10 mail.xyz.com.vbird
    xyz.com.vbird  IN  MX 20 mail2.xyz.com.vbird
    xyz.com.vbird  IN  A     aaa.bbb.ccc.ddd
    
    假如上述的 DNS 设定是正常的,那么:
    • 当有一封信要传给 user@xyz.com.vbird 时,由于 MX 标志最低者优先,所以该封信会先传送到 mail.xyz.com.vbird 那部主机。
    • 如果 mail.xyz.com.vbird 由于种种原因,导致无法收下该封信时,该封信将以次要 MX 主机来传送,那就是传送到 mail2.xyz.com.vbird 那部主机上头;
    • 如果两部 MX 主机都无法负责的话,那么该封信会直接以 A 的标志,亦即直接传送到 aaa.bbb.ccc.ddd 那个 IP 上头去, 也就是 xyz.com.vbird 本身啦!
    在这个过程当中,你必需要注意到:mail.xyz.com.vbird 及 mail2.xyz.com.vbird 必需要是可以帮 xyz.com.vbird 转信的主机才行,也就是说,那两部主机通常是你公司的最上游的邮件主机, 并不是你随意填写的!那两部主机还需要针对你的 xyz.com.vbird 来设定‘邮件转递’才行! 否则你的信会被踢掉的。

    由于现在的很多邮件主机会去搜寻 MX 这个标志来判断目标邮件主机是否为合法,所以你要架设 Mail server 虽然不必自行设定 DNS 伺服器,不过你最好要申请一个 MX 的标志才行。此外,MX 标志一定要设定正确,否则你的信件将可能会直接被 MX 主机踢掉。为了要设定 MX 但是我们没有上层邮件伺服器时,所以你可以指定 MX 为自己,利用自己当 MX 主机即可

    那么你或许会想,这个 MX 有啥好处啊?一般来说,如果目标主机挂点时,你的邮件通常会直接退还给原发信者, 但如果有 MX 主机时,这部 MX 主机会先将该封信放在他的伫列 (queue) 当中,等到你的目标主机重新提供邮件服务后, MX 主机会将你的信件传送给目标主机,如此一来你的信件就比较不会遗失啊!这样说,您可以了解吧! ^_^

  • Email 的位址
  • 刚刚上头说过 email 通常是‘帐号@主机名称’的方式来处理,举例来说鸟哥的 linux.vbird.tsai 主机上面有个 dmtsai 的使用者,则我的 email 将会成为:‘dmtsai@linux.vbird.tsai’,当有人要寄信给我时, 他会分析 @ 后面的主机名称,亦即 linux.vbird.tsai 的 MX/A 标志等等,然后再透过刚刚说明的流程来传出信件。 而当我的 linux.vbird.tsai 收到这封信时,他会将信放到 dmtsai 的信箱当中啦!底下我们就来谈一谈这个流程吧!

    小标题的图示邮件传输所需要的元件 (MTA, MUA, MDA) 以及相关协定
    在开始介绍邮件的传送过程之前,我们先来想一想,你是如何寄出电子邮件的? 假设你要寄信给一个使用者,他的电子邮件是‘a_user@gmail.com’好了,也就是说, 你要寄一封信到 gmail.com 这个主机上的意思。 那你的桌上型电脑 (举例来说, Windows 系统) 是否能够将这封信‘直接’透过网路送给 gmail.com 那个主机上? 当然不行啦!你得要设定帮你转信的邮件主机才行!也就是说,你必需要先向某一部邮件主机注册, 以取得一个合法的电子邮件使用权限后,才能够发送邮件出去的。

    所以说,你要寄出一封信件时是需要很多介面的帮忙的,底下列出一个简单的图示来说明:

    电子邮件传送的流程示意图
    图一、电子邮件传送的流程示意图

    我们先来解释一些专有名词吧!然后再来说明传送的流程:
    • MUA (Mail User Agent):
      顾名思义 MUA 就是‘邮件使用者代理人’的意思,因为除非你可以直接利用类似 telnet 之类的软体登入邮件主机来主动发出信件,否则您就得要透过 MUA 来帮你送信到邮件主机上头去。 最常见的 MUA 像是 Mozilla 推出的 Thunderbird (雷鸟) 自由软体, 或者是 Linux 桌面 KDE 常见的 Kmail ,及 Windows 内件的 Outlook Express (OE) 等。 MUA 主要的功能就是收受邮件主机的电子邮件,以及提供使用者浏览与编写邮件的功能!

    • MTA (Mail Transfer Agent):
      MUA 帮用户传送邮件到邮件主机上,那这部邮件主机如果能够帮用户将这封信寄出去,那他就是一部邮件传送主机 (MTA) 啦!这个 MTA 就是‘邮件传送代理人’的意思。也来顾名思义一下,既然是‘传送代理人’, 那么使用者寄出的信,与使用者要收信时,就是找他 (MTA) 就对啦!基本上, MTA 的功能有这些:

      1. 收受信件:使用简单邮件传送协定(SMTP)
        MTA 主机最主要的功能就是:将来自用户端或者是其他 MTA 的来信收下来,这个时候 MTA 使用的是 Simple Mail Transfer Protocol (SMTP),他使用的是 port 25 啦!

      2. 转递信件:
        如果该封信件的目的地并不是本身的用户,且该封信的相关资料符合使用 MTA 的权力, 那么咱们的 MTA 就会将该封信再传送到下一部主机上。这即是所谓的转递 (Relay) 的功能。

      3. 回应使用者的收信要求:POP 或 IMAP 协定
        使用者可以透过 MTA 主机提供的邮政服务协定 (Post Office Protocol, POP) 来收下自己的信件, 也可以透过 IMAP (Internet Message Access Protocol) 协定将自己的信件保留在邮件主机上面, 并进一步建立邮件资料匣等进阶工作。

      总之,我们一般提到的 Mail Server 就是 MTA 啦!而严格来说, MTA 其实仅是指 SMTP 这个协定而已。 而达成 MTA 的 SMTP 功能的主要套件包括老牌的 sendmail ,后起之秀的 postfix ,还有 qmail 等等。 底下我们来看看,那么在 MTA 上头还有哪些重要的功能。

    • MDA (Mail Delivery Agent):
      字面上的意思是‘邮件递送代理人’的意思。事实上,这个 MDA 是挂在 MTA 底下的一个小程式, 最主要的功能就是:分析由 MTA 所收到的信件表头或内容等资料, 来决定这封邮件的去向。所以说,上面提到的 MTA 的信件转递功能,其实是由 MDA 达成的。 举例来说,如果 MTA 所收到的这封信目标是自己,那么 MDA 会将这封信给他转到使用者的信箱 (Mailbox) 去, 如果不是呢?那就准备要转递出去了。此外,MDA 还有分析与过滤邮件的功能喔!举例来说:

      1. 过滤垃圾信件:
        可以根据该封邮件的表头资料,或者是特定的信件内容来加以分析过滤。例如某个广告信的主题都是固定的, 如‘AV情色...’等等,那就可以透过 MDA 来过滤并去除该邮件。

      2. 自动回覆:
        如果您出差了导致某一段时间内无法立即回信时,就可以透过 MDA 的功能让邮件主机可以自动发出回覆信件, 如此您的朋友就不会认为你太大牌!^_^

      各主要的 MTA 程式 (sendmail,postfix...) 都有自己的 MDA 功能,不过有些外挂的程式功能更强大, 举例来说 procmail 就是一个过滤的好帮手,另外 Mailscanner + Spamassassion 也是可以使用的一些 MDA 喔。

    • Mailbox:
      就是电子邮件信箱嘛!简单的说,就是某个帐号专用的信件收受档案啰。我们的 Linux 系统预设的信箱都是放在 /var/spool/mail/使用者帐号 中! 若 MTA 所收到的信件是本机的使用者,MDA 就会将信件送到该 mailbox 当中去啰!
    好了,那么来想一想,你如何透过 MUA 来将信件送到对方的邮件信箱 (Mailbox) 去呢?
    • Step 0:取得某部 MTA 的使用权限:
      就如图一所示,我们本地端的 MUA 想要使用 MTA 来传出信件时, 当然需要取得 MTA 的使用权限。通常就是说:我们必须要向 MTA 注册一组可使用 email 的帐号与密码才行。

    • Step 1:使用者在 MUA 上编写信件后,传送至 MTA 上头:
      使用者在 MUA 上面编写信件,信件的资料主要有:
      • 信件标头:包括寄件者的 email 以及收件者的 email 位址,还有该封信件的主旨 (subject) 等;
      • 信件内容:就是你要跟对方说明的内容啦!
      编写完毕之后只要按下传送钮,该封信就会送至你的 MTA 主机上面了,注意:是你的 MTA 而不是对方的 MTA ! 如果你确定可以使用该部 MTA 主机,那么你的这封信就会被放置到 MTA 的伫列 (queue) 当中并等待传送出去了。

    • Step 2.1:如果该封信的目标是本地端 MTA 自己的帐号
      你是可以寄信给你自己的,所以如果你的 MTA 收到该封信件的目标是自己的用户时,那就会透过 MDA 将这封信送到 Mailbox 去啰!

    • Step 2.2:如果该封信目的为其他 MTA ,则开始转递 (Relay) 的流程:
      那如果这封信的目标是其他的主机呢?这个时候我们的 MTA 就会开始分析该封信是否具有合法的使用权限, 若具有使用权限时,则我们的 MDA 会开始进行邮件转递,亦即该封信件会透过我们的 MTA 向下一部 MTA 的 smtp (port 25) 发送出去。如果该封信件顺利的发送出去了,那么该封信件就会由伫列当中移除掉了。

    • Step 3:对方 MTA 主机收受信件
      如果一切都没有问题的话,远端的 MTA 会收到我们 MTA 所发出的那封信,并将该信件放置到正确的使用者信箱当中, 等待使用者登入来读取或下载。
    在这整个过程当中,你会发现你的信件是由我们的 MTA 帮忙发送出去的,此时 MTA 提供的协定是简单邮件传输协定 (Simple Mail Transfer Protocol, smtp), 并且该封信最终是停留在对方主机的 MTA 上头!并不是你朋友的 MUA 上头啊!
    Tips:
    为何特别强调这一点?因为以前有个朋有跟我说:‘鸟哥啊,你要寄 email 给我的时候记得跟我讲, 那我下班前将电脑开着,以免你信寄不到我的信箱’,此时额头三条线突然跑出来~很不好意思~ 所以这里才要特别强调,你的 MUA 不必开着啦!要收信时再打开即可。
    鸟哥的图示
    了解了传送信件时 MTA 需要启动 smtp (port 25) 之后,再来我们得要谈谈那这封信件对方要如何接收啊?


    小标题的图示使用者收信时伺服器端所提供的相关协定
    那使用者如果想要收信时,当然也可以透过 MUA 直接来连线取得自己的邮件信箱内的资料啊! 整个过程有点像底下这样:

    电子邮件收信时的流程示意图
    图二、电子邮件收信时的流程示意图

    使用者的 MUA 会透过两种基本协定来进行信件的收受喔:POP3 及 IMAP。 我们先谈一谈 POP3 的收信方式吧:
    1. MUA 透过 POP3 (Post Office Protocol version 3) 的协定连接到 MTA 的 port 110, 并且输入帐号与密码来取得正确的认证与授权;
    2. MTA 确认该使用者帐号/密码没有问题后,会前往该使用者的 Mailbox (/var/spool/mail/使用者帐号) 取得使用者的信件并传送给使用者的 MUA 软体上;
    3. 当所有的信件传送完毕后,使用者的 mailbox 内的资料将会被删除!
    在上述的流程当中我们知道 MTA 主机必须要启动 POP3 这个协定才行,不过这个协定的收件方式比较有趣, 因为使用者收信是由第一封信件开始收下直到最后一封信件传输完毕为止。 不过由于某些 MUA 程式撰写的问题, 若有些邮件有病毒的可能性时,透过防毒软体将可能导致该 MUA 软体的断线! 如此一来由于传输没有完毕,因此 MTA 主机并不会将使用者的信件删除。 此时如果使用者又再一次的按下接收按键,呵呵!原来已接收的信件又会重复收到,而没有收到的还是收不到!

    这个时候或许你可以透过登入主机利用 mail 这个指令来处理你有问题的邮件, 或许换一种 MUA 也是个不错的思考方向,又或者暂时将防毒软体关掉也是可以考虑的手段之一。 转头过来想一想,因为 POP3 的协定预设会将信件删除,那如果我今天在办公室将我的信收到办公室的电脑中, 当我回家时再度启动 MUA 时,是否能够收到已经被接收的信件?当然不行,对吧!

    或许你需要更有帮助的协定,亦即 IMAP (Internet Messages Access Protocol) , 这个协定可以让你将 mailbox 的资料转存到你主机上的家目录,亦即 /home/帐号/ 那个目录下, 那你不但可以建立邮件资料匣,也可以针对信件分类管理,而且在任何一个可连上网路的地方你只要登入主机, 原本的信件就还是存在呐!真是好啊!

    不过,使用 IMAP 时,使用者的目录最好能够加点限制,例如利用 quota 来管理使用者的硬碟使用权限, 否则因为信件都在主机上头,如果使用者过多且误用时,你的硬碟空间会被吃光光喔!注意注意!

    OK!透过上面的说明你要知道,要架设一部可以使用 MUA 进行收发信件的 MTA 伺服器,你至少也需要启动 SMTP 以及 POP3 这两个协定才行!而这两个协定的启动程式并不相同, 所以架设上还是得要小心注意啊!


    小标题的图示Relay 与认证机制的重要性
    当你需要 MTA 帮你将信寄送到下一部 MTA 去时,这个动作就称为邮件转递 (Relay) 啰,那就是图一当中的 Step 2.2 那个动作啦。 那么我们来想一想,如果‘所有的人都可以藉由这一部 MTA 帮忙进行 Relay 时, 这个情况称之为 Open Relay 的动作’。当你的 MTA 发生 Open Relay 时,会有什么问题? 问题可就大了!

    当你的 MTA 由于设定不良的关系导致具有 Open Relay 的状况,加上你的 MTA 确实是连上网际网路时, 由于网际网路上面用 port scan 软体的闲人太多,你的 MTA 具有 Open Relay 的功能这件事情, 将会在短时间内就被很多人察觉,此时那些不法的广告信、色情垃圾信业者将会利用你的这部 Open Relay MTA 发送他们的广告,所以你会发生的问题至少有:
    • 你主机所在的网域正常使用的连线速度将会变慢,因为网路频宽都被广告、垃圾信吃光了;
    • 你的主机可能由于大量发送信件导致主机资源被耗尽,容易产生不明原因当机之类的问题;
    • 你的 MTA 将会被网际网路社会定义为‘黑名单’,从此很多正常的邮件就会无法收发;
    • 你 MTA 所在的这个 IP 将会被上层 ISP 所封锁,直到你解决这个 Open Relay 的问题为止;
    • 某些用户将会对你的能力产生质疑,对您公司或者是你个人将会有信心障碍!甚至可能流失客源;
    • 如果你的 MTA 被利用来发黑函,你是找不到原发信者的,所以你这部 MTA 将会被追踪为最终站!
    问题很大呦!所以啊,目前所有的 distributions 都一样,几乎都将 MTA 预设启动为仅监听内部回圈介面 (lo) 而已,而且也将 Open Relay 的功能取消了。既然取消 Open Relay 的功能,那么怎么使用这部 MTA 的 Relay 来帮忙转信啊?呵呵!所以我们在上头才会一直说,你‘必需’取得合法使用该 MTA 的权限啊! 这也就是说,设定谁可以使用 Relay 的功能就是我们管理员的任务啦!通常设定 Relay 的方法有这几种:
    • 规定某一个特定用户端的 IP 或网段,例如规定内部 LAN 的 192.168.1.0/24 可使用 Relay;
    • 若用户端的 IP 不固定时 (例如拨接取得的非固定 IP) 可以利用认证机制来处理。
    认证机制上面常见的有 SMTP 邮件认证机制,以及 SMTP after POP 两种,不论是哪一种机制, 基本上都是透过让使用者输入认证用的帐号与密码,来确定他有合法使用该 MTA 的权限, 然后针对通过认证者开启 Relay 的支援就是了。 如此一来你的 MTA 不再启动 Open Relay ,并且用户端还是可以正常的利用认证机制来收发信件, 身为管理员的你可就轻松多啰! ^_^


    小标题的图示电子邮件的资料内容
    看过上头的资料后,您应该对于 Mail server 有一些程度的认识了。再来要谈的是, 那么一封 email 的内容有哪些部分呢?就跟人类社会的邮件有信封袋以及内部的信纸一样, email 也有所谓的标头 (header) 以及内容 (body) 两部份喔!

    email 的标头部分会有几个重要资讯,包括:这封信来自那个 MTA、是由谁所发送出来的、要送给谁、 主旨为何等等,至于内容则是发信者所填写的一些说明啰。如果你使用 dmtsai 的身份下达这个指令:
    [dmtsai@linux ~]$ echo "HaHa.." | mail -s "from vbird" dmtsai
    
    然后将自己的信箱内容叫出来,如下所示:
    [dmtsai@linux ~]$ cat /var/spool/mail/dmtsai
    From dmtsai@localhost  Tue Nov 21 00:33:29 2006   <==发信者 email
    Return-Path: <dmtsai@localhost>                   <==之前的 MTA 来源
    X-Original-To: dmtsai                             <==原收件者的资讯
    Delivered-To: dmtsai@localhost                    <==最终此邮件转递给谁
    Received: by localhost (Postfix, from userid 500) <==上一个 MTA 来源
            id 7A9C3A26B8; Tue, 21 Nov 2006 00:33:29 +0800 (CST)
    To: dmtsai@localhost                              <==收件者信箱
    Subject: from vbird                               <==主旨
    Message-Id: <20061120163329.7A9C3A26B8@localhost> <==给 MTA 看的 ID
    Date: Tue, 21 Nov 2006 00:33:29 +0800 (CST)
    From: dmtsai@localhost (VBird)                    <==发信者 email
    底下为信件内容
    HaHa..
    
    由原本的信件内容上面我们可以看到确实是两部份,在标头部分记录了比较详细的收、发件者资料, 以及相关的来源、目标之 MTA 资讯等等。但你要注意的是,那个‘Received:...’那一行资料是‘会变动的’, 如同前面谈到的 MX 标志,如果一封信由 MUA 传送到 MTA 在由 MTA 传送到 MX 主机后,才传送到最终的 MTA 时, 那么这个 Received: 的资料将会记录每一部经手过的 MTA 资讯喔! 所以你可以藉着这个记录资料慢慢的找回这封信的传递方向呢!

    此外,这个邮件的标头以及内容的分析部分,你还可以藉由某些分析软体来进行过滤, 这部份我们将在后头再慢慢的介绍给大家了解喔! ^_^!您先知道一封邮件至少有这些资料, 以后咱们再慢慢的解释啰!


    小标题的图示邮件伺服器架设前提
    前面谈到 mail server 与 DNS 系统有很大的相关性,所以如果你想要架设一部可以连上 Internet 的邮件伺服器时, 你必需要已经取得合法的 A 与 MX 主机名称,而且最好反解也已经向您的 ISP 申请修改设定了, 这可是个大前提!不要忽略他!在底下的练习当中鸟哥以之前 DNS 章节内的设定为依据, 主要的参数是这样的:
    • 邮件主机的主要名称为: linux.vbird.tsai
    • 邮件主机尚有别名为 www.vbird.tsai 及 ftp.vbird.tsai 也可以收发信件;
    • 此邮件主机已有 MX 设定,直接指向自己 (linux.vbird.tsai)
    • 这个 linux.vbird.tsai 有个 A 的标志指向 192.168.1.254。
    在实际的邮件伺服器设定当中,上述的几个标志是很重要的,请自行参考 DNS 章节的介绍吧!


    大标题的图示Sendmail 伺服器的简易架设介绍
    可达成上述 MTA 功能的软体非常的多,不过在常见的 Linux distributions 上头则主要以数十年老牌子的 sendmail (http://www.sendmail.org) 以及近期以来很热门的 Postfix (http://www.postfix.org) 为主, 咱们的 CentOS 4.x 两种软体都有提供,不过主要是以 sendmail 为预设的 MTA 软体,所以我们首先会来介绍一下如何在 CentOS 4.x 上面开放 sendmail 监听所有介面的方法,然后再仔细的聊一聊如何设定 Postfix 吧!


    小标题的图示所需要的套件与套件结构
    既然 CentOS 预设是以 sendmail 为主要的 MTA 软体,而我们的 Linux 又需要 MTA 来监听 lo 这个介面, 所以 sendmail 当然是已经安装好了!但是 sendmail 还需要很多额外的套件来辅助处理, 所以你至少也需要底下几个套件才行:
    • sendmail:提供主要的 sendmail 程式与设定档;
    • sendmail-cf:提供 sendmail.cf 这个设定档的预设整合资料;
    • m4:辅助将 sendmail-cf 的资料转成实际可使用的设定档。
    这三个套件是有相关性的啦,不过如果你在安装的时候没有选择完整安装所以套件时,sendmail-cf 可能没有安装, 所以请自行利用 rpm 以及 yum 检查看看,并自行安装好他吧!

    几乎所有的 sendmail 相关设定档都在 /etc/mail/ 目录下,主要的设定档基本上有这些:
    • /etc/mail/sendmail.cf (/usr/sbin/sendmail 的设定档)
      这就是 sendmail 的设定档!所有跟 sendmail 有关的设定都是靠他来完成的!不过,这个设定档的内容真不是给人看的, 鸟哥也老是看的‘雾煞煞’搞不懂!所以建议您不要随意手动修改这个档案啊!咦!设定档又不给人改, 那怎么处理额外的设定项目啊? 就交给程式帮我们修改啊!所以才需要 sendmail-cf 这个套件嘛!看下去就知道了。

    • /usr/share/sendmail-cf/cf/*.mc
      这些档案是 sendmail.cf 这个设定档的预设参数资料,上面不是说不要直接手动修改 sendmail.cf 吗, 那如果你想要处理 sendmail.cf 的话,就得要透过这个目录下的参数档案来预先准备设定资料啰! 当然啦,这些预设参数资料档案必需要透过 m4 那个程式来转换才行喔!

    • /etc/mail/sendmail.mc (由 m4 指令转换)
      是的是的!就是他!我们利用 m4 那个指令并通过指定的预设参数档案来重建 sendmail.cf , 就是藉由这个档案来设定处理的!那我们应该要如何透过这个档案来重建 sendmail.cf 呢? 简单的说,你可以参考底下这张图:

      利用 m4 来转换重建 sendmail.cf
      图三、利用 m4 来转换重建 sendmail.cf

      透过 m4 来处理即可,我们要作的就是修改 sendmail.mc 就好了,较为简单。

    • /etc/mail/local-host-names
      你的 MTA 能不能将信收下来与这个设定有关,鸟哥的范例当中主机名称有三个 (linux.vbird.tsai, www.vbird.tsai, ftp.vbird.tsai),这三个主机名称得都要写入这个档案当中才行喔! 否则将会造成例如: dmtsai@linux.vbird.tsai 可以收信,但是 dmtsai@www.vbird.tsai 却不能收信的现象, 虽然这两个 email 位址都是传送到同一部主机,不过你的 MTA 能不能收下该位址的信件,是需要设定的喔!

    • /etc/mail/access.db (/etc/mail/access, 利用 makemap 处理)
      用来设定是否可以 Relay 或者是能否接收信件的资料库档案!由于这个档案是资料库, 所以我们必需要‘修改 /etc/main/access 并使用 makemap 这个指令来建立 access.db 档案’才行! 这个档案很重要的,我们内部 LAN 可以使用这个设定档来开放 Relay 的权限呢!

    • /etc/aliases.db (/etc/aliases, 利用 newaliases 处理)
      我们可以建立‘信箱别名’喔!假设你有一个使用者帐号为 dmtsai ,他还想要使用 dermintsai 这个帐号来收信, 你不需要再建立一个 dermintsai 的帐号,直接在这个档案里面设定一个别名,让寄给 dermintsai 的信件直接丢到 dmtsai 的信箱去即可!由于是资料库,所以你是需要‘修改 /etc/aliases 并透过 newaliases 来重建该档案’才行喔!

    • /var/spool/mqueue/ (可用 mailq 观察)
      这个就是 sendmail 的邮件伫列,当一封信被 MTA 收下后,就会被放置到这里来等待 MDA 的处理。 如果该封信件是本机帐号,那么就会被挪到 /var/spool/mail/使用者帐号 去,然后移除该封信件。 如果该封信件需要 Relay ,那么当信件传送到下一部 MTA 后,信件资料就会自伫列中移除。 不过当一封信暂时寄不出去时,该信件就会先被储放在这里,并等待继续尝试送出去。 如果你想要知道目前伫列内储放的信件资料,可以输入 mailq 来查阅喔!
    好了,再来让我们修改 sendmail 这个 MTA ,让她可以连上 Internet 吧!


    小标题的图示开放 sendmail 的监听介面与收信主机名称设定
    事实上我们的 CentOS 预设已经启动了 sendmail 了,只是他只会接受来自本机的 MTA 要求! 不相信吗?做一下底下的练习吧!

    例题:
    请列出目前你的主机上面,所有在监听 tcp/udp 当中的埠口与服务的对应资料
    答:
      直接利用 netstat 就能够列出来了,鸟哥的主机可以列出这些资料:
      netstat -tulnp
      Active Internet connections (only servers)
      Proto Recv-Q Send-Q Local Address  Foreign Address  State   PID/Program name
      tcp        0      0 0.0.0.0:22     0.0.0.0:*        LISTEN  16856/sshd
      tcp        0      0 127.0.0.1:25   0.0.0.0:*        LISTEN  8036/sendmail: acce

    在上面的例题当中你可以发现到 port 25 是由 sendmail 所启动的,而且‘只监听 127.0.0.1 这个 lo 介面’喔! 所以我们的重点当然就是如何将监听的介面开启到整个 Internet 上,否则他是无法接收来自 Internet 的信件的啦! 我们知道设定档在 /etc/mail/sendmail.cf ,但不要手动改他,你应该要修改的是 sendmail.mc 这个档案啦! 这个档案的设定项目基本语法是这样的:
      设定元件(`设定项目', `参数一', `参数二')
    每个设定项目与参数左边使用的是数字键1左边那个按钮 (quote) ,右边则是单引号,别搞错喔! 这个档案的设定项目你可以参考底下的网页说明:
    我们这里只要改一个地方即可,其他的可以使用预设值就好了喔!
    1. 修改 sendmail.mc 的参数
    [root@linux ~]# vi /etc/mail/sendmail.mc
    # 找到底下这一行:
    DAEMON_OPTIONS(`Port=smtp,Addr=127.0.0.1, Name=MTA')dnl
    # 将他改成这样即可:
    DAEMON_OPTIONS(`Port=smtp,Addr=0.0.0.0, Name=MTA')dnl
    
    2. 备份旧的设定档资料
    [root@linux ~]# cd /etc/mail
    [root@linux mail]# mv sendmail.cf sendmail.cf.back1
    
    3. 开始建立新的 sendmail.cf 设定档
    [root@linux mail]# m4 sendmail.mc > sendmail.cf
    
    当你处理完毕之后,重新启动 sendmail 并检查一下 smtp 的监听埠口看看:
    [root@linux ~]# /etc/init.d/sendmail restart
    
    [root@linux ~]# netstat -tlunp
    Active Internet connections (only servers)
    Proto Recv-Q Send-Q Local Address  Foreign Address  State   PID/Program name
    tcp        0      0 0.0.0.0:25     0.0.0.0:*        LISTEN  8517/sendmail: acce
    
    瞧!监听的介面终于对整个 Internet 开放了!这个时候理论上你的 MTA 已经开始运作啰! 而我们的 MTA 既然已经针对 Internet 来监听了,所以自然你的主机名称得要设定正确才行! 否则主机预设只会接受‘localhost’这个主机名称的信件而已呐!我们可以这样做:
    [root@linux ~]# vi /etc/mail/local-host-names
    linux.vbird.tsai
    www.vbird.tsai
    ftp.vbird.tsai
    
    [root@linux ~]# /etc/init.d/sendmail restart
    
    改写完毕后记得要重新启动 sendmail 才会正式的生效喔! 每一行有一个主机名称!请记住,未来如果您的主机新增了不同的主机名称, 并且你希望该主机名称可以用来收发信件,那么要修改 local-host-names !那么什么时候不要将所有的主机名称都给他写到这个 local-host-names 里面去呢?

    由于目前的广告信件实在是太多了,他们会主动的在 Internet 上面搜寻一些主机名称, 然后随机四处发送垃圾邮件。如果您的主机有四个名称,每个主机名称都写到 local-host-names 去的话,很可能一封广告信您会‘收到四次’,因为四个主机名称嘛!所以啰! 有的时候还是不要让全部的主机名称都可以收信是比较好的呐!


    小标题的图示开放使用 MTA Relay 权限设定 /etc/mail/access
    根据图一的流程分析当中,我们知道一个 MTA 最主要的功能就是‘收信’与‘信件转递, Relay’, 上一个小节提到收信的部分主要与监听介面以及主机名称有关,那能否使用 Relay 的能力呢? 这就是我们所需要了解的啦!

    在 Sendmail 的预设情况下只有 sendmail 伺服器本机 (localhost) 可以进行信件转递的功能, 其他任何用户端都无法使用这部 MTA 的!也就是说,除非你在这部 MTA 上面使用 mail 这个指令, 或者是使用 X Window 内的 MUA 来发信,其他的非本机用户都没有 relay 的能力。 哇!那么这部 MTA 还有啥用途啊?所以啊, 我们必须要针对用户端的 Relay 功能进行开放才行!这个设定得要很小心, 免得你的 MTA 变成 Open Relay 的不良状态啊!

    sendmail 使用 /etc/mail/access 这个档案来设定开放 Relay 或者是抵挡 Relay 的功能, 这个档案内的格式基本上是这样的:
      规范的范围或规则             Sendmail的动作
      IP/部分IP/主机名/Email等     RELAY/DISCARD/REJECT
    在这两个栏位之间最好使用<tab>按键来作为分隔,假设我要让内部的 192.168.1.0/24 这个网域, 还有 140.116.44.202 这部主机,以及在教育部 (ncku.edu.tw) 所管辖的领域之主机名称都能使用这部 MTA 的话, 你可以这样设定的:
    [root@linux ~]# vi /etc/mail/access
    localhost.localdomain           RELAY
    localhost                       RELAY
    127.0.0.1                       RELAY
    192.168.1                       RELAY
    140.116.44.202                  RELAY
    .edu.tw                         RELAY
    
    [root@linux ~]# cd /etc/mail
    [root@linux mail]# makemap hash access.db < access
    # 上面这个动作在‘制作出 hash 格式的资料库’,请 man makemap 即可了解。
    
    做了这个动作后,整个内部网域以及外部的其他固定 IP 主机就能够使用你的 MTA 来进行 Relay 啰!不过非固定 IP 还是会有点困扰就是了。不过不打紧,我们还可以利用其他认证方式来开放使用权限的。 更多的 access 用法我们将在 Postfix 的章节当中进行介绍呐! 在这里你先知道可以这样玩即可喔! ^_^

    Sendmail 的设定到此后,你的 MTA 已经可以收受信件,也可以接受内部或特定 IP 的 Relay 信件, 其他更多的设定方式则可以参考 sendmail 的官方网站吧!当然啦,由于 postfix 本来就是用于相容 sendmail 的, 所以底下继续介绍的 postfix 的相关设定方法,你也可以用在 sendmail 上头呐! 重复的不再说!赶紧继续看下去吧!

    大标题的图示用 Postfix 达成 MTA 功能
    Sendmail 真是个很棒的 MTA 伺服器,不过他也有若干的缺点,包括早期的程式漏洞问题导致的主机安全性缺失; 还有 sendmail 将所有的功能都统合在 /usr/sbin/sendmail 这个程式当中,导致程式太大可能会有效能方面的疑虑; 以及完全不具有亲和力的设定档 sendmail.cf .....,所以后来才会有这个小巧效能又棒的 postfix 出来啊!


    小标题的图示Postfix 的产生
    Postfix 是由 Wietse Zweitze Venema 先生(http://www.porcupine.org/wietse)所发展的。早期的 mail server 都是使用 sendmail 架设的,还真的是‘仅此一家,绝无分号!’!不过,Venema 博士觉得 sendmail 虽然很好用,但是毕竟不够安全,尤其效能上面并不十分的理想,最大的困扰是....sendmail 的设定档 sendmail.cf 真的是太难懂了!对于网管人员来说,要设定好 sendmail.cf 这个档案,真不是人作的工作。

    为了改善这些问题, Venema 博士就在 1998 年利用他老大在 IBM 公司的第一个休假年进行一个计划:‘ 设计一个可以取代 sendmail 的软体套件,可以提供网站管理员一个更快速、 更安全、而且完全相容于 sendmail 的 mail server 软体!’这个计划还真的成功了! 而且也成功的使用在 IBM 内部,在 IBM 内可以说是完全取代了 sendmail 这个邮件伺服器!在这个计划成功之后, Venema 博士也在 1998 年首次释出这个自行发展的邮件伺服器,并定名为 VMailer。

    不过, IBM 的律师却发现一件事,那就是 VMailer 这个名字与其他已注册的商标很类似, 这样可能会引起一些注册上面的困扰。为了避免这个问题,所以 Venema 博士就将这个邮件软体名称改为 Postfix !‘Post 为在什么什么之后’的意思,‘fix 则是修订’的意思,所以 postfix 有 ‘在修订之后’的意思。

    鸟哥个人认为, Venema 先生最早的构想并不是想要‘创造一个全新的 Mail server 软体,而是想要制造一个可以完全相容于 sendmail 的软体’,所以, Venema 先生认为他自行发展的软体应该是‘改良 sendmail 的缺失’,所以才称为 Postfix 吧!取其意为: ‘在 sendmail 之后的改良的邮件伺服器软体!’

    所以啦, Postfix 设计的理念上面,主要是针对‘想要完全相容于 sendmail’所设计出来的一款‘内在部分完全新颖’的一个邮件伺服器软体。就是由于这个理念,因此 Postfix 改善了 sendmail 安全性上面的问题,改良了 mail server 的工作效率, 且让设定档内容更具亲和力!因此,你可以轻易的由 sendmail 转换到 Postfix 上面!这也是当初 Venema 博士的最初构想啊!

    就是基于这个构想,所以, Postfix 在外部设定档案的支援度,与 sendmail 几乎没有两样,同样的支援 aliases 这个档案,同样的支援 ~/.forward 这个档案,也同样的支援 SASL 的 SMTP 邮件认证功能等等! 所以,呵呵!赶紧来学一学怎样架设 Postfix 这个相当出色的邮件伺服器吧! ^_^


    小标题的图示所需要的套件与套件结构
    相对于 sendmail 还需要 m4 以及 sendmail-cf , Postfix 要简单太多了!你只要安装 postfix 即可。 不过我们的 CentOS 虽然同时提供 sendmail 与 postfix ,不过鸟哥极不建议这两者并存喔! 因此你在安装完 postfix 之后,记得将 sendmail 给他移除一下比较妥当一些些! 所以你可以这样做:
    [root@linux ~]# /etc/init.d/sendmail stop
    [root@linux ~]# yum install postfix
    [root@linux ~]# rpm -e sendmail
    [root@linux ~]# /etc/init.d/postfix start
    
    因为 Linux 系统至少需要一个 MTA 来让系统内部的帐号可以传送邮件,所以你必须要先安装 postfix 后才可以移除 sendmail 喔!顺序可不要搞错了!否则会跑出一堆相依属性的问题哩! 那么 postfix 有哪些重要的设定档呢?他主要的设定档都在 /etc/postfix/ 当中, 详细的档案内容就让我们来谈谈:
    • /etc/postfix/main.cf
      这就是主要的 postfix 设定档啰,几乎所有的设定参数都是在这个档案内规范的! 这个档案预设就是一个完整的说明档了,你可以参考这个档案的内容就设定好属于你的 postfix MTA 呢! 只要修改过这个档案,记得要重新启动 postfix 喔!

    • /etc/postfix/master.cf
      主要规定了 postfix 每个程序的运作参数,也是很重要的一个设定档。 不过这个档案预设已经很 OK 了,通常不需要更改他。

    • /etc/postfix/access (利用 postmap 处理)
      与 sendmail 的 /etc/mail/access 具有相同的用途,可以设定开放 Relay 或拒绝连线的来源或目标位址等资讯。 不过这个档案要生效还需要在 /etc/postfix/main.cf 启动这个档案的用途才行。 且设定完毕后需要以 postmap 来处理成为资料库档案呢!

    • /etc/aliases (利用 postalias 或 newaliases 均可)
      不同的 distributions 这个档案放置的目录可能不太一样,在 CentOS 当中为了完全相容于 sendmail 与 postfix , 所以这个档案预设放在 /etc/ 当中,其他版本则可能放置到 /etc/postfix 目录中喔! 这个档案的用法与 sendmail 完全相同喔!
    至于常见的执行档则有底下这些:
    • /usr/sbin/postconf (查阅 postfix 的设定资料)
      这个指令可以列出目前你的 postfix 的详细设定资料,包括系统预设值也会被列出来, 所以资料量相当的庞大!如果你在 main.cf 里面曾经修改过某些预设参数的话,想要仅列出非预设值的设定资料, 则可以使用‘postconf -n’这个参数即可。

    • /usr/sbin/postfix (主要的 daemon 指令)
      此为 postfix 的主要执行档,你可以简单的使用他来启动或重新读取设定档:
      [root@linux ~]# postfix check   <==检查 postfix 相关的档案、权限等是否正确!
      [root@linux ~]# postfix start   <==开始 postfix 的执行
      [root@linux ~]# postfix stop    <==关闭 postfix
      [root@linux ~]# postfix flush   <==强制将目前正在邮件伫列的邮件寄出!
      [root@linux ~]# postfix reload  <==重新读入设定档,也就是 /etc/postfix/main.cf
      
      要注意的是,每次更动过 main.cf 后,务必重新启动 postfix ,可简单的使用‘postfix reload’即可。

    • /usr/sbin/postalias
      设定别名资料库的指令,因为 MTA 读取资料库格式的档案效能较佳,所以我们都会将 ASCII 格式的档案重建为资料库。 在 postfix 当中,这个指令主要在转换 /etc/aliases 成为 /etc/aliases.db 啰!用法为:
      [root@linux ~]# postalias hash:/etc/aliases
      # hash 为一种资料库的格式,然后那个 /etc/aliases.db 就会自动被更新啰!
      
    • /usr/sbin/postcat
      主要用在检查放在 queue (伫列) 当中的信件内容。由于伫列当中的信件内容是给 MTA 看的, 所以格式并不是一般我们人类看的懂的文字资料。所以这个时候你得要用 postcat 才可以看出该信件的内容。 在 /var/spool/postfix 内有相当多的目录,假设内有一个档案名为 /deferred/abcfile , 那你可以利用底下的方式来查询该档案的内容喔:
      [root@linux ~]# postcat /var/spool/postfix/deferred/abcfile
      
    • /usr/sbin/postmap
      这个指令的用法与 postalias 类似,不过他主要在转换 access 这个档案的资料库啦!用法为:
      [root@linux ~]# postmap hash:/etc/postfix/access
      
    • /usr/sbin/postqueue
      类似 mailq 的输出结果,例如你可以输入‘postqueue -p’看看就知道了!
    整个 postfix 的套件结构大致上是这个样子的,接下来让我们先来简单的处理一下 postfix 的收发信件功能吧!


    小标题的图示让 Postfix 可监听 Internet 来收发信件
    同样的,咱们 CentOS 4.x 的 postfix 依旧预设仅支援本机介面的 smtp 服务而已, 所以如果你要对整个 Internet 开放的话,就得要努力的搞定几个简单的设定啰! 而几乎所有的设定你都可已经由 /etc/postfix/main.cf 这个档案搞定!这个档案的内容你需要注意的是:
    • ‘#’符号是注解的意思;
    • 所有设定值以类似‘变数’的设定方法来处理,例如 myhostname = linux.vbird.tsai ,请注意等号的两边要给予空白字元喔,且第一个字元不可以是空白,亦即‘my..’要由行首写起;
    • 可以使用‘ $ ’来延伸使用变数设定,例如 myorigin = $myhostname,会等于 myorigin = linux.vbird.tsai;
    • 如果该变数支援两个以上的资料,则使用空白字元来分隔,不过建议使用逗号加空白字元‘, ’来处理。 例如: mydestination = $myhostname, $mydomain, www.vbird.tsai,意指 mydestination 支援三个资料内容之意。
    • 可使用多行来表示同一个设定值,只要在第一行最后有逗号,且第二行开头为空白字元, 即可将资料延伸到第二行继续书写;
    • 若重复设定某一项目,则以较晚出现的设定值为准!
    要让你的 postfix 可以收发信件时,你必需要启动的设定资料有底下这些喔:

  • myhostname:设定主机名称,需使用 FQDN 喔
  • 这个设定项目在于设定你的主机名称,且这个设定值被后续很多其他的参数所引用,所以必须要设定正确才行。 你应该要设定成为完整的主机名称。在鸟哥的这个练习当中,我们的主机名称为 linux.vbird.tsai, 所以请设定好他吧:
    [root@linux ~]# vi /etc/postfix/main.cf
    myhostname = linux.vbird.tsai
    
    除了这个设定值之外,还有一个 mydomain 的设定项目,这个项目预设会取 myhostname 拿掉第一个‘.’以前的主机名称, 而设定出 domain name 。举例来说上头设定完毕后,预设的 mydomain 就是 vbird.tsai 啰!你也可以自行设定他。 基本上这两个设定值只是被用来引用的,你只要设定正确即可。

  • myorigin :发信时所显示的‘发信源主机’项目
  • 这个项目在设定‘邮件标头上面的 mail from 的那个位址’, 也就是代表本 MTA 传出去的信件将以此设定值为准喔!如果你在本机寄信时忘记加上 Mail from 字样的话, 那么就以此值为准了。预设这个项目以 $myhostname 为主的,所以:
    myorigin = $myhostname
    
  • inet_interfaces :设定 postfix 的监听介面 (极重要)
  • 在预设的情况下你的 Postfix 只会监听本机介面的 lo (127.0.0.1) 而已,如果你想要监听整个 Internet 的话, 请开放成为对外的介面,或者是开放给全部的介面,常见的设定方法为:
    inet_interfaces = all
    
    由于如果有重复设定项目时,会以最晚出现的设定值为准,所以当你设定为‘inet_interfaces = all’时,请将 inet_interfaces = localhost 那一行注解掉啊!

  • mydestination :设定‘能够收信的主机名称’ (极重要)
  • 这个设定项目很重要喔!他就像 sendmail 内的 local-host-names 一样, 你的主机能够收下来的信件中,Mail to 写的主机名称必须要在这个设定值当中出现才行。 在我们这个练习当中这部主机有三个名字,linux.vbird.tsai, www.vbird.tsai 及 ftp.vbird.tsai 都需要写入喔!
    mydestination = $myhostname, localhost.$mydomain, localhost,
         www.vbird.tsai, ftp.vbird.tsai
    
    瞧见否?如果想要将同一个设定写成两行时,前一行最后最好使用逗号‘ , ’来隔开较佳。 因为 $myhostname 已经是 linux.vbird.tsai 了,所以不必改写。另外,如果你对 sendmail 的 local-host-names 情有独钟而想要继续使用该档案时,可以这样做:
    mydestination = /etc/postfix/local-host-names
    
    然后在该档案内加入所有你想要加入的主机名称即可!一般来说,不建议你额外建立 local-host-names 这个档案啦, 直接写入 main.cf 即可说!特别留意的是,如果你的 DNS 里头的设定有 MX 标志的话,那么请将 MX 指向的那个主机名称一定要写在这个 mydestination 内, 否则很容易出现错误讯息喔!特别的给他注意这一点! 一般来说,使用者最常发生错误的地方就在这个设定里头呢!

  • mynetworks_style :设定‘信任网域’的一项指标
  • 这个设定值在规定‘与主机在同一个网域的可信任用户端’的意思!举例来说,鸟哥的主机 IP 是 192.168.1.254,如果我相信整个区域网路内 (192.168.1.0/24) 的用户的话,那我可规定此设定值为‘ subnet ’呐! 不过,一般来说,因为底下的 mynetworks 会取代这个设定值, 所以不设定也没有关系喔!如果要设定的话, 最好设定成为 host 即可 (亦即仅信任这部 MTA 主机而已)。
    mynetworks_style = host
    
  • mynetworks :规定信任的用户端 (极重要)
  • 你的 MTA 能不能帮忙进行 Relay 与这个设定值最有关系!举例来说,我要开放本机与内部网域的 IP 时, 就可以这样进行设定:
    mynetworks = 127.0.0.0/8, 192.168.1.0/24
    
    还记得我们在 sendmail 内是以 access 来进行 relay 的设定吧? 那如果你想要延续这个档案的设定呢?那鸟哥可以建议你将上述的资料改写成这样:
    mynetworks = 127.0.0.0/8, 192.168.1.0/24, hash:/etc/postfix/access
    
    然后你只要再建立 access 之后重整成资料库后,嘿嘿!就能够设定 Relay 的用户啰!

  • relay_domains :规范可以帮忙 relay 的下一部 MTA 主机位址
  • 相对于 mynetworks 是针对‘信任的用户端’而设定的,这个 relay_domains 则可以视为‘针对下游 MTA 主机’而设定的。举例来说,如果你这部主机是 mail.kiki.vbird.tsai 的 MX 主机时, 那你就得要在 relay_domains 设定针对整个 kiki.vbird.tsai 这个领域的目标信件进行转递才行。 在预设的情况下,这个设定值是 $mydestination 而已啦。

    你必需要注意的‘Postfix 预设并不会转递 MX 主机的信件’,意思就是说:如果你有两部主机,一部是上游的 MTAup ,一部是下游的 MTAdown ,而 MTAdown 规范的 MX 主机是 MTAup,由 DNS 的 MX 设定值与信件传递方向我们知道任何想要寄给 MTAdown 主机的信件, 都会先经过 MTAup 来转递才行!此时如果那部 MTAup 没有开启帮 MTAdown 进行 relay 的权限时, 那么任何传给 MTAdown 的信件将‘全部都被 MTAup 所退回’!从此 MTAdown 就无法收到任何信件了。

    上一段的说明请您特别再想一想,因为如果你在大公司服务而且你的公司上、下游均有 mail server 时, 并且也有设定 MX 的状况下,嘿嘿!这个 relay_domains 就很重要啦!上游的 MTA 主机必需要启动这个设定。 一般来说除非你是某部 MTA 主机的 MX 源头,否则这个设定项目可以忽略不设定他。 而如果你想要帮你的用户端转递信件到某部特定的 MTA 主机时,这个设定项目也是可以设定的啦。 预设请您保留预设值即可。
    relay_domains = $mydestination
    
  • alias_maps :设定邮件别名
  • 只要指定到正确的档案去即可,这个设定值可以保留预设值啊:
    alias_maps = hash:/etc/aliases
    alias_database = hash:/etc/aliases
    
    在了解上述的设定后,以鸟哥的范例来看的话,我有更动过的设定值以及相关档案是这样处理的:
    [root@linux ~]# vi /etc/postfix/main.cf
    myhostname = linux.vbird.tsai
    myorigin = $myhostname
    inet_interfaces = all
    mydestination = $myhostname, localhost.$mydomain, localhost,
         www.vbird.tsai, ftp.vbird.tsai
    mynetworks = 127.0.0.0/8, 192.168.1.0/24, hash:/etc/postfix/access
    relay_domains = $mydestination
    # 其他的设定值就先保留预设值即可啊!
    
    [root@linux ~]# postmap hash:/etc/postfix/access
    [root@linux ~]# postalias hash:/etc/aliases
    
    然后准备来启动啦!你可以这样处理喔:
    1. 先检查设定档的语法是否有错误
    [root@linux ~]# postfix check   <==如果没有出现任何讯息,表示没有问题。
    
    2. 启动与观察 port number
    [root@linux ~]# /etc/init.d/postfix restart
    [root@linux ~]# netstat -tlunp | grep ':25'
    tcp  0   0 0.0.0.0:25    0.0.0.0:*   LISTEN   20850/master
    
    很简单吧!这样就设定妥当了,你的 Postfix 已经可以开放用户端进行转递,并且也可以收受信件啰! 不过,到底在预设的情况下我们的 postfix 可以收下哪些信件?又可以针对哪些设定值的内容进行转递呢? 这就得要参考下一小节的说明了。


    小标题的图示信件传送流程与收信、relay 等重要观念
    我想,您对于 MTA 的设定与收发信件应该有一定程度的概念了,不过要妥善设定好你的 MTA 时, 尤其是想要了解到整部 MTA 是如何收、发信件时,你最好还是要知道‘我这部 MTA 如何接受来源主机所传来的信件,以及将信件转递到下一部主机去’的整个流程啊。 一般来说一封邮件传送会经过许多的流程为:
    1. 送信端与收信端两部主机间会先经过一个握手 (ehlo) 的阶段,此时送信端被记录为发信来源(而不是 mail from)。 通过握手后就可以进行信件标头 (header) 的传送;

    2. 此时收信端主机会分析标头的资讯,若信件之 Mail to: 主机名称为收信端主机,且该名称符合 mydestination 的设定,则该信件会开始被收下至伫列,并进一步送到 mailbox 当中; 若不符合 mydestination 的设定,则终止连线且不会进行信件内容 (body) 的传送;

    3. 若 Mail to: 主机名称非为收信端本身,则开始进行转递 (relay) 的分析。

    4. 转递过程首先分析该信件的来源是否符合信任的用户端 (这个用户端为步骤 1 所记录的发信主机喔) ,亦即来源是否符合 mynetworks 的设定值, 若符合则开始收下信件至伫列中,并等待 MDA 将信件再转递出去,若不符 mynetworks 则继续下一步;

    5. 分析信件来源或目标是否符合 relay_domains 的设定,若符合则信件将被收下至伫列,并等待 MDA 将信件再转递出去;

    6. 若这封信的标头资料都不合乎上述的规范,则终止连线,并不会接受信件的内容资料的。
    整个流程有点像底下这样:

    邮件传输方向
    图四、邮件传输方向

    也就是说标头分析通过后,你的信件内容才会开始上传到主机的伫列,然后透过 MDA 来处理该信件的流向。 而不是将信件完整的传送到主机后才开始分析的喔!这个得要特别注意呐!而透过上述的流程后, 在暂不考虑 access 以及 MDA 的分析机制中,一部 MTA 想要正确的收、发信件时,电子邮件必需要符合:
    • 收信方面:必需符合底下需求:
      1. 发信端必需符合 $inet_interfaces 的设定;
      2. 信件标头之收件者主机名称必需符合 $mydestination 的设定, 或者收件主机名称需要符合 $virtual_maps (与虚拟主机有关) 的设定;

    • 转递方面:必需符合底下需求:
      1. 发信端必需符合 $inet_interfaces 的设定;
      2. 发信端来源必需为 $mynetworks 的设定;发信端来源或信件标头之收件者主机名称符合 $relay_domains 之设定内容。
    同样的原理与想法你可以将他用在 sendmail 的设定当中喔! ^_^!不过很多垃圾信却是藉由这个预设的收发管道来发送, 怎么说呢?请看底下的分析:

    例题:
    在我的主机上面竟然发现这样的广告信,那就是‘利用我的主机发送广告信给我自己!’ 为什么这样也可以呢?
    答:
      首先,你必需要熟悉一下上述的流程,在第 2 个步骤当中我们知道,当主机收到一封信且这封信的目标是自己, 并且也符合 mydestination 的设定时,该信件就会被收下来而不必验证用户端是否来自于 mynetworks 了。 所以说,任何人都可以用这个流程来寄信给你啊。不过,你的 MTA 并不是 open relay 啦, 不会帮人家发送广告信的,不用担心。

    例题:
    我的主机明明没有 Open relay ,但很多其他的 MTA 管理员发信给我,说我的主机的某个帐号持续发送广告信, 但是我的主机明明没有那个帐号啊!这是怎么回事?
    答:
      仔细看一下流程的步骤 1 与 2 ,确认该封信能否被收下来与发信端及收信端主机名称有关。 而我们知道在邮件的 header 里面还有一个 mail from 的标头设定项目,这个标头设定是我们在查阅邮件时看到的‘回邮位址’, 这个资料是可以伪造的!而且他与收发信件的资料无关!所以,您应该要告知对方 MTA 管理员, 请他提供详细的 log 资料,才能够判断该封信是否由你的主机所发送出去的。

      一般来说,目前的广告业者很多都是利用这种欺敌的方式来处理的,所以您必需要请对方提供详细的 log file 资料以供查验才行喔!


    小标题的图示设定邮件主机使用权限与过滤机制 /etc/postfix/access
    基本上,指定了 Postfix 的 mynetworks 就能够让使用者 relay 了,不过如果你依照鸟哥上述的方式来设定你的 mynetworks 的话,那么我们还可以利用 access 这个档案来额外管理我们的信件过滤呢! 基本的 access 语法再说明一次:
      规范的范围或规则             Postfix 的动作
      IP/部分IP/主机名/Email等     ACCEPT/REJECT
    假设你想要让 140.116.44.202 还有 .edu.tw 可以使用这部 MTA 来转递信件,且不许 av.com 以及 192.168.100.0/24 这个网域的使用时,可以这样做:
    [root@linux ~]# vi /etc/postfix/access
    140.116.44.202		ACCEPT
    .edu.tw			ACCEPT
    av.com			REJECT
    192.168.100		REJECT
    # ACCEPT 表示可接受,而 REJECT 则表示拒绝。
    
    [root@linux ~]# postmap hash:/etc/postfix/access
    
    用这个档案设定最大的好处是,你不必重新启动 postfix ,只要将资料库建立好,立刻就生效了! 不过这个档案的进阶设定还需要 main.cf 内的其他规范有设定才行!如果只是之前 $mynetworks 的设定值时, 你只能利用上述的方式来开放 relay 的能力。不过,至少他可以让我们的设定简化啰! ^_^


    小标题的图示设定邮件别名
    想一想,你的主机里面不是有很多系统帐号吗?例如 named, apache, mysql..., 那么以这些帐号执行的程式若有讯息发生时,他会将该讯息以 email 的方式传给谁? 原则上是传给 root 这个管理员。不过,为啥会传给 root 啊?这是因为其他的系统帐号并没有密码可登入, 自然也没有接收邮件的必要。所以若有邮件就给系统管理员啰。不过,咱们的 MTA 怎么知道这些信件要传给 root ? 这就得要 aliases 这个邮件别名设定档来处理啦!

    在你的 /etc/aliases 档案内,你会发现类似底下的字样:
    [root@linux ~]# vi /etc/aliases
    mailer-daemon:  postmaster
    postmaster:     root
    bin:            root
    daemon:         root
    adm:            root
    ....底下省略....
    
    左边是‘别名’右边是‘实际存在的使用者帐号或者是 email address’!就是透过这个设定值, 所以让我们可以将所有系统帐号所属的信件通通丢给 root 啊!好,我们现在将他扩大化,假如你的 MTA 内有一个实际的帐号名称为 dmtsai ,这个使用者还想要使用 dermintsai 这个名称来收他的信件, 那么你可以这样做:
    [root@linux ~]# vi /etc/aliases
    dermintsai:     dmtsai
    # 左边是你额外所设定的,右边则是实际接收这封信的帐号!
    
    [root@linux ~]# postalias hash:/etc/aliases
    
    从此之后不论是 dmtsai@linux.vbird.tsai 还是 dermintsai@linux.vbird.tsai 都会将信件丢到 /var/spool/mail/dmtsai 这个信箱当中喔!很方便吧!

  • 让系统管理员的一般帐号可接收 root 的信
  • 假设你是系统管理员,而你常用的一般帐号为 dmtsai ,但是系统出错时的重要信件都是寄给 root 啊, 偏偏 root 的信件不能被直接读取....所以说,如果能够将‘给 root 的信也转寄一份给 dmtsai ’的话, 那就太好了!可以达到吗?当然可以!你可以这样做:
    [root@linux ~]# vi /etc/aliases
    root:		root,dmtsai
    # 信件会传给 root 与 dmtsai 这两个帐号!
    
    root:		dmtsai
    # 从此 root 收不到信了,都由 dmtsai 来接受!
    
    [root@linux ~]# postalias hash:/etc/aliases
    
    上面那两行你可以择一使用,看看 root 要不要保留他的信件都可以的!其实这样一来, 你的 dmtsai 可以收到 root 的信,且 root 自己也可以‘备份’一份在他的信箱内,比较安全啦!

  • 发送群组寄信功能
  • 想像一个情况,如果你是学校的老师,你虽然只带一班,但是‘每年都一班’时,如果有一天你要将信发给所有的学生, 那在写 email 的标头时,可能就会头昏昏的了!这个时候你可以这样做: (假设主机上学生的帐号为 std001, std002... )
    [root@linux ~]# vi /etc/aliases
    student95:	std001,std002,std003,std004...
    
    [root@linux ~]# postalias hash:/etc/aliases
    
    如此一来只要寄信到这部主机的 student95 这个不存在的帐号时, 该封信就会被分别存到各个帐号里头去,管理上面是否很方便啊! ^_^

    事实上,邮件别名除了填写自己主机上面的实体用户之外,其实你可以填写外部主机的 email 喔! 例如你要将本机的 dermintsai 那个不存在的用户的信件除了传给 dmtsai 之外,还要外传到 dmtsai@mail.kiki.vbird.tsai 时,可以这样做:
    [root@linux ~]# vi /etc/aliases
    dermintasi:	dmtsai,dmtsai@mail.kiki.vbird.tsai
    
    [root@linux ~]# postalias hash:/etc/aliases
    
    很方便吧!更多的功能就期待您自行发掘啰!


    小标题的图示邮件转递 ~/.forward
    虽然 /etc/aliases 可以帮我们达到邮件别名设定的好处,不过 /etc/aliases 是只有 root 才能修改的档案权限, 那我们一般使用者如果也想要进行邮件转递时,那该如何是好?没关系,可以透过自己家目录下的 .forward 这个档案喔! 举例来说,我的 dmtsai 这个帐号所接收到的信件除了自己要保留一份之外,还要传给本机上的 vbird 以及 dmtsai@mail.kiki.vbird.tsai 时,那你可以这样做设定:
    [dmtsai@linux ~]$ vi .forward
    # 注意!我的身份现在是 dmtsai 这个一般身份,而且在他的家目录下!
    dmtsai
    vbird
    dmtsai@mail.kiki.vbird.tsai
    
    [dmtsai@linux ~]$ chmod 644 .forward
    
    记得这个档案内容是一行一个帐号 (或 email) ,而且权限方面非常重要:
    • 该档案所在使用者家目录权限,其 group、other 不可以有写入权限。
    • .forward 档案权限,其 group、other 不可以有写入权限。
    如此一来这封信就会开始转递啰!有趣吧! ^_^


    小标题的图示察看信件伫列资讯
    说实话,设定到此为止咱们的 postfix 应该可以应付一般小型企业之 mail server 的用途了! 不过,有的时候毕竟因为网路的问题或者是对方主机的问题,可能导致某些信件无法送出而被暂存在伫列中, 那我们如何了解伫列当中有哪些邮件呢?还有,在伫列当中等待送出的信件是如何送出的呢?
    • 如果该封信在五分钟之内无法寄出,则通常系统会发出一封‘警告信’给原发信者, 告知该封邮件尚无法被寄送出去,不过,系统仍会持续的尝试寄出该封邮件;
    • 如果在四小时候仍无法寄出,系统会再次的发出警告信给原发信者;
    • 如果持续进行五天都无法将信件送出,那么该封邮件就会退回给原发信者了!
    当然啦,某些 MTA 已经取消了警告信的寄发,不过原则上,如果信件无法即时寄出去的话 MTA 还是会努力尝试 5 天的,如果接下来的 5 天都无法送出时,才会将原信件退回给发信者。 一般来说,如果 MTA 设定正确且网路没有问题时,应该是不可能会有信件被放在伫列当中而传不出去的, 所以如果发现有信件在伫列时,当然得要仔细的瞧一瞧啰!检查伫列内容的方法可以使用 mailq , 也可以使用 postqueue -p 来检查的:
    [root@linux ~]# postqueue -p
    Mail queue is empty
    
    若您的邮件如此显示时,恭喜您,没有什么问题邮件在伫列当中。不过如果你将 postfix 关闭, 并尝试发一封信给任何人,那就可能会出现如下的画面啦:
    [root@linux ~]# /etc/init.d/postfix stop
    [root@linux ~]# echo "test" | mail -s "testing queue" root
    [root@linux ~]# postqueue -p
    postqueue: warning: Mail system is down -- accessing queue directly
    -Queue ID- --Size-- ----Arrival Time---- -Sender/Recipient-------
    9C2D1A26AC       71 Thu Nov 23 14:59:31  root
                                             root
    
    -- 0 Kbytes in 1 Request.
    # 第一行就说明了无法寄出的原因为 Mail system is down 啦!
    # 然后才出现无法寄出的信件资讯!包括来源与目标喔!
    
    输出的资讯主要为:
    • Queue ID:表示此封邮件伫列的代表号 (ID),这个号码是给 MTA 看的,我们看不懂不要紧;
    • Size :这封信有多大容量 (bytes) 的意思;
    • Arrival Time:这封信什么时候进入伫列的,并且可能会说明无法立即传送出去的原因;
    • Sender/Recipient:送信与收信者的电子邮件啰!
    事实上这封信是放置在 /var/spool/postfix 里面,由于信件内容已经编码为给 MTA 看的资料排列, 所以你可以使用 postcat 来读出原信件的内容喔!例如这样做 (注意看档名与 Queue ID 的对应!):
    [root@linux ~]# cd /var/spool/postfix/maildrop
    [root@linux maildrop]# postcat 9C2D1A26AC  <==这个档名就是 Queue ID
    *** ENVELOPE RECORDS 9C2D1A26AC *** <==说明伫列的编号啊
    sender_fullname: root               <==底下两个为发信者大名与 email
    sender: root
    recipient: root                     <==收信者为谁的意思啊!
    *** MESSAGE CONTENTS 9C2D1A26AC *** <==底下则是信件的内容喔!
    To: root
    Subject: testing queue
    
    test
    *** HEADER EXTRACTED 9C2D1A26AC ***
    *** MESSAGE FILE END 9C2D1A26AC ***
    
    如此一来你就知道目前我们的 MTA 主机有多少未送出的信件,还有未送出信件的内容你也可以追踪的到了! 很不错,对吧!不过,如果你想要我们的 postfix 立刻尝试将这些在伫列当中的信件寄出去,那又该如何是好? 你有几个作法啦,可以重新启动 postfix ,也可以透过 postfix 的动作来处理,例如:
    [root@linux ~]# /etc/init.d/postfix restart
    [root@linux ~]# postfix flush
    
    鸟哥个人比较建议使用 postfix flush 啰!自行参考看看先! ^_^


    小标题的图示设定 relay 的进阶功能 smtpd_recipient_restrictions
    我们在前几节介绍过一封邮件进入 MTA 时该信件是否会被接受的几个大原则, 还有与 postfix 设定值相关的几个重要参数。事实上一封邮件在 postfix 里面能否被转递 (relay) 与 /etc/postfix/main.cf 里面的 smtpd_recipient_restrictions 这个设定值有关啦! 这个设定值预设不存在于 main.cf 当中,你可以使用‘ man 5 postconf ’找到这个设定值的说明。

    smtpd_recipient_restrictions 就字面上的意思来说是‘SMTPD 这个 daemon 的接受者 (就是自己啊) 之限制’, 所以这个设定项目可以指定‘当要 relay 时,MTA 应该要参考什么设定值;以及当要接受本机信件时, 应该要参考哪些设定项目’的意思, 在预设的情况下这个设定值只有两个项目,分别是‘ permit_mynetworks, reject_unauth_destination ’, 是有‘顺序’之分的喔!

    上述的预设参数值最终造成前面提到的信件传送流程啦! 不过有时你可能需要添加几个新功能,举例来说,你想要让 Internet 上面的任何一个 IP 都可以透过你的 MTA 来寄信时,那得要开启所谓的 SMTP 认证机制,此时你就得要将该认证机制写入这个设定参数当中才行! 另外,如果你想要拒绝黑名单的来源与目标主机,那也是得要在这个参数后面加入额外的资料啊! 总之,你需要对这个参数很了解就是了!更多相关的功能我们会在后续加以介绍的啦!


    大标题的图示让你的 MTA 接受 MUA 的读信要求:POP/IMAP等协定
    不管你的 MTA 使用的是 sendmail 还是 postfix ,你还是得要配合 POP3/IMAP 这个提供使用者端来收信的协定才行! 在早期的系统当中, POP3 使用的是 imap 这个套件提供的功能,不过近来提供此一协定的套件很多, 每种系统都可能不太相同。举例来说,咱们的 CentOS (Red Hat 系统) 使用的是鸽舍 (dovecot) 软体套件, 至于 SuSE 则提供 qpopper 这个套件说。

    启动单纯的 POP3 是很简单的啦,你得要先确定已经安装了 dovecot 这个软体。 而这个软体的设定档只有一个,就是 /etc/dovecot.conf 。我们仅要启动 pop3 而已, 所以可以这样设定即可:
    [root@linux ~]# vi /etc/dovecot.conf
    # 找到底下这一行,大约是在第 14 行左右的地方
    #protocols = imap imaps
    # 将他改成底下这个样子:
    protocols = pop3
    
    # 找到底下这一行,大约是在第 22 行左右的地方
    pop3_listen = [::]
    # 如果只想要接受 IPv4 的位址,将他改成底下这个样子:
    pop3_listen = *
    
    改完之后你就可以启动 dovecot 啰!并且检查看看 port 110 有没有启动啊?
    [root@linux ~]# /etc/init.d/dovecot start
    [root@linux ~]# netstat -tlnp | grep ':110'
    tcp 0  0 0.0.0.0:110   0.0.0.0:*  LISTEN   25335/dovecot
    
    耶!搞定!这样就可以提供使用者来收发信件啦!真是不错啊!不过记得喔,我们只提供基本的明码 pop3 传输而已, 如果想要启动其他如 pop3s (传输加密机制) 协定时,就得要额外的设定啰! 接下来让我们看看用户端如何使用我们的邮件伺服器吧~ ^_^


    大标题的图示用户端的收发信软体 (MUA)
    设定 Mail server 不是拿来好看的,当然是要好好的应用他啰!应用 mail server 有两种主要的方式, 你可以直接登入 Linux 主机来操作 MTA ,当然也可以透过用户端的 MUA 软体来收发信件, 底下我们分别介绍这两种方式啰!


    小标题的图示Linux mail
    在 Unix like 的作业系统当中都会存有一支可以进行收发信件的软体,那就是‘ mail ’这个指令。 这个指令是由 mailx 这个套件所提供的,所以您得要先安装这个套件才行。 另外,由于 mail 是 Linux 系统的功能,所以即使你的 port 25 (smtp) 没有启动, 他还是可以使用的,只是该封邮件就只会被放到伫列,而无法寄出去啰!^_^!底下我们来谈一谈最简单的 mail 用法吧

  • 用 mail 直接编辑文字邮件与寄信
    mail 的用法很简单,就是利用‘ mail [email address] ’的方式来将信件寄出去, 那个 [email address] 可以是对外的邮件位址,也可以是本机的帐号。如果是本机帐号的话,可以直接加帐号名称即可。 例如:‘ mail root ’或‘ mail somebody@his.host.name ’。如果是对外寄信的时候, 信件预设的‘ Mail from ’就会填写 main.cf 内那个 myorigin 变数的主机名称啰! 先来试看看吧!寄给 dmtsai@linux.vbird.tsai 先:
    [root@linux ~]# mail dmtsai@linux.vbird.tsai
    Subject: Just test        <==这里填写信件标题
    This is a test email.     <==底下为信件的内容!
    bye bye !
    .                         <==注意,这一行只有小数点!代表结束输入之意!
    Cc:                       <==密件副本啦!
    
    这样就可以将信件寄出去了!另外,早期的 mail server 是可以接受 IP 寄信的,举例来说: mail dmtsai@[192.168.1.254] ,记得 IP 要用中括号包起来。不过由于受到垃圾邮件的影响, 现在这种方式几乎都无法成功的将信件寄出了。

  • 利用已经处理完毕的‘纯文字档’寄出信件
    这可不是‘附件夹带’的方式!因为在 mail 这个程式里面编辑信件是个很痛苦的差事, 你不能够按上下左右键来回到刚刚边极有错误的地方,很伤脑筋。此时我们可以透过标准输入来处理! 如果你忘记‘ < ’代表的意义,请回到基础学习篇书中的 Bash shell 章节好好瞧瞧先。 举例来说你要将家目录的 .bashrc 寄给别人,可以这样做:
    [root@linux ~]# mail -s 'My bashrc' dmtsai < ~/.bashrc
    
  • 开始接收信件
    寄信还比较简单,那么收信呢?同样的收信还是使用 mail。直接在提示字元之后输入 mail 时,会主动的捉取使用者在 /var/spool/mail 底下的邮件信箱 (mailbox),例如我 dmtsai 这个帐号在输入 mail 后,就会将 /var/spool/mail/dmtsai 这个档案的内容读出来并显示到荧幕上,结果如下:
    [root@linux ~]# mail
    Mail version 8.1 6/6/93.  Type ? for help.
    "/var/spool/mail/dmtsai": 1 message 1 unread
    >U  1 root@linux.vbird.tsai  Fri Nov 24 11:34  32/764   "My bashrc"
    &  <==这个是 mail 软体的提示字元,可以输入 ? 来察看可用指令
    
    在上面的话面中,显示 dmtsai 有一封信,且会附上该信件的发信者与标题及收信时间等。 你可以用的指令有这些:
    • 读信: (直接按 Enter 或输入数字后 enter)
      有看到‘>’那个符号吧!那表示目前 mail 所在的邮件栏位,你可以直接输入 Enter 即可看到该封信件的内容! 另外,你也可以在‘&’之后的游标位置输入号码,就可以看该封信件的内容了! (注:如果持续按 Enter ,则会自‘ > ’符号所在的邮件逐次向后读取每封信件内容!)

    • 显示标题: (直接数入 h 或输入 h 数字)
      如果要重新显示每封信的标题,可以输入 h 即可;

    • 回覆邮件: (直接输入 R )
      如果要回覆目前‘ > ’符号所在的邮件, 直接按下‘R’即可进入刚刚前面介绍过的 mail 文字编辑画面啰!你可以编辑信件后传回去啰!

    • 删除邮件: (输入 d 数字)
      按下‘ d## ’即可删除邮件!例如我要删除掉第 2 封邮件,可以输入‘d2’如果是要删除第10-50封邮件,可以输入‘d10-50’来删除喔! 请记得,如果有删除邮件的话,离开 mail box 时,要使用‘q’才行!

    • 储存邮件到档案: (输入 s 数字 档名)
      如果要将邮件资料存下来,可以输入‘ s ## filename’,例如我要将上面第一封邮件存下来,可以输入‘ s 1 uuencode ’即可将第一封邮件内容存成 uuencode 这个档案!

    • 离开 mail: (输入 q 或 x )
      要离开 mail 可以输入 q 或者是 x ,请注意‘输入 x 可以在不更动 mail box 的情况下离开 mail 程式,不管你刚刚有没有使用 d 删除资料;使用 q 才会将删除的资料移除,并且会将所有已读过的信件内容转存到你家目录下的 mbox 档案!’也就是说,如果你不想更动 mail box 那就使用 x 或 exit 离开,如果想要使刚刚移除的动作生效,就要使用 q 啦!不过,使用 q 之后,只有未读的信件才会保留在 /var/spool/mail/accout 里面,其他已读的资料都会被存入 ~/mbox 当中!例如 /home/dmtsai/mbox 为储存 dmtsai 已读过的信件!

    • 请求协助
      关于 mail 更详细的用法可以输入 help 就可以显现目前的 mail 所有功能!
    上面是简易的 mail 收信功能!不过,如果离开 mail 时按下 q ,不是会有信件转存到 ~/mbox 这个邮件信箱吗?那么我要如何读取这个档案内的信件资料呢?可以简单的使用这个方式来读取:
    [root@linux ~]# mail -f ~/mbox
    
  • 以‘附件夹带’的方式寄信
    前面提到的都是信件的内容,那么有没有可能以‘附件’的方式来传递档案? 是可以的,不过你需要 uuencode 这个指令的帮忙,在 CentOS 当中这个指令属于 sharutils ,请先利用 yum 来安装他吧!接下来你可以这样使用:
    [root@linux ~]# [利用 uuencode 编码 ] | [利用 mail 寄出去]
    [root@linux ~]# uuencode [实际档案] [信件中的档名] | mail -s '标题' email
    
    范例一:将 ~/.bashrc 以附件夹带的方式寄给 dmtsai
    [root@linux ~]# uuencode ~/.bashrc bashrc | mail -s 'test encode' dmtsai
    
    这样就能寄出去了,不过,如果收下这封信件呢?同样的我们得要透过解码器来解码啊! 你得先将该档案存下来,然后这样做:
    [root@linux ~]# mail
    Mail version 8.1 6/6/93.  Type ? for help.
    "/var/spool/mail/dmtsai": 2 messages 2 unread
    >U  1 root@linux.vbird.tsai  Fri Nov 24 11:34  32/764   "My bashrc"
     U  2 root@linux.vbird.tsai  Fri Nov 24 11:52  24/904   "test encode"
    & s 2 test_encode
    "test_encode" [New file]
    & exit
    
    [root@linux ~]# uudecode test_encode -o decode
                                 加密档         输出档
    
    虽然 mail 这个指令不是挺好用的,不过至少他可以提供我们在 Linux 纯文字模式下的一个简单的收发信件功能! 我们最好还是熟悉一下吧! ^_^


  • 小标题的图示Linux telnet
    刚刚的 mail 也算是一支简单的软体在进行收发信件,那如果你想要直接透过 smtp 以及 pop3 来收发信件呢? 其实你可以透过 telnet 的功能来直接连线到该服务上头! 不过,因为完全得要敲击指令来处理,所以底下的练习真的仅做为参考用啦!
    先来练习寄信看看:
    [root@linux ~]# telnet localhost 25
    Trying 127.0.0.1...
    Connected to localhost.
    Escape character is '^]'.
    220 linux.vbird.tsai ESMTP Postfix
    ehlo localhost   <==进行握手!很重要!
    250-linux.vbird.tsai  <==底下为本 SMTP 服务所提供的功能
    250-PIPELINING
    250-SIZE 10240000     <==单封信件的最大容量!
    250-VRFY
    250-ETRN
    250 8BITMIME
    mail from: "VBird"<dmtsai@linux.vbird.tsai> <==设定来源位址
    250 Ok
    rcpt to: <root@linux.vbird.tsai>            <==设定收信位址
    250 Ok
    data                                        <==确定内容撰写开始
    354 End data with <CR><LF>.<CR><LF>
    This is a test mail    <==开始写内容啦!
    Just test ! bye bye!
    .                      <==离开不要忘记的一个小数点!
    250 Ok: queued as CC8CFA26AC
    quit
    
    这样就能够将信放置到伫列当中,并且等待寄出啦!比较麻烦的是你必需要手动输入 header 与 body 的所有项目, 包括‘mail from:’‘rcpt to:’等等,且在这两个设定值后方的 email 必需要以括号圈起来,例如:
      MAIL FROM: usersname<userid@hostname.domainname>
      MAIL FROM: "users name"<userid@hostname.domainname>
    另外许多 MTA 目前都会限制再使用 MAIL FROM 时要先使用 HELO或者是 EHLO 先打招呼过,要不然会不允许进行后续沟通。 好了,那么直接收信呢?可以这样做!
    [root@linux ~]# telnet localhost 110
    Trying 127.0.0.1...
    Connected to localhost.
    Escape character is '^]'.
    +OK dovecot ready.
    user dmtsai         <==输入你的帐号啊!
    +OK
    pass your_password  <==输入你的密码啊!
    +OK Logged in.
    list                <==列出你有的信件啊!
    +OK 3 messages:       <==底下为信件的资料,共有三封
    1 912
    2 1016
    3 675
    .
    retr 2              <==开始接收第二封信件内容之意
    +OK 1016 octets
    ....信件内容输出省略....
    quit                <==离开 telnet 啰
    +OK Logging out.
    
    这样就能够透过 telnet 连线到本机上头进行收、发信件的功能了!不过,真是不好用啊! 所以我们底下来介绍一个可以跨平台的视窗介面软体,学这一套就好了, 因为他是跨平台,所以您可以在任何作业系统上面使用这套好用的咚咚呐!


    小标题的图示Thunderbird 好用的跨平台 (Windows/Linux X) 软体
    自由软体最大的好处之一就是该软体大多可以进行移植,也就是在任何作业系统上面几乎都能够执行该软体的意思。 因此学习自由软体的好处就是,你不必因为转换作业系统而学习不同的操作环境! 邮件使用者介面软体 (MUA) 也有自由软体了!那就是 Mozilla 基金会推出的 ThunderBird (雷鸟) 这个好用的咚咚, 你可以在底下的网址上面找到繁体中文的套件:
    有鉴于目前用户端还是以 Windows 作业系统为大宗,所以底下的说明主要是在 Windows XP (sp2) 上头的安装与设定为主。虽然目前 (2006/12) 最新的 Thunderbird 已经出到 1.5.x 了, 不过繁体中文版更新的速度似乎无法跟的上,所以鸟哥底下以可以捉到的最新繁体中文版, 亦即 1.0.6 这个版本来作为介绍啰。

    在你下载原始的安装档案后,直接双击下载的档案就会进入安装的画面了。 安装真是太简单了!就是一直给他‘下一步’而已,最后有个‘马上执行 Thunderbird ’, 你可以选择他,然后就会出现是否要汇入‘Outlook Express’或者是‘Outlook’等其他邮件代理人程式已经建立的帐号资料, 如果您从未建立过帐号资料,那么这个地方可以略过,如果你要将系统上面已经存在的 OE 资料给他转移到雷鸟上, 就选择汇入吧!不过鸟哥这里假设从来没有使用过 OE,所以选择不汇入任何资料。

    Thunderbird 的使用
    图五、Thunderbird 的使用

    Tips:
    事实上 Outlook Express 这个 Windows 预设的邮件收发软体在比较大量的邮件收发过程当中, 偶而会出现一些错误的问题,尤其是档案大于 2GB 以上以及常常删除一些无用的信件, 却忘记进行 OE 所谓的‘压缩’时,会造成挺严重的错误,最严重的情况下您所有的信件都可能会遗失。 使用上必需要特别小心一些操作行为。您可以玩一玩雷鸟,比较一下两者的差异喔!
    鸟哥的图示
    由于 Thunderbird 可以提供多种资讯的下载,所以我们必须要自行指定所需要的帐号资料才行。 如下图所示,我们指定的是 Email 的帐号喔!点选他,然后给他下一步吧!

    Thunderbird 的使用
    图六、Thunderbird 的使用

    首先要你填写的并不是实际的帐号资料,而是你想要‘收信者看到的属于你的资讯’而已。 在‘大名’的部分可填写你的昵称或实际大名;在 Email 位址则请填写希望对方‘回信时的 email ’。 其实这里就是邮件 Header 部分的‘ Mail from: "大名"<email> ’啦! 你得要注意的是,如果 email 填写错误,收件者直接‘回信’时,将无法寄达正确的地方喔!

    Thunderbird 的使用
    图七、Thunderbird 的使用

    再来才是重要的收、发信件的邮件主机所在处,你可以在收件伺服器及伺服器名称部分填写主机名称, 当然也可以直接填写 IP 的啦!一般在 LAN 内的 private IP 鸟哥都使用 IP 来填写而已说! ^_^

    Thunderbird 的使用
    图八、Thunderbird 的使用

    你要用什么帐号来收信啊?这里真的不能写错了喔!

    Thunderbird 的使用
    图九、Thunderbird 的使用

    底下的帐号名称其实只是一个提醒的名字而已,所以你可以直接使用 email 来作为这个帐号的提示名称即可。

    Thunderbird 的使用
    图十、Thunderbird 的使用

    如果如下所示,一切都没有问题时,就按下那个‘立即下载邮件’并且按下‘完成’吧!

    Thunderbird 的使用
    图十一、Thunderbird 的使用

    最终结果终于出现啦!就是底下的样子!左边是一些信匣,右边上方则是各个信件的标头, 右边下方则是实际的信件内容啊!

    Thunderbird 的使用
    图十二、Thunderbird 的使用

    更多的 Thunderbird 使用就请自行参考线上的说明文件来玩玩吧! 不会很难啦!与常用 Outlook express 的朋友来说,你会觉得他根本与 OE 就是一模一样嘛! 操作操作也就熟悉啰! ^_^


    大标题的图示邮件主机的进阶设定:
    Sendmail 常常被传成‘安全性很差的邮件伺服器!’当然, Sendmail 官方网站也很不满的回应说‘ 其实, Sendmail 的问题来自于一些"该死的"档案权限设定错误的状况! ’也就是说,其实 sendmail 常常会因为‘系统管理员’设定档案或者目录不良的情况下,导致 Mail Server 发生问题啰!其实不止 sendmail ,绝大部分的网路伺服器都有这个问题啊! 所以,底下我们就来说一说与 Mail server 有关的安全性与其他相关的安全方面设定吧!


    小标题的图示一些设定档所需要注意的‘权限’问题
    这部份我们以 Sendmail 官方网站的建议来说明喔!其实也适用于 postfix 的啦! 其中,大部分是在于‘目录与档案权限’的设定要求上面:
    • 请确定 /etc/aliases 这个档案的权限,仅能由系统信任的帐号来修改,通常其权限为 644 ;
    • 请确定 Mail server 读取的资料库 (多半在 /etc/mail/ 或 /etc/postfix/ 底下的 *.db 档案),例如 mailertable, access, virtusertable 等等,仅能由系统信任的使用者读取,其他一概不能读取,通常权限为 640 ;
    • 系统的伫列目录 (/var/spool/mqueue 或 /var/spool/postfix) 仅允许系统读取,通常权限为 700 ;
    • 请确定 ~/.forward 这个档案的权限也不能设定成为任何人均可查阅的权限,否则您的 e-mail 资料可能会被窃取~
    • 总之,一般用户能够不用 ~/.forward 与 aliases 的功能,就不要使用!
    不过整体的使用上还是需要身为网站管理员的您多费心啊!


    小标题的图示简单的广告信抵挡机制: postgrey 的动作
    早期的广告信很多都是藉由僵尸电脑 (已经被当作跳板但管理员却没有发现或没有处理的主机) 来发送的, 这些僵尸电脑所发送的信件有个很明显的特色,就是‘他只会尝试传送该封电子邮件一次, 不论有无成功,该封信就算发出去了,故该信件将被移出伫列中。’ 不过,合法的 mail server 运作流程就如之前分析的一般,在邮件无法顺利寄出时该邮件会暂时放置到伫列中一段时间, 并一直尝试将信件寄出的动作,预设直到五天后若还是无法寄出才会将信件退回。

    根据这个合法与非法的邮件伺服器运作流程而发展出一套所谓的曙光 (postgrey) 软体, 您可以参考底下的几个说明来处理这个软体:
    基本上 postgrey 主要的功能是在记录发信来源而已,若发信来源同一封信第一次寄来时, postgrey 预设会抵挡他,并且将来源位址记录起来,在约 5 分钟后,若该信件又传来一次时, 则该信件会被收下来。如此则可以杜绝非发邮件伺服器单次发送的问题喔! ^_^! 但对于你确定合法的主机则可以开放所谓的‘白名单 (whitelist) ’来优先通过而不抵挡。 所以说,他主要是这样进行的:(参考http://projects.puremagic.com/greylisting/whitepaper.html)
    1. 确认发信来源是否在白名单中,若是则予以通过;
    2. 确认收信者是否在白名单中,若是则予以通过;
    3. 确定这封信是否已经被记录起来呢?放行的依据是:
      • 若无此信件的记录,则将发信位址记录起来,并将信件退回;
      • 若有此信件的记录,但是记录的时间尚未超过指定的时间 (预设 5 分钟) ,则依旧退回信件;
      • 若有信件的记录,且记录时间已超过指定的时间,则予以通过;
    整个过程简单的来说就是这样而已。不过为了要快速的达成 postgrey 的‘记录’能力,所以资料库系统又是不可避免的东西。 且 postgrey 是由 perl 写成的,你可能也需要加入很多相依的 perl 模组才行。 总的来说,你需要的软体至少要有:
    • BerkeleyDB: 包括 db4, db4-utils, db4-devel 等套件:
    • Perl: 使用 yum install perl 即可;
    • Perl 模组: perl-Net-DNS 是 CentOS 本身有提供的,其他没有提供的可以到 http://rpmfind.net/去搜寻下载。
    除了可以使用 yum 来安装的套件之外,其他的套件鸟哥底下作了连结,你可以直接下载看看:
    将下载的这四个 RPM 给他使用 rpm -ivh *.rpm 就能够一口气的安装上去了。然后你就可以尝试启动 postgrey 看看啰:
    [root@linux ~]# /etc/init.d/postgrey start
    [root@linux ~]# netstat -anlp | grep grey
    unix  2 ...中间省略...    /var/spool/postfix/postgrey/socket
    
    由于 postfix 必需要连结到 postgrey 来进行一些名单的确认,然而两者连结的方式除了网路 IP 之外, 传统的 Unix socket 也是可以连结上的!由于传统 socket 不需要额外启动网路连线的埠口, 鸟哥认为这样也比较符合本机独自的操作,所以我们使用这一版 postgrey 的预设 unix socket 来连接啰。 接下来我们必需要修改 postfix 的 main.cf 了!请你这样做吧:
    [root@linux ~]# vi /etc/postfix/main.cf
    # 如果你曾经设定过底下这个设定值,请找到他来修改!否则请自行增加底下的字样:
    smtpd_recipient_restrictions = 
         permit_mynetworks
         reject_unauth_destination
         check_policy_service unix:/var/spool/postfix/postgrey/socket
    # 重点是最后面那一行!就是指定使用 unix socket 来连接到 postgrey 之意。
    # 后续我们还有一些广告信的抵挡机制,特别建议您将这个 postgrey 的设定值写在最后,
    # 因为他可以算是我们最后一个检验的机制喔!
    
    [root@linux ~]# /etc/init.d/postfix restart
    [root@linux ~]# chkconfig postgrey on
    
    然后你可以自己从外部主机寄一封信给自己这部邮件伺服器看看,记得去登录档内查一查 (/var/log/maillog), 应该会出现类似的字眼:

    Nov 27 15:17:09 linux postfix/smtpd[16132]: NOQUEUE: reject: RCPT from sun.linux.tsai[192.168.1.101]: 450 <dmtsai@linux.vbird.tsai>: Recipient address rejected: Greylisted, see http://isg.ee.ethz.ch/tools/postgrey/help/linux.vbird.tsai.html; from=<dmtsai@sun.vbird.tsai> to=<dmtsai@linux.vbird.tsai> proto=ESMTP helo=<sun.vbird.tsai>

    这表示 postgrey 已经开始顺利运作了!并且来源主机的相关记录也已经记载在 /var/spool/postfix/postgrey/ 目录下啰!如此一来您的 postfix 将可以透过 postgrey 来挡掉一些莫名其妙的广告信啰!

    不过 postgrey 也是有缺点的,怎么说呢?因为 postgrey 预设会先将信件退回去, 所以你的信件就可能会发生延迟的问题,延迟的时间可能是数分钟到数小时, 端看你的 MTA 设定而定。如果你想要让‘某些信任的邮件主机不需要经过 postgrey 的抵挡机制’时, 就得要开放白名单啰!

    白名单的开启也很简单啊,直接编写 /etc/postfix/postgrey_whitelist_clients 这个档案即可。 假设你要让鸟哥的邮件主机可以自由的将信寄到你的 MTA 的话,那么你可以在这个档案内加入这一行:
    [root@linux ~]# vi /etc/postfix/postgrey_whitelist_clients
    mail.vbird.idv.tw
    sun.linux.tsai
    # 将主机名称写进去吧!
    
    [root@linux ~]# /etc/init.d/postgrey restart
    
    如果你还有更多信任的主机的话,将他写入这个档案当中!那他就可以略过 postgrey 的分析啰! 更进阶的用法就得要靠您自己去发掘啰! ^_^


    小标题的图示关于黑名单的抵挡机制
    还记得前面讲到的 Open Relay 的问题吧?你的主机可千万不能成为 Open Relay 的状况,否则对你的网路与‘信用’影响很大喔!一般来说,只要是 Open Relay 的邮件主机都会被列入黑名单当中, 例如台湾地区的学术网路黑名单以及网际网路社会上提供的黑名单资料库:
    既然黑名单资料库里面的 mail server 本身就是有问题的邮件主机,那么当黑名单里面的主机想要跟我的 mail server 连线时,我当然可以‘合理的怀疑该信件是有问题的!’您说是吧! 所以来自黑名单或者是要送至黑名单的信件最好是不要接受啦!

    您当然可以自行前往该网站将有问题的主机列表给他加入自己的邮件主机抵挡机制当中, 不过就是不太人性化!既然网际网路社会已经提供了黑名单资料库了,我们就可以利用这个资料库来抵挡嘛! 在决定是否进行 Relay 之前,先要求我们的 postfix 前往追踪黑名单的资料库, 若目标的 IP 或主机名称是黑名单的一员,则我们就将该信件拒绝啰!

    Postfix 设定黑名单检验真的很简单,你只要这样做即可:
    [root@linux ~]# vi /etc/postfix/main.cf
    smtpd_recipient_restrictions =
         permit_mynetworks
         reject_unauth_destination
         reject_rbl_client cbl.abuseat.org
         reject_rbl_client bl.spamcop.net
         reject_rbl_client cblless.anti-spam.org.cn
         reject_rbl_client sbl-xbl.spamhaus.org
         check_policy_service unix:/var/spool/postfix/postgrey/socket
    
    [root@linux ~]# /etc/init.d/postfix restart
    
    上表当中的特殊字体部分‘reject_rbl_client’是 postfix 内的一个设定项目, 后面可以接网际网路上提供的黑名单!您得要注意的是,这个黑名单资料库可能会持续的变动, 请您先以 dig 的方式检查每个资料库是否真的存在,如果存在才加以设定在您的主机上头啊! (因为网际网路上头很多文献所提供的黑名单资料库似乎已经不再持续服务的样子!)

  • 检查你的邮件伺服器是否在黑名单当中?
  • 既然黑名单资料库所记录的是不受欢迎的来源与目标 MTA ,那么您的 MTA 当然最好不要在该资料库中嘛! 同时这些资料库通常也都有提供检测的功能,所以你也可以用该功能来检查你的主机是否‘记录有案’呢? 你可以这样处理的:
    1. 是否已在黑名单资料库中:
      确认的方法很简单,直接到‘http://cbl.abuseat.org/lookup.cgi ’输入您的主机名称或者是 IP ,就可以检查是否已经在黑名单当中;

    2. 是否具有 Open Relay:
      如果要测试你的主机有没有 Open Relay ,直接到‘http://140.111.1.22/tanet/spam.html ’这个网页, 在这个网页的最下方可以输入你的 IP 来检查,注意喔,不要使用别人的 email IP 呐! 此时该主机会发出一封 mail 的测试信看看你的 mail server 会不会主动的代转, 然后将结果回报给您。要注意的是,回传的网页可能有编码的问题,如果出现乱码时,请调整为 big5 编码即可。

    3. 如何移除:
      如果被检查出,您的主机已经在黑名单当中,那么请立刻将 Open Relay 的功能关闭,改善你的 Mail Server 之后,你可能还要到各个主要的 Open Relay 网站进行移除的工作。如果是学术网路的话, 请与您单位的管理员联络。至于一般常见的黑名单资料库则通常会主动的帮您移除,只不过需要一些时间的测试就是了。
    总之您必须要确定你不在黑名单当中,且最好将黑名单的来源给拒绝掉!搞定! ^_^


    小标题的图示开放 SMTP 身份认证之 relay 机制
    图一的流程当中,由 MUA 透过 MTA 来寄发信件时 (具有 Relay 的动作时) ,理论上 MTA 必需要开放用户端来源才行,这就是为啥我们必需要在 main.cf 里头设定 smtpd_recipient_restrictions 那个设定项目的原因了!不过人总有不方便的时候,举例来说, 如果你使用的是拨接制的 ADSL 所以每次取得的 IP 都非固定,那如何使用你的 MTA ? 很麻烦,对吧!这个时候 SMTP 认证或许有点帮助。

    关于 SMTP 认证的使用前面已经稍微提过了,重点在于 MUA 想要使用 MTA 来进行 relay 的时候,MTA 会要求 MUA 来输入认证用的帐号与密码,以取得使用的权限就是了。 咱们的 CentOS 已经有提供内建的认证模组,那就是 Cyrus SASL 这个套件的帮忙啦!

    Cyrus SASL (http://cyrusimap.web.cmu.edu/) 是 Cyrus Simple Authentication and Security Layer 的缩写,他是一个辅助的套件。 在 SMTP 认证方面, Cyrus 主要提供了 saslauthd 这个服务来进行帐号密码的比对动作! 也就是说:当有任何人想要进行邮件转递功能时, Postfix 会联络 saslauthd 请其代为检查帐号密码,若比对通过则允许用户端开始转寄信件。

    好了,如果你想要使用最简单的方式来进行 SMTP 认证功能的话,在 CentOS 当中你应该要这样做:
    1. 安装 cyrus-sasl, cyrus-sasl-devel, cyrus-sasl-plain, cyrus-sasl-md5 等套件;
    2. 启动 saslauthd 这个服务;
    3. 设定 main.cf 让 postfix 可以与 saslauthd 联系;
    4. 用户端必需要在寄信时设定‘邮件主机认证’功能。
    如此一来用户端才能够启动 SMTP AUTH 喔!关于软体安装方面,请使用 yum 直接安装吧! 不再多啰唆!底下我们由启动 saslauthd 这个服务开始吧!


  • 启动 saslauthd 服务
  • saslauthd 是 Cyrus-SASL 提供的一个帐号密码比对管理机制,虽然他只能利用简单的 PLAIN 机制进行密码验证, 不过在设定上较为简单。 saslauthd 可以连结很多帐号密码管理机制,包括 LDAP, PAM, SASLDB2 以及 SQL 资料库系统等等。如果我们想要直接使用 Linux 系统上面的使用者资讯, 也就是 /etc/passwd, /etc/shadow 所记载的帐号密码相关资讯时,可以使用‘ shadow ’这个机制, 当然也能使用‘ pam ’啦!更多的 saslauthd 连线至主机的机制请‘ man saslauthd ’来查阅吧。

    saslauthd 的启动真是好简单,首先你必需要选择密码管理机制,这个可以使用底下的方式处理:
    1. 先了解你的 saslauthd 有支援哪些密码管理机制:
    [root@linux ~]# saslauthd -v
    saslauthd 2.1.19
    authentication mechanisms: getpwent kerberos5 pam rimap shadow ldap
    # 上列的特殊字体部分就是有支援的!我们要用 Linux 本机的使用者资讯,
    # 所以用 shadow  即可。
    
    2. 设定实际使用的机制
    [root@linux ~]# vi /etc/sysconfig/saslauthd
    MECH=shadow
    # 这也是预设值,有的朋友喜欢 pam 机制,也可以啦!
    
    3. 那就启动吧!
    [root@linux ~]# /etc/init.d/saslauthd start
    [root@linux ~]# chkconfig saslauthd on
    
    之后我们必需要告知 Cyrus 这个咚咚使用的服务为 saslauthd 才行,设定的方法很简单:
    [root@linux ~]# vi /usr/lib/sasl2/smtpd.conf
    log_level: 3                <==登录档资讯等级的设定,设定 3 即可
    pwcheck_method: saslauthd   <==就是选择什么服务来负责密码的比对啊
    mech_list: PLAIN LOGIN      <==那么支援的机制有哪些之意!
    
    因为 saslauthd 预设就仅支援明码传输而已,我们可以使用 mech_list 列出特定支援的机制。 而且 saslauthd 是个很简单的帐号密码管理服务,你几乎不需要进行什么额外的设定, 直接启动他就生效了!真是好方便! ^_^


  • main.cf 的设定项目:
  • 那我们的 postfix 该如何处理呢?其实设定真的很简单,只要这样做就好了:
    [root@linux ~]# vi /etc/postfix/main.cf
    # 在本档案最后面增加这些设定资料:
    smtpd_sasl_auth_enable = yes
    smtpd_sasl_security_options = noanonymous
    broken_sasl_auth_clients = yes
    # 然后找到跟 relay 有关的设定项目,增加一段允许 SMTP 认证的字样:
    smtpd_recipient_restrictions =
         permit_mynetworks
         permit_sasl_authenticated
         reject_unauth_destination
         reject_rbl_client cbl.abuseat.org
         reject_rbl_client bl.spamcop.net
         reject_rbl_client cblless.anti-spam.org.cn
         reject_rbl_client sbl-xbl.spamhaus.org
         check_policy_service unix:/var/spool/postfix/postgrey/socket
    
    [root@linux ~]# /etc/init.d/postfix restart
    
    各个项目的意义是这样的:
    • smtpd_sasl_auth_enable
      就是设定是否要启动 sasl 认证的意思,如果设定启动后 postfix 会主动去载入 cyrus sasl 的函式库, 而该函式库会依据 /usr/lib/sasl2/smtpd.conf 的设定来连结到正确的管理帐号与密码的服务, 那就是咱们的 saslauthd 啰!

    • smtpd_sasl_security_options
      这个项目指的是‘要取消哪些登入的方式’的意思。我们可以取消匿名登入的可能性, 所以设定为 noanonymous 即可。由于 saslauthd 使用的是 plaintext ,所以你可不能设定 noplaintext 喔! 留意留意!

    • broken_sasl_auth_clients
      这个是针对早期非正规 MUA 的设定项目,因为早期软体开发商在开发 MUA 时没有参考通讯协定标准, 所以造成在 SMTP 认证时可能会发生的一些困扰。这些有问题的 MUA 例如 MS 的 outlook express 第四版就是这样! 后来的版本应该没有这个问题。所以这个设定值你也可以不要设定!

    • smtpd_recipient_restrictions
      最重要的就是这里啦!我们的 sasl 认证可以放在第二行,在区域网路这个可信任区域的后面加以认证。 上表的设定意义是:区域网路内的 MUA 不需要认证也能够进行 relay ,而非区网内的其他来源才需要进行 SMTP 认证之意。
    设定完毕也重新启动 postfix 之后,我们先来测试看看是否真的提供认证了?
    [root@linux ~]# telnet localhost 25
    Trying 127.0.0.1...
    Connected to localhost.
    Escape character is '^]'.
    220 vbird.vbird.idv.tw ESMTP Postfix
    ehlo localhost
    250-linux.vbird.tsai
    250-PIPELINING
    250-SIZE 10240000
    250-VRFY
    250-ETRN
    250-AUTH LOGIN PLAIN     <==你必需要看到底下这两行才算数啊!
    250-AUTH=LOGIN PLAIN
    250 8BITMIME
    quit
    221 Bye
    


  • 用户端的设定
  • 用户端也需要设定向 MTA 主机发送 SMTP 认证的功能才行!作法很简单啦,我们依旧以 Thunderbird 来作为介绍,请打开 thunderbird ,选择‘工具’-->‘帐号设定’后会出现如下画面:

    用户端认证机制所需要启动的项目
    图十三、用户端认证机制所需要启动的项目

    记得在上图 2 所指的地方,将使用者帐号及密码项目勾选,并且不使用安全连线 (因为 saslauthd 仅支援明码认证而已) ,这样就 OK 啦!然后你尝试寄出一封信看看,瞧瞧是否有顺利的通过认证啊? 记得此用户端不要在区域网路内,否则将不会经过认证的阶段,因为我们的设定以信任网域为优先嘛!
    如果一切都顺利的话,那么当用户端以 SMTP 来验证时,你的登录档应该会出现类似底下的讯息才是:
    [root@linux ~]# tail -n 100 /var/log/maillog | grep PLAIN
    Nov 28 15:27:21 linux postfix/smtpd[23060]: EFCC9A26CB: client=unknown
    [192.168.100.25], sasl_method=PLAIN, sasl_username=dmtsai
    


    小标题的图示基础的邮件过滤机制
    在整封信的传送流程当中,用户端若通过主机的重重限制后,最终应该可以到达邮件伫列当中。 而由伫列当中要送出去或者是直接送到 mailbox 就得要透过 MDA 的处理。MDA 可以加挂很多机制呢! 尤其是他可以过滤某些特殊字眼的广告信件或病毒信件呢! MDA 可以透过分析整封信件的内容 (包括标头以及内文) 来撷取有问题的关键字,然后决定这封信的‘命运’说!

    咱们的 postfix 已经有内建可以分析标头或者是内文的过滤机制了,那就是 /etc/postfix/ 目录下的 header_checks 以及 body_checks 这两个档案啊!在预设的情况下这两个档案不会被 postfix 使用, 你必需要用底下的设定来启用他:
    [root@linux ~]# vi /etc/postfix/main.cf
    header_checks = regexp:/etc/postfix/header_checks
    body_checks = regexp:/etc/postfix/body_checks
    # 那个 regexp 代表的是‘使用正规表示法’的意思啦!
    
    [root@linux ~]# touch /etc/postfix/header_checks
    [root@linux ~]# touch /etc/postfix/body_checks
    [root@linux ~]# /etc/init.d/postfix restart
    
    接下来你必需要自行处理 header_checks 以及 body_checks 的规则设定,在设定前请您确认‘ 你对于正规表示法是熟悉的 ’才行!因为很多资讯都必需要透过正规表示法来处理啦!然后开始设定的依据是:
    • 只要是 # 代表该行为注解,系统或直接略过;
    • 在预设的规则当中,大小写是视为相同的;
    • 规则的设定方法为:
        /规则/   动作   显示在登录档里面的讯息
      请注意,要使用两个斜线‘ / ’将规则包起来喔!举个例子来说明:例如我想要 (1)抵挡掉标题为 A funny game 的信件,(2)并且在登录档里面显示 drop header deny,则可以在 header_chekcs 档案中可以这样写:
        /^Subject:.*A funny game/   DISCARD  drop header deny
    • 关于动作有底下几个动作:
      • REJECT :将该封信件退回给原发信者;
      • WARN :将信件收下来,但是将该封信的基本资料记录在登录档内;
      • DISCARD:将该封信件丢弃,并不给予原发信者回应!
    鸟哥自己有作一些规则的比对,只不过.....效能不好!如果您有兴趣的话,可以自行下载来看看, 不过,使用的后果请自行评估!因为每个人的环境都不一样嘛!
    记得,如果你自行修改过这两个档案后,务必要检查一下语法才行!
    [root@linux ~]# postmap -q - regexp:/etc/postfix/body_checks \
    >  < /etc/postfix/body_checks
    
    如果没有出现任何错误,那就表示您的设定值应该没有问题啦!


  • PROCMAIL
  • 除了这两个设定之外,还有没有基础过滤分面的 MDA 机制呢?有的!那就是 procmail 啰~ Procmail 基本上就与上头提到的 body_checks 相仿,同样是用来分析邮件之用的, 所以你也需要设定规则啊!首先你得要安装 procmail ,咱们的 CentOS 已经有内建的套件了, 请使用 yum install procmail 自行安装好他。

    那么 procmail 的过滤规则在哪里呢?预设就是 /etc/procmailrc 啰!这个档案的设定方式是这样的:
    1. 一组规则设定至少共含有三行,如下所示:
    :0b                         <==设定过滤机制所要检查的信件部分
    * ^Subject:.*A funny game   <==就是检查的规则部分
    /dev/null                   <==如果符合上述规定,则进行的动作
    
    参数说明:
    a. 关于检查邮件的部分(第一行),flags 包含有:
      H : Header 的检查
      B : Body 的检查
      h : 提供 Header 的资料,进入 pipe 、 file 及 mail 等的检查
      b : 提供 Body 的资料进入 pipe, file 及 mail 等的检查!
    b. 关于检查内容的部分:
      ! : 这是反向选择的意思
      < : 检查 mail 的总长度是否小于设定值 ( bytes )
      > : 与 < 相反的选择啰!
    c. 关于动作的部分
      | : 开始启用后续的 shell 程式工作!
    d. 其他的环境变数部分:
      PATH    搜寻执行档的路径
      SENDMAIL  那个 /usr/sbin/sendmail 啰!
      LOGFILE   登录档!通常设定在 /var/log/procmail.log
    e. 与 Regular express 相关的部分:
      ^ : 开始(同一行最左边)字元
      $ : 本行的结束字元(最右边)的比对
      . : 除了新增一行之外的任何字元!
      \ : 跳脱字元
    更详细的内容请务必参考:
    man procmailrc
    man procmailex
    
    网路上已经有很多前辈提供了他们自行分析的规则,比如说卧龙大师:
    您可以经上述的网页资料捉到你的 /etc/procmailrc 当中,然后在 main.cf 里头增加这一句:
    [root@linux ~]# vi /etc/postfix/main.cf
    mailbox_command = /usr/bin/procmail
    
    [root@linux ~]# /etc/init.d/postfix restart
    

    透过这种基础的邮件分析可以捉取一些有问题的邮件,不过对于目前垃圾邮件的抵挡方面还是很有限! 此外,由于这些分析机制都直接读取信件来处理与分析,这些机制通常都很耗系统资源! 如果你的信件越大流量越大,那么你的系统花费在‘分析邮件’上面的时间会花去很多资源, 所以你的硬体得要很好,否则当有大型邮件进来时,邮件主机会跑得喘嘘嘘! 所以目前要不要启动这些过滤机制.....见仁见智啰!


    小标题的图示非固定 IP 也可以有春天: relayhost
    我们上面提到,如果你要架设一部合法的 MTA 最好还是得要申请固定的 IP 以及正确对应的反解比较恰当。 但如果你一定要用浮动 IP 来架设你的 MTA 的话,也不是不可以啦,只不过你就得要透过上层 ISP 所提供的 relay 权限啰!这是怎么回事啊?让我们来看看一个实际的案例:

    利用 ISP 的 MTA 进行邮件转递
    图十四、利用 ISP 的 MTA 进行邮件转递

    理论上,由于我们是向 ISP 申请 IP 的,所以我们的 IP 对于 ISP 的 MTA 来说,应该都符合 relay 的要件。 那如果我利用这个 IP 来架设一个 mail server ,并且让这个 mail server 的主机名称对应为 DDNS 的情况,则我的 IP 与主机名称对应得宜,所以当然可以架设各种网站伺服器。如果没有设定以 ISP 的 MTA 作为 relay 的情况下,目标 MTA 会反解析我们的 IP ,若得到此 IP 为非合法的主机名称时, 该信件原则上是会被退件的。

    那如果我以 ISP 的 MTA 来作为 relay 主机时,因为我们所在的 IP 本来就能够使用 ISP MTA 的 relay 功能, 所以图十四的第一步是没问题的。然后当 ISP 的 MTA 在进行 Relay 而将信件寄出去时, 目标 MTA 所看到的来源端是‘ISP 的 IP’而不是我们原本的发信源! 如此一来当然我们的 MTA 就能够架设起来啰!

    不过想要以此架构来架设你的 MTA 仍有许多需要注意的地方:
    • 你还是得要有一个合法的主机名称,若要省钱,可以使用 DDNS 来处理;
    • 你上层的 ISP 所提供的 MTA 必需要有提供你所在 IP 的 relay 权限;
    • 你不能使用自订的内部 DNS 架构了,因为所有 relay 的信都会被送至 ISP 的 MTA
    尤其是最后一点,因为所有外送的信件全部都会被送到 ISP 处,所以像我们之前自己玩的 vbird.tsai 这种非合法的领域资料就没用了!为什么呢?你想想看,如果你要将信件送给 mail.vbird.tsai , 但由于上述的功能,所以这封信会被传到 ISP 的 MTA 来处理,但 ISP 的 MTA 会不会认识你的 vbird.tsai ?这样说,可以理解了吧?

    说是挺难的,做起来却很简单,只要在 main.cf 里面加设一段资料即可。 假设你的环境是台湾地区的 hinet 所提供的用户,而 hinet 提供的邮件主机为 ms1.hinet.net , 则你可以直接这样设定:
    [root@linux ~]# vi /etc/postfix/main.cf
    # 加入底下这一行就对啦!注意那个中括号!
    relayhost = [ms1.hinet.net]
    
    [root@linux ~]# /etc/init.d/postfix restart
    
    之后你只要尝试寄一封信出去看看,就会了解这封信是如何寄送的了。看一下登录档的内容会像这样:
    [root@linux ~]# tail -n 20 /var/log/maillog
    Nov 28 18:42:30 linux postfix/smtp[23673]: 515E8A26CE: to=<someone@合法的主机>, 
    relay=ms1.hinet.net[168.95.4.10], delay=1, status=sent (250 SAA09090 Message 
    accepted for delivery)
    
    是吧!经由上层 ISP 来转寄啦!如此一来,你的 MTA 感觉上就似乎是部合法的 MTA 啰! 不过,可别利用这个权限来滥发广告信啊!因为您所透过的那个 ISP 邮件主机可是有记录你的 IP 来源, 如果你乱来的话,后果可是不堪设想喔!切记切记!


    小标题的图示邮件扫瞄器: amavisd-new+f-port+spamassanssin
    事实上,到目前为止之前的设定应该可以满足一般 50 人以下的小企业环境了, 甚至再多一点人也没有问题的。不过如果人数多了,各种奇怪的信件也会跟着多起来, 这是因为总是会有人不小心将他的 email address 放在网际网路上,如果被邮件位址搜寻机器人捉到的话, 你的 email 将会出现在广告信发送商的名单中....

    为了避免这个问题,很多朋友是将他的信箱分为两个,一个直接放在 Internet 上,另一个则作为自己日常业务之用。另外有的朋友则使用类似底下所提供的邮件位址表示方式:
      dmtsai{at}linux{dot}vbird{dot}tsai
    这种格式对于网路机器人 (就是一种可以自动上网搜寻关键字的软体程式啰!) 的搜寻会造成困扰, 因为那些机器人程式用以判断是否为邮件位址是依据‘ @ ’来判别的啊! 所以说,不要泄漏你个人的 email 是很重要的一件事啊!
    Tips:
    你可以自己测试看看,如果申请了一个免费信箱,但不要将他公布,那个信箱肯定不会收到任何广告信。 但你一旦用那个信箱来申请一些个人资料而公布在 Internet 上面时,呼呼!不超过一个星期, 该信箱肯定会收到很多广告信!使用上要特别留意喔!
    鸟哥的图示
    既然广告信在短期内不可能有个长足的解决方案,那至少我们可以直接在 mail server 端就将广告信与病毒信给他捉出来吧?如此就可以避免掉使用者必需要自己分析广告信与垃圾信等所花费的时间了。 底下提供几个好东西来帮忙处理主机端的信件资料喔:
    • amavisd-new:
      官方网站:http://www.ijs.si/software/amavisd/
      说明:这个软体主要是介于 MTA 与邮件分析软体之间的一个介面,他可以将位于伫列的邮件捉出来给分析软体分析, 通常是需要安装的,尤其他可以支援 postfix 呐!

    • f-port:
      官方网站:http://www.f-prot.com/
      说明:是一种防毒软体,具有自动更新病毒码的能力;

    • SpamAssassin:
      官方网站:http://spamassassin.apache.org/index.html
      说明:具有自动学习的广告信分析软体,不过如果自动学习的规定太严格,有时会发生误判。
    接下来就让我们的 postfix 支援这三个东西吧!不过你得要注意的是, f-port 与 SapmAssisin 是独立运作的软体, 那 postfix 为了要使用这两个软体的分析功能,就得要透过 amavisd-new 这个介面工具来传送信件资讯啰! 详细的作法请参考上头提供的官方网站,或者是参考讨论区的几篇文章也不错:
    当然网路上还有很多好文章,大家可以多多搜寻一番。


  • amavisd-new 的安装与设定:
  • 虽然你可以自行使用 tarball 来安装,不过我们也可以在 http://rpmfind.net/ 找到给 RHEL 4 使用的版本。既然 CentOS 与 RHEL 使用的套件均相同, 没有道理我们不能安装!是吧!^_^。所以底下的套件请先由 http://rpmfind.net/ 网站捉下来吧!然后再开始安装去。 要注意的是,由于 amavisd-new 用 perl 写成的,他需要很多 perl 的模组,且由于要分析信件内容, 所以也需要很多解压缩软体来解析信件内的压缩档,因此才会需要这么多的软体安装~ @_@:

    与 Perl 模组有关的套件:
  • ftp://rpmfind.net/linux/dag/redhat/el4/en/i386/dag/RPMS/perl-Archive-Tar-1.30-1.el4.rf.noarch.rpm
  • ftp://rpmfind.net/linux/dag/redhat/el4/en/i386/dag/RPMS/perl-Archive-Zip-1.16-1.2.el4.rf.noarch.rpm
  • ftp://rpmfind.net/linux/dag/redhat/el4/en/i386/dag/RPMS/perl-BerkeleyDB-0.31-1.el4.rf.i386.rpm
  • ftp://rpmfind.net/linux/dag/redhat/el4/en/i386/dag/RPMS/perl-Compress-Zlib-1.42-1.el4.rf.i386.rpm
  • ftp://rpmfind.net/linux/dag/redhat/el4/en/i386/dag/RPMS/perl-Convert-BinHex-1.119-2.2.el4.rf.noarch.rpm
  • ftp://rpmfind.net/linux/dag/redhat/el4/en/i386/dag/RPMS/perl-Convert-UUlib-1.051-1.2.el4.rf.i386.rpm
  • ftp://rpmfind.net/linux/dag/redhat/el4/en/i386/dag/RPMS/perl-Convert-TNEF-0.17-3.2.el4.rf.noarch.rpm
  • ftp://rpmfind.net/linux/dag/redhat/el4/en/i386/dag/RPMS/perl-IO-Multiplex-1.08-3.el4.rf.noarch.rpm
  • ftp://rpmfind.net/linux/dag/redhat/el4/en/i386/dag/RPMS/perl-IO-stringy-2.110-1.2.el4.rf.noarch.rpm
  • ftp://rpmfind.net/linux/dag/redhat/el4/en/i386/dag/RPMS/perl-MIME-tools-5.420-1.el4.rf.noarch.rpm
  • ftp://rpmfind.net/linux/dag/redhat/el4/en/i386/dag/RPMS/perl-Net-Server-0.94-1.el4.rf.noarch.rpm
  • ftp://rpmfind.net/linux/dag/redhat/el4/en/i386/dag/RPMS/perl-Unix-Syslog-0.100-1.2.el4.rf.i386.rpm
  • ftp://rpmfind.net/linux/dag/redhat/el4/en/i386/dag/RPMS/amavisd-new-2.4.3-1.el4.rf.i386.rpm

    与压缩及解压缩软体有关的套件:
  • ftp://rpmfind.net/linux/dag/redhat/el4/en/i386/dag/RPMS/arc-5.21j-0.2.el4.rf.i386.rpm
  • ftp://rpmfind.net/linux/dag/redhat/el4/en/i386/dag/RPMS/cabextract-1.2-1.el4.rf.i386.rpm
  • ftp://rpmfind.net/linux/dag/redhat/el4/en/i386/dag/RPMS/freeze-2.5-2.2.el4.rf.i386.rpm
  • ftp://rpmfind.net/linux/dag/redhat/el4/en/i386/dag/RPMS/lzo-1.08-4.2.el4.rf.i386.rpm
  • ftp://rpmfind.net/linux/dag/redhat/el4/en/i386/dag/RPMS/lzop-1.01-1.2.el4.rf.i386.rpm
  • ftp://rpmfind.net/linux/dag/redhat/el4/en/i386/dag/RPMS/nomarch-1.4-1.el4.rf.i386.rpm
  • ftp://rpmfind.net/linux/dag/redhat/el4/en/i386/dag/RPMS/ripole-0.2.0-1.2.el4.rf.i386.rpm
  • ftp://rpmfind.net/linux/dag/redhat/el4/en/i386/dag/RPMS/unarj-2.63-0.a.2.el4.rf.i386.rpm
  • ftp://rpmfind.net/linux/dag/redhat/el4/en/i386/dag/RPMS/unrar-3.6.8-1.el4.rf.i386.rpm
  • ftp://rpmfind.net/linux/dag/redhat/el4/en/i386/dag/RPMS/zoo-2.10-2.2.el4.rf.i386.rpm
    您可能先要以 yum 的方式来安装 ncompress, perl-Net-DNS, perl-TimeDate, perl-MailTools, perl-Digest-SHA1, perl-Digest-HMAC, perl-Time-HiRes, spamassassin 这几套软体,然后将上列的软体全部放在同一个目录下,以 rpm -Uvh *.rpm 来安装上述的所有套件!但安装时如果出现如下画面:
    warning: amavisd-new-2.4.3-1.el4.rf.i386.rpm: V3 DSA signature: NOKEY, key ID 6b
    Preparing...                ########################################### [100%]
            package perl-BerkeleyDB-0.31-1.el4.rf is already installed
    	....
    
    这表示某些套件已经被安装了!你不应该还安装他!那么请自行将这些已安装的套件档案移出目前目录, 再执行一次 rpm -Uvh *.rpm 就能够安装啰!如果还是出现某些相依属性的问题,要嘛就以 yum 来安装, 要嘛就以 http://rpmfind.net 网站搜寻适当的 RPM 档案来安装, 安装完毕后就准备来设定一下啰!

    要开始设定 amavisd-new 之前,请务必先查阅一下 /usr/share/doc/amavisd-new-2.4.3/README.postfix 这个档案的内容, 里面有很详尽的设定说明喔!然后这个 amavisd-new 的设定档只有 /etc/amavisd.conf 而已, 预设的情况下该档案内容含有很多的病毒搜寻引擎,不过我们仅有 f-port 这个扫毒软体而已, 所以里面需要进行很多修改喔!基本内容的修改如下:
    [root@linux ~]# vi /etc/amavisd.conf
    # 首先是关于系统设定的部分,包括主机与领域名称等的设定:
    $mydomain = 'vbird.tsai';          <==约在第 20 行,填写你的领域名;
    $MYHOME = '/var/amavis';           <==约在第 22 行,这是 amavis 的预设家目录之意
    $inet_socket_port = 10024;         <==约在第 51 行,预设启动的 port 啦!
    $myhostname = 'linux.vbird.tsai';  <==约在第113 行,改成你的主机名称
    $notify_method  = 'smtp:[127.0.0.1]:10025';  <==约在第116 行,设定连接的埠口
    $forward_method = 'smtp:[127.0.0.1]:10025';  <==约在第117 行,同上
    
    # 2. 底下这几行约在第 118 行之后,用来作为找到病毒或广告信后的动作!
    # 如果你害怕不小心将重要档案删除了,建议你先改成 D_BOUNCE 预先处理
    $final_virus_destiny      = D_BOUNCE;  <==找到病毒时的动作
    $final_banned_destiny     = D_BOUNCE;  <==找到禁止项目的动作
    $final_spam_destiny       = D_PASS;    <==找到广告信的动作
    $final_bad_header_destiny = D_PASS;    <==找到不良信件标头的动作
    # 可以处理的动作主要有:
    #   D_PASS    无论邮件的内容是否有问题,该邮件都会传给收件者
    #   D_DISCARD 邮件被丢弃,而且不会告知收件者与寄件者;
    #   D_BOUNCE  邮件不会传给收件者,但无法传递的讯息会告知寄件者;
    #   D_REJECT  邮件不会传给收件者,但寄件者会收到拒绝的讯息。
    # 鸟哥在这里由于担心误删一些资料,所以除了病毒与禁止项目会回传错误给寄件者外,
    # 其他两个先预设可以通过。等到未来邮件伺服器使用者觉得可以接受后,
    # 某些部分 (如病毒) 就可以改为 D_DISCARD 来直接丢弃了!
    
    # 3. 再来则是决定病毒扫瞄的引擎,底下分别是主要与次要扫毒程式
    @av_scanners = (                <==大约在 309 行,里面的项目全部注解;
    ....中间省略....
    );
    # 因为所有的病毒扫瞄引擎都没有安装嘛!
    
    @av_scanners_backup = (         <==大约在 626 行,只要剩下底下这些
      ['FRISK F-Prot Antivirus', ['f-prot','f-prot.sh'],
        '-dumb -archive -packed {}', [0,8], [3,6],
        qr/Infection: (.+)|\s+contains\s+(.+)$/ ],
    ....中间省略....
    );
    
    amavisd-new 大致上就解决到这里,现在还无法启动他,因为我们要先安装 f-port 才行呐! 赶紧下一动作吧!


  • 安装与设定 f-port :
  • f-port 是一个扫毒软体,他的版本非常的多,其中只有一个是免费的个人版本, 请到底下的连结去下载,不要下载错档案了喔!
    建议你直接下载 RPM 档案,然后直接安装他就好了!安装后 f-port 会立即主动进行线上更新, 所以请你在安装的时候确定你的网路是正常的。而所有 f-port 的资料都会被放置到 /usr/local/f-prot/ 目录下。 该目录下的 README 以及相关连结可以瞧一瞧。安装完毕后检查看看能否工作:
    [root@linux ~]# f-prot -verno
    F-PROT ANTIVIRUS
    Program version: 4.6.6
    Engine version: 3.16.14
    
    VIRUS SIGNATURE FILES
    SIGN.DEF created 29 November 2006
    SIGN2.DEF created 29 November 2006
    MACRO.DEF created 27 November 2006
    # 若出现如上的版本宣告,这表示 f-prot (注意档名) 可以顺利运作。
    
    [root@linux ~]# f-prot /etc/crontab
    # 如果有出现扫瞄的字样,就表示这个软体可以开始进行扫瞄的工作啦!
    
    其实这也就是说, f-port 这套软体的扫瞄程式‘ f-prot ’可以在 Linux 上面扫瞄各种档案的意思! 不过,我们的重点是利用他来进行邮件扫瞄就是了。至于线上更新病毒码部分,你可以手动线上更新, 也可以进入工作排程来自动更新喔:
    1. 手动即时线上更新方式:
    [root@linux ~]# /usr/local/f-prot/tools/check-updates.pl
    
    2. 自动更新排程:
    [root@linux ~]# vi /etc/crontab
    27 4,16 * * * root /usr/local/f-prot/tools/check-updates.pl -cron -quiet
    
    如此一来我们的 f-port 每天可以进行两次线上更新的动作呢!很不错吧!


  • 测试 amavisd-new 与病毒扫瞄程式的搭配:
  • 完成上述的设定后,我们可以先来测试看看 amavisd-new 与 f-port 扫毒程式的搭配情况。 你可以直接这样做:
    [root@linux ~]# amavisd debug
    ....前面省略....
    # 底下在说明此软体所监听的介面与 port 还有执行者的 UID/GID 等
    Nov 30 14:51:53 linux amavisd[3457]: Net::Server: Binding to TCP port 10024 on 
    host 127.0.0.1
    Nov 30 14:51:53 linux amavisd[3457]: Net::Server: Setting gid to "102 102"
    Nov 30 14:51:53 linux amavisd[3457]: Net::Server: Setting uid to "101"
    Nov 30 14:51:53 linux amavisd[3457]: Net::Server: Setting up serialization via 
    flock
    
    # 底下在说明各个模组是否有被顺利的载入
    Nov 30 14:51:54 linux amavisd[3457]: Module Amavis::Conf   2.072
    Nov 30 14:51:54 linux amavisd[3457]: Module Archive::Tar   1.30
    Nov 30 14:51:54 linux amavisd[3457]: Module Archive::Zip   1.16
    ....中间省略....
    
    # 底下则是在说明载入哪些资料
    Nov 30 14:51:54 linux amavisd[3457]: Amavis::DB code      loaded
    Nov 30 14:51:54 linux amavisd[3457]: Amavis::Cache code   loaded
    ....中间省略....
    Nov 30 14:51:54 linux amavisd[3457]: ANTI-VIRUS code      loaded
    Nov 30 14:51:54 linux amavisd[3457]: ANTI-SPAM code       loaded
    Nov 30 14:51:54 linux amavisd[3457]: ANTI-SPAM-SA code    loaded
    Nov 30 14:51:54 linux amavisd[3457]: Unpackers code       loaded
    
    # 这里说明的是一些档案解压缩的功能啰!
    Nov 30 14:51:54 linux amavisd[3457]: Found $file   at /usr/bin/file
    Nov 30 14:51:54 linux amavisd[3457]: No $dspam,    not using it
    Nov 30 14:51:54 linux amavisd[3457]: Internal decoder for .mail
    Nov 30 14:51:54 linux amavisd[3457]: Internal decoder for .asc
    ....中间省略....
    Nov 30 14:51:54 linux amavisd[3457]: Found secondary av scanner FRISK 
    F-Prot Antivirus at /usr/local/bin/f-prot <==这行重要!说明有找到 f-port
    Nov 30 14:51:54 linux amavisd[3457]: SpamControl: initializing Mail::SpamAssassin
    Nov 30 14:51:56 linux amavisd[3457]: SpamControl: init_pre_fork done
    ....后面省略....
    # 最后按下 [ctrl]-c 来结束这个 debug 的画面喔!
    
    看起来应该是没有问题啦!然后赶紧给他启动这个服务吧!
    [root@linux ~]# /etc/init.d/amavisd start
    
    # 测试一下 amavisd 启动的 port 10024 是否顺利运作中?
    [root@linux ~]# telnet 127.0.0.1 10024
    Trying 127.0.0.1...
    Connected to 127.0.0.1.
    Escape character is '^]'.
    220 [127.0.0.1] ESMTP amavisd-new service ready
    ehlo localhost
    250-[127.0.0.1]
    250-VRFY
    250-PIPELINING
    250-SIZE
    250-ENHANCEDSTATUSCODES
    250-8BITMIME
    250-DSN
    250 XFORWARD NAME ADDR PROTO HELO
    quit
    221 2.0.0 [127.0.0.1] amavisd-new closing transmission channel
    Connection closed by foreign host.
    
    如果一切都顺利的话,你可以将这个服务给他写入开机自动执行中!‘ chkconfig amavisd on ’ 这样就好啦!准备设定一下让 postfix 来支援 amavisd-new 的伫列分析工作吧!


  • 设定 Postfix 使支援 amavisd-new 的分析工作:
  • 这个设定项目需要的资讯比较多,有两个档案要修改,先改 master.cf 吧!
    [root@linux ~]# vi /etc/postfix/master.cf
    # 这几行专门为了病毒、广告信作的连结!
    # ====================================================================
    # service type  private unpriv  chroot  wakeup  maxproc command + args
    #               (yes)   (yes)   (yes)   (never) (100)
    # ====================================================================
    smtp-amavis unix -      -       n        -       2    smtp
        -o smtp_data_done_timeout=1200
        -o smtp_send_xforward_command=yes
        -o disable_dns_lookups=yes
        -o max_use=20
    
    127.0.0.1:10025 inet n  -       n        -       -    smtpd
        -o content_filter=
        -o smtpd_restriction_classes=
        -o smtpd_delay_reject=no
        -o smtpd_client_restrictions=permit_mynetworks,reject
        -o smtpd_helo_restrictions=
        -o smtpd_sender_restrictions=
        -o smtpd_recipient_restrictions=permit_mynetworks,reject
        -o smtpd_data_restrictions=reject_unauth_pipelining
        -o smtpd_end_of_data_restrictions=
        -o mynetworks=127.0.0.0/8
        -o smtpd_error_sleep_time=0
        -o smtpd_soft_error_limit=1001
        -o smtpd_hard_error_limit=1000
        -o smtpd_client_connection_count_limit=0
        -o smtpd_client_connection_rate_limit=0
        -o smtpd_milters=
        -o local_header_rewrite_clients=
        -o local_recipient_maps=
        -o relay_recipient_maps=
    
    这几行给他设定好,然后再来处理 main.cf 这个档案啰!
    [root@linux ~]# vi /etc/postfix/main.cf
    content_filter = smtp-amavis:[127.0.0.1]:10024
    
    [root@linux ~]# /etc/init.d/postfix restart
    
    嘿嘿!然后开始就能够帮你分析病毒信啦!就是这么简单呐!


  • 广告信的抵挡:
  • 我们有使用 spamassassin 这个自动学习抵挡广告信的机制,这个玩意儿主要是透过分析信件内容, 只要信件内容的某一部份符合 spamassassin (简称 SA) 的规范,则该信件可给予一个分数。 将该信件的所有分数总和起来,若分数高于我们所规定的预设分数,则该信件可以被视为广告信。 这个分数如果设定太低,则很多合法的信件都会不小心被视为广告信,如果设定太高,可能又会捉不到广告信。 真是两难。这个分数的设定值预设是在:
    [root@linux ~]# vi /etc/amavisd.conf
    $sa_tag_level_deflt  = 5.0;    <==大约在第 61 行,将 2 改成 5 吧!
    
    [root@linux ~]# vi /etc/mail/spamassassin/local.cf
    required_hits 5                <==就是他!就是这个分数啦!
    report_safe 0
    rewrite_header Subject [SPAM]  <==如果是广告信,标头会被改写!
    
    [root@linux ~]# /etc/init.d/amavisd restart
    
    每个人的主机都不太一样,所以这个分数需要你多方的尝试才能找出最佳的数值。 就是因为害怕误判,所以才希望你在 /etc/amavisd.conf 里面不要将 spam 的规则设定为 D_DISCARD 的啦! ^_^! 至于这个档案的处理方式,其实你可以参考底下的网页来改写 local.cf 档案喔!
    不过你得要注意的是, local.cf 里面很多的设定值已经被 /etc/amavisd.conf 所取代了, 所以你的 local.cf 部分设定可能会失效的!这要特别先说明的。 整个病毒、广告信的安装与设定就到此为止啦,然后我们可以开始稍微测试一下啰! 你可以利用 CentOS 本身的 Spamassassin 提供的一封广告信来测试看看:
    [root@linux ~]# mail -s 'spam test' dmtsai <  \
    > /usr/share/doc/spamassassin-3.0.6/sample-spam.txt
    # 假设你的系统有个使用者名为 dmtsai ,你寄出广告信给他,
    # 然后用 dmtsai 收信一下,你会发现到该封信件的内容:
    
    [dmtsai@linux ~]$ mail
    >N 1 dmtsai@linux  Thu Nov 30 23:18  54/2065  "**SPAM** spam test"
    # 瞧!标头多出了一些东西啦!没错!信件标头会被改写!
    & 1
    From dmtsai@linux.vbird.tsai  Thu Nov 30 23:18:24 2006
    X-Original-To: dmtsai@linux.vbird.tsai
    Delivered-To: dmtsai@linux.vbird.tsai
    X-Quarantine-ID: <v02TdcMd+Vk4>
    From dmtsai@linux.vbird.tsai Thu Nov 30 23:18:24 2006
    X-Original-To: dmtsai@linux.vbird.tsai
    Delivered-To: dmtsai@linux.vbird.tsai
    X-Quarantine-ID: <v02TdcMd+Vk4>
    X-Virus-Scanned: amavisd-new at vbird.tsai
    X-Spam-Flag: YES
    X-Spam-Score: 1001.148
    X-Spam-Level: ***********************************************
    X-Spam-Status: Yes, score=1001.148 tagged_above=5 required=6.31
            tests=[AWL=-2.025, DNS_FROM_RFC_ABUSE=0.374, GTUBE=1000,
            NO_RELAYS=-0.001, UNWANTED_LANGUAGE_BODY=2.8]
    # 上面的特殊字体部分,第一行就是病毒扫瞄的证据!
    # 后面这几行则是运算广告信总结分数的结果啊!有趣吧!
    


  • 自动学习抵挡广告信:
  • 在 spamassasin 所提供的功能当中,事实上有两种使用 spamassassin 的方式,一种是透过 spamd 这个 spamassassin 的服务,另一种则是透过 spamc 这个可以让 MTA 呼叫来批次执行的程式。在鸟哥的这个范例当中,我们是透过 amavisd-new 软体来呼叫 spamc 以处理广告信的啦!所以你的 spamassassin 的 daemon 功能不用启动的。

    另外,广告信的变化可是千变万化的,谁也搞不清楚下一次出现广告信的情况会是如何,所以说, 订定死的广告信过滤规则是没有多大的效果的。所以啰,能够自动学习广告信的内容资料,然后自动学习更新资料库, 这才能够因应网际网路的现实残酷的状态。好佳在!咱们的 spamassassin 有提供一支程式与一个称为 bayes (贝式) 的机制来处理自动学习的功能!我们可以透过这个功能来进行分类呐!

    既然有过滤机制的资料库,那么资料库在哪里啊?其实资料库主要有两个,分别是个人的与系统的! 我们这个案例的系统资料库放置在 /var/amavis/.spamassassin/ 里面, 个人资料库则是在 ~/.spamassassin/ 里面。基本上,建议直接由系统管理员直接修订系统资料库的内容即可。 那么如何处理新的广告信件呢?你必须这样做:
    1. 手动处理广告信资料:
      你得要先手动的将没有被 spam 的广告信抽出来,举例来说,鸟哥将我所收到的广告信放置到 /root/mail/spam 这个档案当中,他是一个 mbox 的格式,也就是 mailbox 的格式啰。 你也可以建立一个使用者名为 spam,那么将你所收到的广告信转寄给这个使用者即可。

    2. 利用 sa-learn 学习广告信:
      接下来你得要更新广告信的资料库了,这个动作主要是经由 sa-learn 这个指令来处理的。 你最好先以‘ man sa-learn ’来了解一下所有的参数才好。假设你的广告信放置在 /root/mail/spam 这个 mbox 格式的档案中,那么你可以这样做:
      sa-learn --spam --mbox --dbpath /var/amavis/.spamassassin/ /root/mail/spam
      如此一来过滤广告信的内容就会被更新了。

    3. 正常信件被误判的处理:
      那如果有正常信件却被分析为广告信呢?没关系,你同样将这些信件独立出来成为一个档案, 例如 /root/mail/nospam 好了,然后这样学习:
      sa-learn --ham --mbox --dbpath /var/amavis/.spamassassin/ /root/mail/nospam
    透过这个学习机制,你的广告信抵挡会越来越精确喔!等到累积了足够的广告信学习后, 就能够修改 /etc/amavisd.conf 里面针对广告信命运的处理方式了 (由 D_PASS 变成 D_DISCARD 看看!) 加油!


  • 不要丢弃 exe 档名的附件:
  • 使用了 amavisd-new 来作为病毒处理与广告信抵挡真是不错的方案,不过,预设 amavisd-new 会丢弃附件夹档档名为 *.exe, .bat, .com... 等等的邮件,而且如果你将某个 .exe 档案压缩成为 .rar 或者是 .zip 的压缩档时, 由于我们的 Linux 有安装解压缩软体 (如 unrar),结果...该封邮件还是会被丢弃,而不论是否有病毒存在。

    这样实在不怎么人性化,因为有些时候我们必须要传送一些附档名为 .exe 之类的执行档,如果预设会被丢弃, 那如何传送出该档案?除非使用 ftp 了~真麻烦~没关系,我们可以透过修改 amavisd-new 的设定档来放行喔! 处理的方式很简单,只要这样做即可:
    [root@linux ~]# vi /etc/amavisd.conf
    找到底下这一行,大约在 166 行左右
      qr'^\.(exe-ms|dll)$',
    将他改成这样:
      qr'^\.(dll)$',
    
    找到底下这两行,大约在 187 行附近
      qr'\.[^./]*[A-Za-z][^./]*\.(exe|vbs|pif|scr|bat|cmd|com|cpl|dll)\.?$'i,
      qr'.\.(exe|vbs|pif|scr|cpl)$'i,
    将他改成这样:
      qr'\.[^./]*[A-Za-z][^./]*\.(vbs|pif|scr|cmd|com|cpl|dll)\.?$'i,
      qr'.\.(vbs|pif|scr|cpl)$'i,
    
    [root@linux ~]# /etc/init.d/amavisd restart
    
    就是将含有 exe 的关键字设定给他移除就是了,如此一来,除非你的 .exe 档案含有病毒, 否则就不会被丢弃啰!

    小标题的图示其他设定小技巧
    除了之前谈到的几个主要的设定之外, postfix 还有提供一些不错的设定要给大家使用的喔! 我们可以一个一个来来看看:

  • 单封信件与单个邮件信箱的大小限制
  • 在预设的情况下, postfix 可接受的单封信件最大容量为 10MBytes ,不过这个数值我们是可以更改的, 动作很简单:
    [root@linux ~]# vi /etc/postfix/main.cf
    message_size_limit =   40000000
    [root@linux ~]# postfix reload
    
    上面的单位是 bytes ,所以我将单封信件可接受大小改为 40MByte 的意思啦!请按照你的环境来规定这个数值。 而从前我们要管制 /var/spool/mail/account 大多是使用档案系统内的 quota 来达成, 现在的 postfix 不需要啦!可以这样做:
    [root@linux ~]# vi /etc/postfix/main.cf
    mailbox_size_limit = 1000000000
    [root@linux ~]# postfix reload
    
    我给每个人 1GB 的空间啊!^_^

  • 寄件备份
  • 收件备份我们知道可以使用 /etc/aliases 来处理的,但是如果想要送件也备份呢? 利用底下的方式即可:
    [root@linux ~]# vi /etc/postfix/main.cf
    always_bcc = some@host.name
    [root@linux ~]# postfix reload
    
    如此一来任何人寄出的信件都会复制一份给 some@host.name 那个信箱。 不过,除非您的公司很重视一些商业机密,并且已经公告过所有同仁,否则进行这个设定值, 鸟哥个人认为侵犯隐私权很严重!


    大标题的图示其他应用说明
    除了 mail server 自己的设定值之外,我们最好还是针对 mail server 的资料来备份啊来管理啊等等的, 所以底下有些咚咚也可以处理处理:


    小标题的图示问题检查
    虽然 Mail 很方便,但是仍然会有无法将信件寄出的时候!如果您已经设定好 MTA 了,但是总是无法将邮件寄出去,那可能是什么问题呢?
    • 关于硬体配备
      无论任何情况之下,如果硬体出问题,那么所有的服务都将不正常啦!所以,请先检查您的硬体是否‘怪怪的!’这个先确认 OK 吧!

    • 关于网路参数的问题
      如果连不上 Internet ,那么哪里来的 Mail Server 呢?所以请先确认你的网路已经正常的启用了! 关于网路的确认问题,请查阅前几篇‘Linux 网路侦错’的内容介绍;

    • 关于服务的问题
      请务必确认 port 25 与 port 110 已经正确的启动了!使用 netstat 指令即可了解是否已经启动该服务!

    • 关于防火墙的问题
      很多时候,很多朋友使用 Red Hat 或者其他 Linux distribution 提供的防火墙设定软体,结果忘了启动 port 25 与 port 110 的设定,导致无法收发信件!请特别留意这个问题喔!可以使用 iptables 来检查是否已经启用该 port 呢!其余请参考防火墙设定那一章喔!

    • 关于 TCP_Wrappers 的问题
      如果你的 MTA 还有支援 tcpd 这个程式 (或者说是 libwrap 这个函式库) 的话,那么在 /etc/hosts.allow 与 /etc/hosts.deny 的设定也会影响到收发信件的正常与否!如果 /etc/hosts.deny 有设定‘ALL: ALL’的话,那么请务必在 /etc/hosts.allow 里面加设‘ sendmail: ALL ’喔!

    • 关于设定档的问题
      在启动 postfix 或者是 sendmail 之后,在登录档当中仔细看看有无错误讯息发生? 通常如果设定资料不对,在登录档当中都会有记载错误的地方。

    • 关于档案权限的问题
      如果你曾经手动处理过软体的 tarball 升级,或者是你曾自己处理过一些设定档,那么就得要注意:
      • /etc/mail/, /etc/postfix/ :里面的档案至少都为 644 或 640 的权限!
      • /var/spool/mqueue :务必为 700 的权限
      • /var/spool/clientmqueue:这在 sendmail 8.12 才有,所有人与群组务必为 smmsp ,而权限务必为 770 ;
      • 每个 ~/.forward 的档案需要控制其权限喔!

    • 其他档案的设定问题
      如果发现只有某个 domain 可以收信,其他的同一主机的 domain 无法收信,需要检查 local-host-names 这个档案的设定, 或者是 $mydestination 的设定值才行;
      如果发现邮件被挡下来了!而且老是显示 reject 的字样,那么可能被 access 挡住了;
      如果发现邮件伫列 (mailq) 存在很多的邮件,可能是 DNS 死掉了,请检查 /etc/resolv.conf 的设定是否正确!

    • 其他可能的问题
      最常发生的就是认证的问题了!这是由于使用者没有在 MUA 上面设定‘我的邮件需要认证’的选项啦! 请叫你的用户赶紧勾选吧!

    • 还是不知道问题的解决方案
      如果还是查不出问题的话,那么请务必检查您的 /var/log/maillog (有的时候是 /var/log/mail ,这个要看 /etc/syslog.conf 的设定),当你寄出一封信的时候,例如 dmtsai 寄给 bird2@linux.vbird.tsai 时,那么 maillog 档案里面会显示出两行,一行为 from dmtsai 一行为 to bird2@linux.vbird.tsai, 也就是‘我由哪里收到信,而这封信会寄到哪里去!’的意思,由这两行就可以了解问题了!尤其是 to 的那一行,里面包含了相当多的有用资讯,包括邮件无法传送的错误原因的纪录! 如果您对于登录档不熟,请拿出‘基础学习篇’里面的‘认识登录档’一文吧!

    小标题的图示哪些资料要备份
    不管什么时候,备份总是重要的!那么如果我是单纯的 Mail Server 而已,我需要的备份资料有哪些呢?
    • /etc/passwd, /etc/shadow, /etc/group 等与帐号有关的资料;
    • /etc/mail, /etc/postfix/ 底下的所有档案资料;
    • /etc/aliases 等等 MTA 相关档案;
    • /home 底下的所有使用者资料;
    • /var/spool/mail 底下的档案与 /var/spool/postfix 邮件伫列档案;
    • 如果是 Sendmail 8.12 则可以考虑储存 /var/spool/clientmqueue。
    • 其他如广告软体、病毒扫瞄软体等等的设定与定义档。

    小标题的图示quota 与目录移转
    网路上有很多‘免费的电子邮件信箱’空间,一般而言,使用的就是 quota 这个磁碟配额工具!因为我们的 Linux 主机硬碟空间就是这么多!当然啰, 使用磁碟配额 (quota) 会是一个对大家比较公平的方法!使用 quota 的技巧已经在‘基础学习篇’里面介绍过了,这里不再重复介绍,要介绍的是几个可能会发生在实际的案例中的一些小技巧:

  • 邮件信箱所在的磁碟空间不足了
  • 这是很可能会发生的问题啊!尤其是在用量很大的网站上面!这个时候你的解决方法主要有:
    1. 新增加一颗硬碟,格式化好之后将他 mount 到 /var/spool/mail 这个目录下;
    2. 如果主机里面还有其他目录具有很大的空间,例如 /home 这个地方,那么就可以:
        cd /var/spool
        mv mail /home
        ln -s /home/mail mail
  • 使用 quota 设定:
  • 一般而言,我们通常会将 /home 做为 quota 的 partition ,那么 /var/spool/mail 其实也可以依附在 /home 这个 partition 之下,来达到 quota 对于使用者的规范喔!达成的方法很简单啦:
    1. 先在主机规划与安装的时候,让 /home 独立于一个 partition 当中;
    2. 以‘鸟哥的 Linux 私房菜 -- 基础学习篇’的 quota 内容为范例,建立好 /home 的 quota 限额;
    3. 将 /var/spool/mail 整个搬到 /home 底下,并做好连结的动作就可以立即生效啦:
        cd /var/spool
        mv mail /home
        ln -s /home/mail mail
  • 关于使用者邮件的放置地点
  • 很多的读者可能喜欢让每个使用者去到自己的家目录读取 mail box 的咚咚,亦即是将 /var/spool/mail 的内容给他搬到个别的家目录去!例如 dmtsai 的 mail box 变成的 /home/dmtsai/dmtsai 这个档案!不过,如此一来的话, MTA 与 pop 都将需要改写其 source code !所以‘不建议这么搞喔!’

    大标题的图示重点回顾
    • 电子邮件伺服器的设定需要特别留意,以免被作为广告信与垃圾信的跳板;
    • Mail server 使用的主机名称至少需要 A 的 DNS 标志,不过最好能够具有 MX 标志为宜,且正反解最好成对, 比较可以避免大型主机的抵挡;
    • 邮件主机主要是指 SMTP (简单邮件传送协定) 而已,不过要架设一部可利用类似 Thunderbird 收发的邮件伺服器, 最好能够具有 SMTP 以及 POP3 等通讯协定;
    • 电子邮件传送的元件,主要有 MUA, MTA, MDA 以及最终的 Mailbox 等等;
    • 电子邮件伺服器最需要搞定的地方其实是 Relay 的功能,千万不可 Open Relay 喔!
    • 一封电子邮件至少含有 header 以及 body 等资料在内;
    • 常见的可以启动 SMTP 的软体有 sendmail, postfix 及 qmail 等等。
    • 为避免收到大量的广告信,建议您不要将 email address 放在网际网路上,若需要某些功能必需将邮件位址放在网路上时, 最好能够拥有两个邮件位址,一个用来公开,一个则用来作为自己的主要联络之用。
    • 本章与 LPI 认证的关系:在 LPI 网站 http://www.lpi.org 里面提到的,关于 Sendmail 的考试题库的地方,只有在 LPI level 1 的 102 ,里面的 topic 113 Networking Services ,第二点当中,简易的 Sendmail 设定。强调的是‘应试者必须简单的设定 sendmail (指的应该是 m4 scripts ,不过会很简单!不要担心~)、能够建立 mail aliases 、能够管理邮件伫列、能够启动或者是关闭 sendmail 这个服务、了解使用者的邮件转递 (forward 功能),以及简单的 sendmail 除错!此外,应试者也需要了解什么是 Open Relay 与避免 Open Relay 才行!’至于会考的档案与指令可能有这些:

    大标题的图示课后练习
    • 当你利用你的 MTA 发信时,结果竟然被退信,退信的讯息 (/var/log/maillog) 最主要的错误是‘mail loop to me’, 请问可能的发生原因及处理方式为何?
    • 可能发生的原因是由于你的 MTA 设定项目方面的主机名称错误。判断你的 MTA 主机有多个 IP 存在, 不过你并未完全写入设定档中,因此造成某些主机名称无法被 MTA 所接收之故。在 sendmail 方面, 你只要将需要的主机名称写入 /etc/mail/local-host-names 即可,如果是 postfix ,则在 /etc/postfix/main.cf 当中修改 $mydestination 那个设定项目即可。
    • 我在使用 Sendmail 寄信时,却发生底下这个问题,请问可能的发生原因为何?
    • 可能的问题有两个:
      • 你的 Client 端电脑的 IP 或者是网域位址被 /etc/mail/access 所挡住,或者是 /etc/mail/access 没有打开你的 RELAY 权力;
      • 你有进行 SMTP 邮件认证的设定,但是忘记在 MUA 当中设定帐号与密码的项目了!
      • 如果不是这两个原因,那么可能的问题就多了!请详细的检查您的网路设定!
    • 请列出四个 Mail Server 的相关的元件,以及其功用为何?
      • Mail Client :邮件用户端,其实就是使用 mail 的那位使用者所在的电脑即可称为 mail client ;
      • Mail User Agent :为一个应用软体,主要的功能就是收受邮件主机的电子邮件,以及提供使用者浏览与编写邮件的功能;
      • Mail Transfer Agent :为在电脑与本地端 Mail server 或 Internet 上面的 Mail server 传送讯息与邮件的主机;
      • Mail Dilivery Agent :主要的功能就是将 MTA 所收受的本机信件,放置到本机帐户下的邮件档案中 ( Mailbox )!
    • POP3 与 SMTP 的功能为何?
      • SMTP 为使用于 MUA 或 MTA 与 MTA 之间的传输协定,通常使用 port 25 ,只要主机支援 SMTP ,并且其他 relay 的条件能配合,就可以进行邮件传递!
      • POP3 可以提供使用者经由 MUA 到 MTA 下载邮件,同时并可将邮件从主机上面删除!
    • 请简单的说明 DNS 里面 MX 标志与 Mail 的关系为何?
    • MX recode 可以可以让 mail server 经由 MX 以及 A ( address ) 这个记录来进行 mail gateway 与 mail route 的功能!能够达到的作用相当的多!
    • 今天我突然兴起,想要修改我的 sendmail ,请问, sendmail 的设定档在哪里?而我要以什么程式修改 sendmail 呢?
    • Sendmail 的设定档为 sendmail.cf ,这个档案通常放置在 /etc/sendmail.cf 或者 /etc/mail/sendmail.cf 您可以手动的编辑这个档案,不过不建议如此,取得代之的,可以使用 m4 这个程式来进行 macro 的动作,进一步的完成 sendmail.cf 的修改!至于使用 m4 时,需要先建立 m4 scripts ,再以 m4 转换才能形成 sendmail.cf 喔!
    • 什么是 mailling list ?在 sendmail 底下有什么方法可以不藉由其他的软体达到 mailling list 的功能?
    • Mailling list 就是将使用者寄给一个帐号邮件时,该帐号会主动的将该邮件传送到所有的用户去!有点类似目前的电子报!在 sendmail 底下,我们可以透过 aliases (需配合 newaliases) 以及 ~/.forward 来达成喔!
    • 如何察看邮件伫列的内容,以及邮件伫列内容放置在何方?
    • 使用 mailq 即可知道目前邮件伫列的内容,而邮件伫列虽然可以透过 sendmail.cf 来修改,不过,预设情况下,都是以 /var/spool/mqueue 为邮件伫列目录。
    • 若我的 sendmail 主机有很多名称,我想让这些名称都可以进行 mail 的接收,应该修改什么档案?
    • 可以修改 /etc/mail/local-host-names 来达成!
    • 什么是 Open Relay?
    • 所谓的 Open Relay 就是,不论发信端来自何处,您的 Open Relay 的主机均可以帮发信端将信件发送出去,这个称为 Open Relay 。如果您的 mail server 具有 open relay 的情况,那么很容易遭受到垃圾邮件的填充, 不但造成网路频宽的耗损,也容易让您的主机被列入黑名单当中!
    • 如果要让 Postfix 可以收发来自非本机的外部信件,您可以修改 main.cf 里面的什么参数?
    • 需要在 main.cf 里面修改的变数主要有:
      1. 当 Client 来自信任的网域,也就是 IP 符合 $mynetworks 的设定值时;
      2. 当 Client 来自信任的机器,也就是主机名称符合 $relay_domains 的设定项目时;
      3. 当 Client 来自不信任的网域,但是去的目的地主机端符合 $relay_domains 的设定时。
    • 如何察看您目前的 Postfix 伺服器的所有设定参数?(使用什么指令?)
    • 利用 postconf -n 可以察看‘目前 main.cf 里面设定的参数’,而如果要看所有的参数,则直接使用 postconf 即可!
    • Mail Server 能否运作与 DNS ( MX 与 A recode )的相关性为何?
    • 目前网际网路社会合法的 Mail server 通常仅会针对具有 MX 标志的邮件主机发出信件而已。 而如果有多重 MX 时,首先会选择最小 MX 主机寄信,依序处理。而最终依据 MX 主机的 A 标志来查得最终目标。
    • 什么是 smtp, pop3 以及 imap 协定,他们的用途分别是什么?
    • smtp:用来传递邮件的协定,通常我们称为 MTA 即是此一协定所达成
    • pop3:让 client 端向主机端要求收信的协定,通常预设收信完成后,主机端的 mail box 会被删除;
    • imap:与 pop3 类似,不过 imap 允许使用者在主机的家目录建立邮件资料匣

    大标题的图示参考资料

    2006/11/13:准备将原本的 sendmail 以及 postfix 整合成为一篇专门介绍 Mail server 的小文章啰!
    2006/11/14:原本的 sendmail 请参考这里,原本的 Postfix 则请参考这里。至于人数统计则以 sendmail 原本网页增加。
    2006/11/30:加上了邮件扫瞄与广告信抵挡的 spamassassin 机制,呼呼!好累~
    2006/12/05:加上自动学习广告信抵挡机制方面的简单介绍。
    2007/02/07:新增不要丢弃 exe 附档名的资讯!
    2007/02/27:感谢网友 Cheng-Lin Yang 提供的意见,在黑名单资料库增加了 http://www.anti-spam.org.cn/, http://www.spamhaus.org/
    2007/04/05:感谢 chunkit 兄的来信告知,将原本的 mail localhost 25 改成 telnet localhost 25 !

    2002/01/01以来统计人数

     
         
    本网页主要以 firefox 配合解析度 1024x768 作为设计依据
    http://linux.vbird.org is designed by VBird during 2001-2009. Aerosol Lab.