Postfix排错记

今天打算安装Postfix到一台机器进行邮件的发送,SMTP通过sasl认证。配置完成后尝试发送邮Thunderbird始终返回

The mail server responded:  5.7.1 : Relay access denied. Please check the message recipient
Relay access denied。

main.cf restrictions部份配置为

smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination

先在 master.cf 中smtpd启用verbose模式

smtp      inet  n       -       n       -       2       smtpd -v

在日志中/var/log/mail.log中找到了出错原因

postfix/smtpd[12125]: >>> START Recipient address RESTRICTIONS <<<
postfix/smtpd[12125]: generic_checks: name=permit_mynetworks
postfix/smtpd[12125]: permit_mynetworks: unknown 114.85.60.225
postfix/smtpd[12125]: match_hostname: unknown ~? 127.0.0.0/8
postfix/smtpd[12125]: match_hostaddr: 114.85.60.225 ~? 127.0.0.0/8
postfix/smtpd[12125]: match_list_match: unknown: no match
postfix/smtpd[12125]: match_list_match: 114.85.60.225: no match
postfix/smtpd[12125]: generic_checks: name=permit_mynetworks status=0
postfix/smtpd[12125]: generic_checks: name=reject_unauth_destination
postfix/smtpd[12125]: reject_unauth_destination: me@jiangmiao.org
postfix/smtpd[12125]: permit_auth_destination: me@jiangmiao.org
postfix/smtpd[12125]: ctable_locate: leave existing entry key me@jiangmiao.org
postfix/smtpd[12125]: NOQUEUE: reject: RCPT from unknown[114.85.60.225]: 554 5.7.1 ......
postfix/smtpd[12125]: generic_checks: name=reject_unauth_destination status=2
postfix/smtpd[12125]: >>> END Recipient address RESTRICTIONS <<<

起初方向性错误,围绕着 permit_sasl_authenticated 不起作用进行排查。
当修改smtpd_recipient_restrictions添加了一些reject后,顿悟似乎是 smtpd_recipient_restrictions 没有起作用,但仍百思不得其解。

卡了几个小时候突然灵光一闪,执行了命令:

postconf|grep restrictions

查看配置

smtpd_client_restrictions =
smtpd_data_restrictions =
smtpd_end_of_data_restrictions =
smtpd_etrn_restrictions =
smtpd_helo_restrictions =
smtpd_recipient_restrictions = permit_mynetworks, permit_sasl_authenticated, reject
smtpd_relay_restrictions = permit_mynetworks, reject_unauth_destination
smtpd_sender_restrictions =

终于发现了一个新的限制规则 smtpd_relay_restrictions,且默认为reject_unauth_destination,系统还未进到recipient_restrictions就已经被拒绝了。更坑爹的是在log中relay_restrictions也叫START Recipient address RESTRICTIONS
后查了下,smtpd_relay_restrictions原来是Postfix 2.10.0新添加的变量。

修改smtpd_relay_restrictions为

smtpd_relay_restrictions = permit_mynetworks, permit_sasl_authenticated, reject_unauth_destination

问题终于解决了。

一行代码花了2个多小时。如果灵光不闪或许还要更长。吃一堑,长一智,感觉长了点经验,又好像感觉没有,如果日志不把 Relay 写成 Recipient,这个错误应该是很容易发现的,想象一下

postfix/smtpd[12125]: >>> START Relay RESTRICTIONS <<<
postfix/smtpd[12125]: generic_checks: name=permit_mynetworks
postfix/smtpd[12125]: permit_mynetworks: unknown 114.85.60.225

Relay RESTRICTIONS?,这是什么限制,来自哪里,什么值,于是很快就找到了问题源。所以日志的正确性是至关重要。同时不能迷信日志,即使强如Postfix的软件也有失误的时候。
话说如果是专业的Linux运维的话这个问题应该还没遇到就在Maillist或Changelog中读到了吧。

共1条评论
  1. 逍遥 @ 2013-09-30 18:32:47 回复

    你好,基于你的https://github.com/jiangmiao/ruby-file-monitor
    写了个日志转换的东东
    https://github.com/xiaoyaoyouzizai/logfile-transfer/blob/master/sync.rb

    m.filter_files do
    disallow /.*/
    allow /\.log\.|\.sync_cmd_stop$/
    end
    中想把直接写的正则换成变量,但总是报错,请教该如何写?

发表评论

电子邮件地址不会被公开。 必填项已用*标注