公司有一个外网邮件服务器(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地址或域名。
|