安装postfix

p_w_picpath

安装完成以后,进入/etc/postfix目录

p_w_picpath

修改postfix主配置文件 main.cf ,现在我们要修改配置文件了,主要修改七个地方

第一和第二个是设置主机名和域名

第一个需要修改的参数是myhostname,指向真正的域名

mydomain参数指向根域

p_w_picpath

第三个是设置本机寄出去的邮件所使用的域名或主机名

myorigin和mydestination都可以指向mydomain

如果你的邮件服务器有ip和直接域名ip一样,就可以使用$mydomin,如果不一样最好使用$myhostname

p_w_picpath

设置postfix监听的接口,这里使用监听所有接口

Postfix默认只监听本地地址,如果要与外界通信,就需要监听网卡的所有IP

p_w_picpath

可以接受的主机名或者域名的邮件,这里只能写自己的主机名和域名,比如写入163.com,那么给163.com发送邮件,自己就会收到

 p_w_picpath

可转发哪些网络的邮件,一般都只转发信任网络的邮件

p_w_picpath

Postfix默认将子网内的机器设置为可信任机器,如果只信任本机,就设置为host:

mynetworks_style = host

配置哪些地址的邮件能够被Postfix转发,当然是mydomain的才能转发,否则其他人都可以用这台邮件服务器转发垃圾邮件了:

relay_domains = $mydomain

可转发哪些网络域的邮件,这个是函数mydestination,刚才我们设置过mydestination,也就是只转发本地域的邮件,这个是为了防止垃圾邮件的策略

p_w_picpath

基本设置就这么多,然后保存退出

由于我们的服务器现在正在运行sendmail,所以我们要关闭sendmail,这样postfix才能正常运行,切忌要使用kill命令杀掉sendmail的进程,因为系统使用的sendmail来通知系统状态然后启动postfix

 p_w_picpath

看看25号端口是不是被master监听起来了

 p_w_picpath

开始测试,给51cto用户发了一封邮件。

p_w_picpath

我们换成51cto用户接受试试

p_w_picpath 

成功收到邮件

启动dovecot服务

service dovecot start

p_w_picpath

然后我们使用win下的工具试试,首先修改dns服务器地址

p_w_picpath

测试能不能解析michael.com

p_w_picpath

解析成功

测试postfix服务器25、110端口工作正常哈~

p_w_picpath

p_w_picpath

打开outlook

p_w_picpath

我们用outlook给root发送邮件试试

p_w_picpath

p_w_picpath 

邮件内容没有显示,看来是字符编码的问题了,服务器是没问题的,主要是服务器的编码显示不出来,服务器是utf8的编码,WIN2003是gb2312的编码,但是client和client之间是没问题的,如果想在服务器上看邮件,需要修改下字符集

也可以使用我们讲过的mutt工具

p_w_picpath

使用mutt可以正常查看邮件内容哈~

下面说说postfix的访问控制和别名配置

打开/etc/postfix/access文件

p_w_picpath

这个文件的精华就在这里

p_w_picpath

上面一句是需要加到/etc/postfix/main.cf中去,他已经说明。下面一句是client端描述方式

smtpd_client_restrictions = check_client_access hash:/etc/postfix/access这句加到main.cf的最后面

p_w_picpath

我们禁止192.168.8.88使用postfix邮件服务

p_w_picpath

刚才我的outlook是可以收发邮件的,现在我们试试看还可以不

修改了access后,需要使用这个命令更新数据库

postmap /etc/postfix/access

然后重新启动postfix

p_w_picpath

p_w_picpath

不能发送了

p_w_picpath

我们把刚才的设置取消试试

p_w_picpath

p_w_picpath

正常发送了

p_w_picpath

root用户也正常接收

p_w_picpath

p_w_picpath

下面的内容是别名列表,这个别名列表和sendmail的别名列表一样,修改的文件也是一样/etc/aliases,修改完成使用posalias /etc/aliases 

可以参考sendmail课程的内容,RHCE课程-RH253Linux服务器架设笔记七-Sendmail服务器配置 

vim /etc/aliases

p_w_picpath

postalias /etc/aliases

p_w_picpath

测试一下

p_w_picpath

michael帐号正常接收

p_w_picpath

51cto帐号正常接收

p_w_picpath

查看配置信息postconf -n

p_w_picpath 

