分享

Postfix邮件网关

 秋风无情萤火虫 2014-04-18

公司有一个外网邮件服务器(mail.drweb.com.cn)和一个内网邮件服务器(mail.eastar.com),想让内网只能够发送邮件到外网邮件服务器,不能发送给外网其他邮件服务器(这样,同时拥有内网邮箱和外网邮箱的员工才可以将内部资料传到外网,这样内网邮箱的员工就不会泄密了),同时,外网邮件服务器也可以发送邮件到内网。考虑到将来拓扑可能要扩展,决定添加一个邮件网关服务器。邮件网关只转发drweb.com.cn和eastar.com域来的邮件,拒绝外网其他邮件服务器寄来的邮件。

内网邮件服务器:
hostname: mail.eastar.com
IP address: 192.168.1.160/24(eth0)

邮件网关服务器:
hostname: mailgateway.eastar.com (eth0)
IP address: 192.168.1.169/24 (eth0)
                   172.24.1.8/24 (eth1)  -->  221.223.10.215(mail.iman.com)

邮件网关的eth0和eth1是物理隔离的网络,eth0是不能连接到Internet,而eth1可以连接到Internet。公网IP 221.223.10.215映射到eth1上,用了与外网邮件服务器发信。

外网邮件服务器:
hostname: mail.drweb.com.cn
IP地址不固定,因为是买的邮件服务。


邮件网关配置

编译安装postfix 2.3.19(postfix 2.3的最高版本): 略

 

配置邮件网关:


# vim /etc/postfix/main.cf
--------------------------------------------------
inet_interfaces = all
# 监听所有IP地址。

mynetworks = 192.168.1.0/24, 127.0.0.1/8
# 指定受信任的网络,当然是内网了。

relay_domains = drweb.com.cn,eastar.com
# 指定允许转发哪个域的邮件。

transport_maps = hash:/etc/postfix/transport
# 指定个传输表,自定义邮件传输路径。

alias_maps = hash:/etc/aliases
# 指定本地投递代理使用的别名数据库列表。如果不指定,日志里会有一条警告信息:
# warning: dict_nis_init: NIS domain name not set - NIS lookups disabled
--------------------------------------------------

# vim /etc/postfix/transport
--------------------------------------------------
drweb.com.cn           relay:[smtp.drweb.com.cn]
# 发往drweb.com.cn域的邮件,转发到drweb.com.cn域的SMTP服务器,即smtp.drweb.com.cn。
# 用方括号[]将主机名或IP地址括起来,表示禁止去查smtp.drweb.com.cn的MX纪录。

iman.com                  relay:[192.168.1.160]
# 发往iman.com域的的邮件,转发到192.168.1.160。
--------------------------------------------------

# postmap /etc/postfix/transport
# /etc/init.d/postfix start

# vim /etc/hosts
-------------------------------------------
192.168.1.169 mailgateway.eastar.com
-------------------------------------------

# vim /etc/sysconfig/network
-------------------------------------------
HOSTNAME=mailgateway.eastar.com
-------------------------------------------

# vim /etc/resolv.conf
-------------------------------------------
nameserver 192.168.1.248
nameserver 219.141.140.10

-------------------------------------------
设置成内网和外网的DNS的IP地址。

 


配置内网邮件服务器:

内网的邮件系统是个正常运行的,main.cf中之前配置好的参数都不用动,只要添加一个参数即可:

# vim /etc/postfix/main.cf
------------------------------------------
relayhost = [mailgateway.eastar.com]
------------------------------------------
relayhost指定目的地不为本地的下一跳。就是说如果发送的邮件的目的地不是本地(非本地),就转发到relayhost指定的主机上,而不管收件人地址是哪个域的。非mydestination参数指定的域都是非本地。

 

 

调试1:eastar.com --> drweb.com.cn


在内网给rui.qu@drweb.com.cn发送一封邮件,观察内网邮件服务器(mail.eastar.com)上的日志:

