1 最后由 tiangangnet (2010-08-12 15:53:04) 编辑

主题: 关于 iRedMail 0.6.0 Backup MX 无效的问题解决办法

具体问题见
http://www.iredmail.org/bbs/topic1606-backup-mx.html

我用postfixadmin 将所有备份域的Transfer 都设置为relay仍然解决不了问题。

由于是生产用机,不敢轻易乱试。所以只能一点一点摸索着调试。
http://www.postfix.org/STANDARD_CONFIGU … EADME.html
中介绍了,postfix 作为 Backup MX 的配置,如下:

Configuring Postfix as primary or backup MX host for a remote site
This section presents additional configuration. You need to combine this with basic configuration information as discussed the first half of this document.

When your system is SECONDARY MX host for a remote site this is all you need:

1 DNS:
2     the.backed-up.domain.tld        IN      MX 100 your.machine.tld.
3
4 /etc/postfix/main.cf:
5     relay_domains = . . . the.backed-up.domain.tld
6     smtpd_recipient_restrictions =
7         permit_mynetworks reject_unauth_destination
8
9     # You must specify your NAT/proxy external address.
10     #proxy_interfaces = 1.2.3.4
11
12     relay_recipient_maps = hash:/etc/postfix/relay_recipients
13
14 /etc/postfix/relay_recipients:
15     user1@the.backed-up.domain.tld   x
16     user2@the.backed-up.domain.tld   x
17      . . .
When your system is PRIMARY MX host for a remote site you need the above, plus:

18 /etc/postfix/main.cf:
19     transport_maps = hash:/etc/postfix/transport
20
21 /etc/postfix/transport:
22     the.backed-up.domain.tld       relay:[their.mail.host.tld]
Important notes:

•Do not list the.backed-up.domain.tld in mydestination.

•Do not list the.backed-up.domain.tld in virtual_alias_domains.

•Do not list the.backed-up.domain.tld in virtual_mailbox_domains.

•Lines 1-7: Forward mail from the Internet for "the.backed-up.domain.tld" to the primary MX host for that domain.

•Line 10: This is a must if Postfix receives mail via a NAT relay or proxy that presents a different IP address to the world than the local machine.

•Lines 12-16: Define the list of valid addresses in the "the.backed-up.domain.tld" domain. This prevents your mail queue from filling up with undeliverable MAILER-DAEMON messages. If you can't maintain a list of valid recipients then you must specify "relay_recipient_maps =" (that is, an empty value), or you must specify an "@the.backed-up.domain.tld x" wild-card in the relay_recipients table.

•Line 22: The [] forces Postfix to do no MX lookup.

Specify dbm instead of hash if your system uses dbm files instead of db files. To find out what lookup tables Postfix supports, use the command "postconf -m".

Execute the command "postmap /etc/postfix/transport" whenever you change the transport table.

NOTE for Postfix < 2.2: Do not use the fallback_relay feature when relaying mail for a backup or primary MX domain. Mail would loop between the Postfix MX host and the fallback_relay host when the final destination is unavailable.

•In main.cf specify "relay_transport = relay",
•In master.cf specify "-o fallback_relay =" at the end of the relay entry.
•In transport maps, specify "relay:nexthop..." as the right-hand side for backup or primary MX domain entries.
These are default settings in Postfix version 2.2 and later.

根据上面提示,重要的设置参数,除了DNS MX的设置外,在postfix中main.cf只需要调整
relay_domains
relay_recipient_maps

当iRedMail 安装好后,实际上已经配置好了。
但是为什么会导致无效呢?根据上面的提示,如果作为备份域,域名和用户是决不能出现在
mydestination
virtual_alias_domains
virtual_mailbox_domains

因为我希望作为备份域的服务器既能够作为 主 mx 也能作为其他的备份域。
我利用postmap -q 来检查 这三个配置项中是否能够读取出我的备份域名。
最后发现了,mysql的配置文件存在bug。
mysql_virtual_alias_maps.cf 文件中的query 在查询时,并没有检查domain中的域是否是备份域。所以修改如下:

query       = SELECT goto FROM alias,domain WHERE alias.address = '%s' AND alias.active = '1' AND domain.backupmx = '0'

在mysql_domain_alias_maps.cf情景相同,修改如下:
query       = SELECT goto FROM alias,alias_domain,domain WHERE alias_domain.alias_domain = '%d' and alias.address = CONCAT('%u', '@', alias_domain.target_dom
ain) AND alias.active = 1 AND alias_domain.active='1' AND domain.backupmx='0'

在mysql_virtual_mailbox_domains.cf中修改如下:
query       = SELECT domain FROM domain WHERE domain='%s' AND backupmx='0' AND active='1'

当我修改好后,再次测试,结果还是不行。于是继续寻找原因。
relay_domains 是来检查是否存在备份域。
relay_recipient_maps 则是检查用户是否存在。
而这两个文件都没有问题。
想来想去,问题只能处在transport上面了。根据Backup MX 的日志,当收到邮件后,relay=dovecot,这显然不对,那么问题可能出现在
transport_maps 参数上了。
iRedMail的默认配置如下:
transport_maps = proxy:mysql:/usr/local/etc/postfix/mysql_transport_maps_user.cf, proxy:mysql:/usr/local/etc/postfix/mysql_transport_maps_domain.cf
这两个文件中的查询语句都是提取数据库中用户表和域表中的transport,而我用phpmyadmin打开数据库,发现用户表中所有的用户都是 dovecot。
可我是把域设定为relay的,也就是说这可能是postfixadmin 的bug。于是我将备份域的用户全部更新为relay。
再次测试,成功!!


总结:
当安装完iRedMail后,如果想服务器又能够作为主域也能够作为备份域的时候,需要进行如下工作:
1. 在 postfixadmin 中将备份域transport 设定为 relay
2. 在备份域中添加的用户,需要用phpmyadmin打开数据表 mailbox 将字段transport 更新为 relay [或者修改postfixadmin源代码,修正BUG]
3. main.cf中,mydestination 不包含备份域。
4. 修改 mysql_virtual_alias_maps.cf 最后一行:
    query       = SELECT goto FROM alias,domain WHERE alias.address = '%s' AND alias.active = '1' AND domain.backupmx = '0'
5. 修改 mysql_domain_alias_maps.cf 最后一行:
    query       = SELECT goto FROM alias,alias_domain,domain WHERE alias_domain.alias_domain = '%d' and alias.address = CONCAT('%u', '@', alias_domain.target_dom
ain) AND alias.active = 1 AND alias_domain.active='1' AND domain.backupmx='0'

6. 修改 mysql_virtual_mailbox_domains.cf 最后一行:
    query       = SELECT domain FROM domain WHERE domain='%s' AND backupmx='0' AND active='1'
   
7. relay_recipient_maps = mysql:/usr/local/etc/postfix/mysql_virtual_mailbox_maps.cf
    此步骤有待考察,因为按照参数说明,应该是查询的用户账号,也就是邮箱名,但是此文件读取的是路径。可我没有修改,仍然实现了转发。

说明:
以上步骤是建立在iRedMail 安装基础上,如果是独立配置的postfix,还需要参考官方文档。

感谢ZhangHuangbin提供的帮助!

回复: 关于 iRedMail 0.6.0 Backup MX 无效的问题解决办法

不錯.這個要MARK下...謝謝LZ分享!

回复: 关于 iRedMail 0.6.0 Backup MX 无效的问题解决办法

谢谢分享

回复: 关于 iRedMail 0.6.0 Backup MX 无效的问题解决办法

已经将 backup mx 的改进加入到 iRedMail 最新版本代码中。感谢反馈和测试。:)