#####################Michael分割线####################

Postfix已经基本配置完成,我们需要对邮件的发送进行控制:

对于外域到本域的邮件,必须接收,否则,收不到任何来自外部的邮件;

对于本域到外域的邮件,只允许从本机发出,否则,其他人通过伪造本域地址就可以向外域发信;

对于外域到外域的邮件,直接拒绝,否则我们的邮件服务器就是Open Relay,将被视为垃圾邮件服务器。

先设置发件人的规则:

smtpd_sender_restrictions = permit_mynetworks, check_sender_access hash:/etc/postfix/sender_access, permit

以上规则先判断是否是本域地址,如果是,允许,然后再从sender_access文件里检查发件人是否存在,拒绝存在的发件人,最后允许其他发件人

然后设置收件人规则:

smtpd_recipient_restrictions = permit_mynetworks, check_recipient_access hash:/etc/postfix/recipient_access, reject

p_w_picpath

以上规则先判断是否是本域地址,如果是,允许,然后再从recipient_access文件里检查收件人是否存在,允许存在的收件人,最后拒绝其他收件人。

p_w_picpath

/etc/postfix/sender_access的内容:

michael.com REJECT

p_w_picpath

目的是防止其他用户从外部xx@michael.com身份发送邮件,但登录到本机再发送则不受影响,因为第一条规则permit_mynetworks允许本机登录用户发送邮件。

/etc/postfix/recipient_access的内容:

michael@michael.com OK
51cto@michael.com OK

p_w_picpath

因此,外域只能发送给以上两个Email地址,其他任何地址都将被拒绝。但本机到本机发送不受影响。

最后用postmap生成hash格式的文件:

# postmap sender_access

# postmap recipient_access

p_w_picpath

发送正常

p_w_picpath

现在我们来禁止发件人51cto@michael.com,修改main.cf去掉permit_mynetworks

p_w_picpath

设置michael.com为OK,51cto@michael.com为REJECT

p_w_picpath

测试一下

p_w_picpath

而其他本域用户可以正常收发~现在我们取消限制

p_w_picpath

p_w_picpath

又可以发送了~

p_w_picpath

#####################Michael分割线####################

参考:

4.1 postfix的配置文件结构

postfix的配置文件位于/etc/postfix下,安装完postfix以后,我们可以通过ls命令查看postfix的配置文件:

[root@mail postfix]# ls

install.cf main.cf master.cf postfix-script

这四个文件就是postfix最基本的配置文件,它们的区别在于:

mail.cf:是postfix主要的配置文件。

Install.cf:包含安装过程中安装程序产生的postfix初始化设置。

master.cf:是postfix的master进程的配置文件,该文件中的每一行都是用来配置postfix的组件进程的运行方式。

postfix-script:包装了一些postfix命令,以便我们在linux环境中安全地执行这些postfix命令。

4.2 postfix的基本配置

postfix大约有100个配置参数,这些参数都可以通过main.cf 指定。配置的格式是这样的,用等号连接参数和参数的值。如:

myhostname = mail.mydomain.com

等号的左边是参数的名称,等号的右边是参数的值; 当然,我们也可以在参数的前面加上$来引用该参数,如:

myorigin = $myhostname

虽然postfix有100个左右的参数,但是postfix为大多数的参数都设置了缺省值,所以在让postfix正常为你服务之前,你只需要配置为数不多的几个参数。下面我们一起来看一看这些基本的postfix参数。需要注意的是,一旦你更改了main.cf文件的内容,则必须运行 postfix reload命令使其生效。

1. myorigin

myorigin参数指明发件人所在的域名。如果你的用户的邮件地址为user@domain.com,则该参数指定@后面的域名。缺省地, postfix使用本地主机名作为myorigin,但是建议你最好使用你的域名,因为这样更具有可读性。比如:安装postfix的主机为 mail.domain.com则我们可以这样指定myorigin:

myorigin = domain.com

当然我们也可以引用其他参数,如:

myorigin = $mydomain

2. mydestination

mydestination参数指定postfix接收邮件时收件人的域名,换句话说,也就是你的postfix系统要接收什么样的邮件。比如:你的用户的邮件地址为user@domain.com, 也就是你的域为domain.com, 则你就需要接收所有收件人为user_name@domain.com的邮件。与myorigin一样,缺省地,postfix使用本地主机名作为 mydestination。如:

mydestination = $mydomain

mydestination = domain.com

3. notify_classes

在postfix系统中,必须指定一个postfix系统管理员的别名指向一个用户,

只有这样,在用户遇到问题时才有报告的对象,postfix也才能将系统的问题报告给管理员。notify_classes参数就是用来指定向postfix管理员报告错误时的信息级别。共有以下几种级别:

bounce:将不可以投递的邮件的拷贝发送给postfix管理员。出于个人隐私的缘故,该邮件的拷贝不包含信头。

2bounce:将两次不可投递的邮件拷贝发送给postfix管理员。

delay:将邮件的投递延迟信息发送给管理员,仅仅包含信头。

policy:将由于UCE规则限制而被拒绝的用户请求发送给postfix管理员,包含整个SMTP会话的内容。

protocol:将协议的错误信息或用户企图执行不支持的命令的记录发送给postfix管理员。同样包含整个SMTP会话的内容。

resource:将由于资源错误而不可投递的错误信息发送给postfix管理员,比如:队列文件写错误等等。

software:将由于软件错误而导致不可投递的错误信息发送给postfix管理员。

缺省值为:

notify_classes = resource, software

4.myhostname

myhostname 参数指定运行postfix邮件系统的主机的主机名。缺省地,该值被设定为本地机器名。你也可以指定该值,需要注意的是,要指定完整的主机名。如:

myhostname = mail.domain.com

5.mydomain

mydomain参数指定你的域名,缺省地,postfix将myhostname的第一部分删除而作为mydomain的值。你也可以自己指定该值,如:

mydomain = domain.com

6.mynetworks

mynetworks 参数指定你所在的网络的网络地址,postfix系统根据其值来区别用户是远程的还是本地的,如果是本地网络用户则允许其访问。你可以用标准的A、B、C类网络地址,也可以用CIDR(无类域间路由)地址来表示,如:

192.168.1.0/24

192.168.1.0/26

7.inet_interfaces

inet_interfaces 参数指定postfix系统监听的网络接口。缺省地,postfix监听所有的网络接口。如果你的postfix运行在一个虚拟的ip地址上,则必须指定其监听的地址。如:

inet_interfaces = all

inet_interface = 192.168.1.1

4.3 postfix的UCE(unsolicited commercial email)控制

所谓UCE控制就是指控制postfix接收或转发来自于什么地方的邮件。

缺省地,postfix转发符合以下条件的邮件:

* 来自客户端ip地址符合$mynetworks的邮件。

* 来自客户端主机名符合$relay_domains及其子域的邮件。

* 目的地为$relay_domains及其子域的邮件。

缺省地,postfix接受符合以下条件的邮件:

* 目的地为$inet_interfaces的邮件。

* 目的地为$mydestination的邮件。

* 目的地为$virtual_maps的邮件。

但是我们也可以通过下面的规则来实现更强大的控制功能。

1. 信头过滤

通过header_checks参数限制接收邮件的信头的格式,如果符合指定的格式,则拒绝接收该邮件。可以指定一个或多个查询列表,如果新邮件的信头符合列表中的某一项则拒绝该接收邮件。如:

header_checks = regexp:/etc/postfix/header_checks

header_checks = pcre:/etc/postfix/header_checks

缺省地,postfix不进行信头过滤。

2.客户端主机名/地址限制

通过smtpd_client_restrictions参数限制可以向postfix发起SMTP 连接的客户端的主机名或ip地址。可以指定一个或多个参数值,中间用逗号隔开。限制规则是按照查询的顺序进行的,第一条符合条件的规则被执行。可用的规则有:

reject_unknown_client:如果客户端的ip地址在DNS中没有PTR记录则拒绝转发该客户端的连接请求。可以用 unknown_client_reject_code参数指定返回给客户机的错误代码(缺省为450)。如果你有用户没有作DNS记录则不要启用该选项。

permit_mynetworks:如果客户端的ip地址符合$mynetworks参数定义的范围则接受该客户端的连接请求,并转发该邮件。

check_client_access maptype:mapname:根据客户端的主机名、父域名、ip地址或属于的网络搜索access数据库。如果搜索的结果为REJECT 或者 '[45]XX text' 则拒绝该客户端的连接请求;如果搜索的结果为OK、RELAY 或数字则接受该客户端的连接请求,并转发该邮件。。可以用access_map_reject_code参数指定返回给客户机的错误代码(缺省为 554)。

