?
myhostname:设定主机名,需使用 FQDN 喔
这个项目在于设定你的主机名,且这个设定值会被后续很多其他的参数所引用,所以必须要设定正确才行。 你应该要设定成为完整的主机名。在鸟哥的这个练习当中,应该设定为: myhostname = www.centos.vbird 才对。 除了这个设定值之外,还有一个 mydomain 的设定项目,这个项目默认会取 $myhostname 第一个『.』之后的名称。 举例来说上头设定完毕后,预设的 mydomain 就是 centos.vbird 啰!你也可以自行设定他。
myorigin :发信时所显示的『发信源主机』项目
这个项目在设定『邮件头上面的 mail from 的那个地址』, 也就是代表本 MTA 传出去的信件将以此设定值为准喔!如果你在本机寄信时忘记加上 Mail from 字样的话, 那么就以此值为准了。默认这个项目以 $myhostname 为主的,例如: myorigin = $myhostname
inet_interfaces :设定 postfix 的监听接口 (极重要)
在预设的情况下你的 Postfix 只会监听本机接口的 lo (127.0.0.1) 而已,如果你想要监听整个 Internet 的话, 请开放成为对外的接口,或者是开放给全部的接口,常见的设定方法为: inet_interfaces = all 才对! 由于如果有重复设定项目时,会以最晚出现的设定值为准,所以最好只保留一组 inet_interfaces 的设定喔! inet_protocols :设定 postfix 的监听 IP 协议
预设 CentOS 的 postfix 会去同时监听 IPv4, IPv6 两个版本的 IP,如果你的网络环境里面仅有 IPv4 时,那可以直接指定 inet_protocols = ipv4 就会避免看到 :::1 之类的 IP 出现呦!
mydestination :设定『能够收信的主机名』 (极重要)
这个设定项目很重要喔!因为我们的主机有非常多的名字,那么对方填写的 mail to 到底要写哪个主机名字我们才能将该信件收下? 就是在这里规范的!也就是说,你的许多主机名当中,仅有写入这个设定值的名称才能作为 email 的主机地址。 在我们这个练习当中这部主机有三个名字,所以写法为: mydestination = $myhostname, localhost, linux.centos.vbird, ftp.centos.vbird
如果你想要将此设定值移动到外部档案,那可以使用类似底下的作法: mydestination = /etc/postfix/local-host-names ,然后在 local-host-names 里面将可收信的主机名写入即可。一般来说,不建议你额外建立 local-host-names 这个档案啦, 直接写入 main.cf 即可说!特别留意的是,如果你的 DNS 里头的设定有 MX 标志的话,那么请将 MX 指向的那个主机名一定要写在这个 mydestination 内, 否则很容易出现错误讯息喔!一般来说,使用者最常发生错误的地方就在这个设定里头呢!
?
?
?
?
?
mynetworks_style :设定『信任网域』的一项指标
这个设定值在规定『与主机在同一个网域的可信任客户端』的意思!举例来说,鸟哥的主机 IP 是 192.168.100.254,如果我相信整个局域网络内 (192.168.100.0/24) 的用户的话,那我可规定此设定值为『 subnet 』吶! 不过,一般来说,因为底下的 mynetworks 会取代这个设定值, 所以不设定也没有关系喔!如果要设定的话,最好设定成为 host 即可 (亦即仅信任这部 MTA 主机而已)。
?
mynetworks :规定信任的客户端 (极重要)
你的 MTA 能不能帮忙进行 Relay 与这个设定值最有关系!举例来说,我要开放本机与内部网域的 IP 时,就可以这样进行设定: mynetworks = 127.0.0.0/8, 192.168.100.0/24。如果你想要以 /etc/postfix/access 这个档案来控制 relay 的用户时,那鸟哥可以建议你将上述的数据改写成这样: mynetworks = 127.0.0.0/8,
192.168.100.0/24, hash:/etc/postfix/access 然后你只要再建立 access 之后重整成数据库后,嘿嘿!就能够设定 Relay 的用户啰!
?
relay_domains :规范可以帮忙 relay 的下一部 MTA 主机地址
相对于 mynetworks 是针对『信任的客户端』而设定的,这个 relay_domains 则可以视为『针对下游 MTA 服务器』而设定的。举例来说,如果你这部主机是 www.niki.centos.vbird 的 MX 主机时, 那你就得要在 relay_domains 设定针对整个 niki.centos.vbird 这个领域的目标信件进行转递才行。 在预设的情况下,这个设定值是 $mydestination 而已啦。
你必需要注意的『Postfix 预设并不会转递 MX 主机的信件』,意思就是说:如果你有两部主机,一部是上游的 MTAup ,一部是下游的 MTAdown ,而 MTAdown 规范的 MX 主机是 MTAup,由 22.1.2 谈到的 DNS 的 MX 设定值与信件传递方向,我们知道任何想要寄给 MTAdown 主机的信件, 都会先经过 MTAup 来转递才行!此时如果那部 MTAup 没有开启帮 MTAdown 进行 relay 的权限时, 那么任何传给 MTAdown 的信件将『全部都被 MTAup 所退回』!从此 MTAdown 就无法收到任何信件了。
上一段的说明请您特别再想一想,因为如果你在大公司服务而且你的公司上、下游均有 mail server 时, 并且也有设定 MX 的状况下,嘿嘿!这个 relay_domains 就很重要啦!上游的 MTA 主机必需要启动这个设定。 一般来说除非你是某部 MTA 主机的 MX 源头,否则这个设定项目可以忽略不设定他。 而如果你想要帮你的客户端转递信件到某部特定的 MTA 主机时,这个设定项目也是可以设定的啦。 默认请您保留默认值即可。
?
alias_maps :设定邮件别名
就是设定邮件别名的设定项目,只要指定到正确的档案去即可,这个设定值可以保留默认值啊:
在了解上述的设定后,以鸟哥的范例来看的话,鸟哥有更动过或注明重要的设定值以及相关档案是这样处理的: [root@www ~]# vim /etc/postfix/main.cf myhostname = www.centos.vbird <==约在第 77 行 myorigin = $myhostname <==约在第 99 行 inet_interfaces = all <==约在第 114 行,117 行要批注掉 inet_protocols = ipv4 <==约在第 120 行 mydestination = $myhostname, localhost.$mydomain, localhost, linux.centos.vbird, ftp.centos.vbird <==约在第 165,166 行 mynetworks = 127.0.0.0/8, 192.168.100.0/24, hash:/etc/postfix/access <==约在269行 relay_domains = $mydestination <==约在第 299 行 alias_maps = hash:/etc/aliases alias_database = hash:/etc/aliases <==约在第 389, 400 行 # 其他的设定值就先保留默认值即可啊! [root@www ~]# postmap hash:/etc/postfix/access [root@www ~]# postalias hash:/etc/aliases 因为 main.cf 当中我们有额外加入两个外部配置文件 (mynetworks 及 alias_maps) ,所以才会额外进行 postmap 及 postalias。然后准备来启动啦!你可以这样处理喔:
# 1. 先检查配置文件的语法是否有错误 [root@www ~]# /etc/init.d/postfix check <==没有讯息,表示没有问题。 # 2. 启动与观察 port number [root@www ~]# /etc/init.d/postfix restart [root@www ~]# netstat -tlunp | grep ':25' 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 13697/master 很简单吧!这样就设定妥当了。假设你的防火墙已经处理完毕,那你的 Postfix 已经可以开放客户端进行转递,并且也可以收受信件啰!不过,到底在预设的情况下我们的 postfix 可以收下哪些信件?又可以针对哪些设定值的内容进行转递呢?这就得要参考下一小节的说明了。
22.2.5 信件传送流程与收信、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. 若这封信的标头数据都不合乎上述的规范,则终止联机,并不会接受信件的内容数据的。
整个流程有点像底下这样:
图 22.2-1、在本机 MTA 当中的信件分析过程
也就是说标头分析通过后,你的信件内容才会开始上传到主机的队列,然后透过 MDA 来处理该信件的流向。 而不是将信件完整的传送到主机后才开始分析的喔!这个得要特别注意吶!而透过上述的流程后, 在暂不考虑 access 以及 MDA 的分析机制中,一部 MTA 想要正确的收、发信件时,电子邮件必需要符合:
?
收信方面:必需符合底下需求:
1. 发信端必需符合 $inet_interfaces 的设定;
2. 信件标头之收件者主机名必需符合 $mydestination 的设定, 或者收件主机名需要符合 $virtual_maps (与虚拟主机有关) 的设定;
?
转递方面 (Relay):必需符合底下需求:
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 数据以供查验才行喔!
22.2.6 设定邮件主机权限与过滤机制 /etc/postfix/access
基本上,指定了 Postfix 的 mynetworks 的信任来源就能够让使用者 relay 了,不过如果你依照鸟哥上述的方式 (22.2.4) 来设定你的 mynetworks 的话,那么我们还可以利用 access 这个档案来额外管理我们的信件过滤呢!基本的 access 语法为: 规范的范围或规则 Postfix 的动作 (范例如下) IP/部分IP/主机名/Email等 OK/REJECT 假设你想要让 120.114.141.60 还有 .edu.tw 可以使用这部 MTA 来转递信件,且不许 av.com 以及 192.168.2.0/24 这个网域的使用时,可以这样做:
[root@www ~]# vim /etc/postfix/access 120.114.141.60 OK .edu.tw OK av.com REJECT 192.168.2. REJECT # OK 表示可接受,而 REJECT 则表示拒绝。 [root@www ~]# postmap hash:/etc/postfix/access