postfix/smtpd[17287]: connect from qurui_x.eastar.com[192.168.1.200]
postfix/smtpd[17287]: E20F1778C0: client=qurui_x.eastar.com[192.168.1.200]
postfix/cleanup[17294]: E20F1778C0: message-id=<
000f801ccc6d1$04399990$0cacccb0$@com>
postfix/qmgr[17198]: E20F1778C0: from=<
qurui@eastar.com>, size=8497, nrcpt=1 (queue active)
postfix/smtp[17303]: E20F1778C0: to=<
rui.qu@drweb.com.cn>, relay=mailgateway.eastar.com[192.168.1.169]:25, delay=0.21, delays=0.18/0/0.01, dsn=2.0.0, status=send (250 2.0.0 ok: queued as 60C0A48DBB0)
postfix/qmgr[17198]: E20F1778C0: removed
postfix/smtpd[17287]: disconnect from qurui_x.eastar.com[192.168.1.200]

看了邮件已经发出现了,发到mailgateway.eastar.com上去了,那就去看看邮件网关服务器上的日志:

postfix/smtpd[7693]: connect from mail.eastar.com[192.168.1.160]
postfix/smtpd[7693]: 60C0A48DBB0: client=mail.eastar.com[192.168.1.160]
postfix/cleanup[7696]: 60C0A48DBB0: message-id=<
000f801ccc6d1$04399990$0cacccb0$@com>
postfix/qmgr[7499]: 60C0A48DBB0: from=<
qurui@eastar.com>, size=8497, nrcpt=1 (queue active)
postfix/smtp[7697]: 60C0A48DBB0: to=<
rui.qu@drweb.com.cn>, relay=smtp.drweb.com.cn[221.14.10.5]:25, delay=5.9, delays=0.01/5.3/0.65, dsn=2.0.0, status=send (250 Mail OK queued as AQAAf3AbAQSLfP1OLwAAAA--.18S3)
postfix/qmgr[7499]: 60C0A48DBB0: removed

邮件网关也成功发出。到外网邮箱收邮件吧!OK,也收到了。但是发件人却是qurui@eastar.com,如果就这样回复邮件,邮件就会发送到公网上的eastar.com域。如果该域没有qurui帐户,就会收到一封退信。这可不是我们希望的。

可以有人会有这样的疑问:为什么不把邮件网关上映射到eth1的公网IP地址221.223.10.215对应到eastar.com域呢?(即将eastar.com的MX记录指向221.223.10.215)

完全可以这样。可以在规划的时候,找一个在公网没有人注册的域名。本文中没有这样做是因为,现在内网使用的域名,在公网有人注册了。所以就使用iman.com这个域名了。

那怎样能让发件人地址由qurui@eastar.com变成qurui@iman.com呢?
我的思路是在邮件还没有进入邮件网关的队列之前,修改邮件头部。这个环节由postfix的cleanup daemon来完成。将用到header_checks参数,在邮件网关上的配置如下:

# vim /etc/postfix/main.cf
------------------------------------------------
header_checks = regexp:/etc/postfix/header_checks
------------------------------------------------
# vim /etc/postfix/header_checks
------------------------------------------------
/(.*)\@eastar\.com(.*)/i REPLACE ${1}@iman.com${2}
------------------------------------------------
两个“/”之间是正则表达式,第一个括号中的内容被复制到${1}变量中,第二个括号中的内容被复制到${2}变量中,i标记为不区分大小写,被替换成“${1}@iman.com${2}”。

# /etc/init.d/postfix reload

然后在mail.eastar.com上再发送一封邮件给rui.qu@drweb.com.cn,并观察邮件网关上的日志,发现多了一行:

postfix/cleanup[7699]: 78BC1E55C0: replace: header From: "qurui" <qurui@eastar.com> from mail.eastar.com[192.168.1.160]; from=<qurui@eastar.com> to=<rui.qu@drweb.com.cn> proto=ESMTP helo=<mail.eastar.com>: From: "qurui" <qurui@iman.com>

 

 

调试2: drweb.com.cn --> eastar.com

在外网邮件系统给内网邮件系统回复(或发送)邮件时,收件人地址是qurui@iman.com,而不是qurui@eastar.com。怎么能让邮件网关收下该邮件并转发到mail.eastar.com上呢?在mail.eastar.com上又怎样能收下不属于自己域的邮件而不拒收呢?