reject_maps_rbl:如果客户端的网络地址符合$maps_rbl_domains参数的值则拒绝该客户端的连接请求。可以用maps_rbl_reject_code参数指定返回给客户机的错误代码(缺省为554)。

示例:

smtpd_client_restrictions = hash:/etc/postfix/access, reject_maps_rbl

smtpd_client_restrictions = permit_mynetworks, reject_unknown_client

该参数的缺省值为:

smtpd_client_restrictions =

也即接收来自任何客户端的SMTP连接。

3. 是否请求HELO命令

可以通过smtpd_helo_required参数指定客户端在SMTP会话的开始是否发送一个HELO命令。你可以指定该参数的值为yes或no。缺省值为:

smtpd_helo_required = no

4. HELO主机名限制

可以通过smtpd_helo_restrictions参数指定客户端在执行HELO命令时发送给postfix的主机名。缺省地, postfix 接收客户端发送的任意形式的主机名。可以指定一个或多个参数值,中间用逗号隔开。限制规则是按照查询的顺序进行的,第一条符合条件的规则被执行。可用的规则有:

reject_invalid_hostname:如果HELO命令所带的主机名参数不符合语法规范则拒绝客户机的连接请求。可以用invalid_hostname_reject_code参数指定返回给客户机的错误代码(缺省为501)。

permit_naked_ip_address:RFC要求客户端的HELO命令包含的ip地址放在方括号内,你可以用permit_naked_ip_address参数取消该限制。因为有的mail客户端不遵守该RFC的规定。

reject_unknown_hostname:如果客户端执行HELO命令时的主机名在DNS中没有相应的A 或 MX 记录则拒绝该客户端的连接请求。可以用invalid_hostname_reject_code参数指定返回给客户机的错误代码(缺省为450)。

reject_non_fqdn_hostname:如果客户端执行HELO命令时的主机名不是RFC规定的完整的域名则拒绝客户端的连接请求。可以用invalid_hostname_reject_code参数指定返回给客户机的错误代码(缺省为504)。

check_helo_access maptype:mapname:根据客户端HELO的主机名、父域名搜索access数据库。如果搜索的结果为REJECT 或者 '[45]XX text' 则拒绝该客户端的连接请求;如果搜索的结果为OK、RELAY 或数字则接受该客户端的连接请求。可以用access_map_reject_code参数指定返回给客户机的错误代码(缺省为554)。

示例:

smtpd_helo_restrictions = permit_mynetworks, reject_invalid_hostname

5. RFC 821信头限制

RFC 821对邮件的信头做了严格的规定,但是广泛使用的sendmail并不支

持该规定,所以对于该参数我们只能说不,即:

strict_rfc821_envelopes = no

6. 通过发件人地址进行限制

可以用smtpd_sender_restrictions参数通过发件人在执行MAIL FROM命令时提供的地址进行限制。可以指定一个或多个参数值,中间用逗号隔开。限制规则是按照查询的顺序进行的,第一条符合条件的规则被执行。可用的规则有:

reject_unknown_sender_domain:如果MAIL FROM命令提供的主机名在DNS中没有相应的A 或 MX 记录则拒绝该客户端的连接请求。可以用unknown_address_reject_code参数指定返回给客户机的错误代码(缺省为450)。

check_sender_access maptype:mapname:根据MAIL FROM命令提供的主机名、父域搜索access数据库。如果搜索的结果为REJECT 或者 '[45]XX text' 则拒绝该客户端的连接请求;如果搜索的结果为OK、RELAY 或数字则接受该客户端的连接请求。可以用access_map_reject_code参数指定返回给客户机的错误代码(缺省为554)。可以通过该参数过滤来自某些不受欢迎的发件人的邮件。

reject_non_fqdn_sender:如果MAIL FROM命令提供的主机名不是RFC规定的完整的域名则拒绝客户端的连接请求。可以用non_fqdn_reject_code 参数指定返回给客户机的错误代码(缺省为504)。

缺省地,postfix接受来自任何发件人的邮件。

示例:

smtpd_sender_restrictions = hash:/etc/postfix/access, reject_unknown_sender_domain

7. 通过收件人地址进行过滤

可以用smtpd_recipient_restrictions参数通过发件人在执行RCPT TO命令时提供的地址进行限制。缺省值为:

smtpd_recipient_restrictions = permit_mynetworks, check_relay_domains

可以指定一个或多个参数值,中间用逗号隔开。限制规则是按照查询的顺序进行的,第一条符合条件的规则被执行。可用的规则有:

check_relay_domains:如果符合以下的条件,则接受SMTP连接请求,否则拒绝该连接,可以用relay_domains_reject_code 参数指定返回给客户机的错误代码(缺省为504)。

* 客户端主机名符合$relay_domains及其子域

* 目的地为$inet_interfaces、$mydestination或$virtual_maps

permit_auth_destination:不管客户端的主机名,只要符合以下的条件,就

接受SMTP连接请求:

* 解析后的目标地址符合$relay_domains及其子域

* 解析后的目标地址符合$inet_interfaces、$mydestination或$virtual_maps

reject_unauth_destination:不管客户端的主机名,只要符合以下的条件,就拒绝该客户端SMTP连接请求:

* 解析后的目标地址符合$relay_domains及其子域

* 解析后的目标地址符合$inet_interfaces、$mydestination或$virtual_maps

check_recipient_access:根据解析后的目标地址、父域搜索access数据库。如果搜索的结果为REJECT 或者 '[45]XX text' 则拒绝该客户端的连接请求;如果搜索的结果为OK、RELAY 或数字则接受该客户端的连接请求。可以用access_map_reject_code参数指定返回给客户机的错误代码(缺省为554)。

reject_unknown_recipient_domain:如果收件人的邮件地址在DNS中没有相应的A 或 MX 记录则拒绝该客户端的连接请求。可以用unknown_address_reject_code参数指定返回给客户机的错误代码(缺省为450)。

reject_non_fqdn_recipient:如果发件人在执行RCPT TO命令时提供的地址

不是完整的域名则拒绝其SMTP连接请求。可以用The non_fqdn_reject_code参数指定返回给客户机的错误代码(缺省为504)。

4.4 posftfix的性能控制

之所以对postfix的性能进行控制,是为了在遇到邮件风暴时保证postfix可以正常运行。通常,我们可以通过对下列postfix 参数的配置来调节postfix的性能,这些参数都是通过mail.cf配置文件进行配置的,修改以后不要忘了运行postfix reload命令来使配置生效。

1. 进程数限制

可以通过default_process_limit 参数来控制postfix系统同时可以运行的最大进程数目。缺省值是50个。

2. 对同一目标主机的并发连接限制

当向同一目标主机发出SMTP连接时,postfix初始化发出两个SMTP连接,如果投递成功则增加并发的SMTP连接数目,遇到拥塞时又减少并发连接的数目。postfix中通过以下的参数对同一目标主机的并发连接进行控制:

* initial_destination_concurrency:控制对同一目标主机的初始化并发连接数目。缺省值为2。

* default_destination_concurrency_limit:控制初始化连接后对同一目标主机的最大并发连接数目。缺省值为10。

* local_destination_concurrency_limit:控制对同一本地收件人的最大同时投递的邮件数目。缺省值为2,因为对本地同一收件人投递邮件时投递工作只能一个接一个的进行,所以设得在大也没用。

3. 对同一封邮件的收件人数目限制

通过default_destination_recipient_limit参数来控制postfix的投递代理(如

smtp进程)可以将同一封邮件发送给多少个收件人。缺省值为50。也可以用明确指出该投递代理的参数来覆盖该缺省值。如用smtpd_recipient_limit来指定smtp投递代理可以将同一封邮件发送给多少个收件人,该参数的缺省值为1000。

4. 推迟投递控制

通过defer_transports参数,我们可以推迟投递该参数指定的邮件直到postfix明确的提出投递要求。下面我们看一个例子:

有一个小型的局域网,用户都将邮件发送给局域网内部的一台postfix邮件服务器,然后通过在该服务器上拨号将邮件发送出去。这时我们可以这样指定该参数的值:

defer_transports = smtp

该语句表示postfix推迟投递所有的邮件直到执行sendmail -q命令,这样我们就可以在ppp的脚本中加上sendmail -q,以便在拨号成功后让postfix开始投递邮件。