我的思路是:首先要注册iman.com域,并将MX记录指向221.223.10.215;将mail.iman.com的A记录也指向221.223.10.215。然后在内网邮件系统上新建别名域,将别名域中的所以邮件帐户地址都作为别名指向eastar.com域中对应的帐户。我用的是postfixadmin做的别名域和邮件地址别名。这里就不写步骤了,因为是图形界面,很简单的。

 

 

客户端访问限制:

这里说的客户端是指SMTP客户端,是对远程MTA的访问限制。当然,这需要在邮件网关上进行设置。

# vim /etc/postfix/main.cf
--------------------------------------------------
smtpd_client_restrictions =
               check_client_access hash:/etc/postfix/check_client_access,
                reject

--------------------------------------------------

# vim /etc/postfix/check_client_access
--------------------------------------------------
mail.eastar.com               OK
smtp.drweb.com.cn         OK
icoremail.net                   OK

--------------------------------------------------
# postmap /etc/postfix/check_client_access
# /etc/init.d/postfix reload

为什么还允许icoremail.net访问呢?
因为是买的邮件服务,smtp.drweb.com.cn的别名是icoremail.net域里的主机,是哪台主机不固定。


在postfix接收邮件时,还有以下访问限制:

smtpd_helo_restrictions
smtpd_sender_restrictions
smtpd_recipient_restrictions
smtpd_data_restrictions
smtpd_end_of_data_restrictions
smtpd_etrn_restrictions

这些也都属于反垃圾邮件部分内容。这些限制还在翻译,可关注后续文章。

 

 

 

 

 


下面的例子是同在一个内网,不同邮件系统之间搭建的邮件网关


邮件网关服务器上的配置:

# vim /etc/postfix/main.cf
------------------------------------------------------------------
inet_interfaces = all
mynetworks = 192.168.1.0/24, 192.168.225.0/24, 127.0.0.0/8
relay_domains = eastar.com,drweb.com.cn
transport_maps = hash:/etc/postfix/transport
alias_maps = hash:/etc/aliases
smtpd_client_restrictions =
                   check_client_access hash:/etc/postfix/check_client_access,
                   reject

------------------------------------------------------------------

# vim /etc/postfix/transport
------------------------------------------------------------------
drweb.com.cn         relay:[192.168.225.2]
eastar.com             relay:[192.168.1.160]

------------------------------------------------------------------
# postmap /etc/postfix/transport
transport为传输表,它可以改变邮件传输路径。第一行表示寄往drweb.com.cn的邮件被转发到192.168.225.2,第二行表示寄往eastar.com的邮件被转发到192.168.1.160。方括号里必须是一个邮件服务器,可以是IP地址,也可以是完整主机名。详见《postfix权威指南》第九章 邮件转发中的传输表小节。

# vim /etc/postfix/check_client_access
------------------------------------------------------------------
eastar.com            OK
drweb.com.cn        OK

------------------------------------------------------------------
# postmap /etc/postfix/check_client_access
check_client_access为访问表,检查客户端的访问权限。在这里,发件人来自eastar.com和drweb.com.cn的邮件是允许被转发的,来自其他域的邮件都被reject参数拒绝了。

设置DNS

# vim /etc/resolv.conf
-------------------------------------------
nameserver 192.168.1.248
nameserver 192.168.225.2

-------------------------------------------
设置成内网和外网的DNS的IP地址。

 

如果出现一下错误
Client host rejected: Access denied

该错误的原因可能有两个:
1,可能是访问表配置错误,即check_client_access参数所指定的访问表(默认是/etc/postfix/access)配置有问题。

2,可能是邮件网关服务器上的DNS配置问题,即/etc/resolv.conf。因为postfix在检查访问表时会从DNS中通过IP地址反向解析出客户端的完整主机名称(PTR记录)。

# /etc/init.d/postfix start

 


两端邮件服务器上的配置:

这个就简单了,分别在两端的邮件服务器的配置文件main.cf中,添加一下参数:

relayhost = [<IP address|domain name>]

方括号中是与自己连接的网关服务器的IP地址或域名。

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多