Postfix配置仅允许Google域名中继邮件时遭遇Relay Access Denied错误的解决求助
我完全理解你的处境——虽然站内搜了不少类似问题,但就是找不到能解决自己问题的方案,这种卡壳的感觉真的很闹心。Let's来一步步拆解你的问题:
你用的是Postfix 3.6.4,想只允许来自Google域名的服务器中继邮件,但现在遇到了「Relay access denied」的错误,日志里能看到Google的IP连接后被拒绝:
Jun 7 12:23:01 ubuntu-2gb-hel1-1 postfix/smtpd[20535]: connect from mail-wm1-f72.google.com[209.85.128.72]
Jun 7 12:23:01 ubuntu-2gb-hel1-1 postfix/smtpd[20535]: NOQUEUE: reject: RCPT from mail-wm1-f72.google.com[209.85.128.72]: 454 4.7.1 email@example.com: Relay access denied; from=email@example.com to=email@example.com proto=ESMTP helo=<mail-wm1-f72.google.com>
手动把Google的IP段加到mynetworks里确实能解决,但Google的邮件服务器IP范围太大,手动维护根本不现实,想用正则匹配Google子域名却没效果——这正是你现在的核心痛点。
问题根源
Postfix默认是通过IP地址来控制中继权限的,mynetworks就是用来定义可信IP段的。但你想通过域名来做限制,就得用到Postfix的客户端访问控制规则,结合正则表达式来匹配客户端的反向解析域名。
具体解决步骤
创建正则规则文件
在Postfix配置目录下新建一个规则文件,比如/etc/postfix/google_relay.cf,内容如下:/.*\.google\.com$/ OK这里的正则是精确匹配所有以
.google.com结尾的客户端域名,注意要转义.(因为.在正则里是通配符),$表示匹配字符串结尾,避免匹配到类似fake.google.com.evil.com这种恶意域名。修改Postfix主配置
打开/etc/postfix/main.cf,调整smtpd_recipient_restrictions规则,把刚才的正则检查加进去,确保它在reject_unauth_destination之前(因为Postfix是按顺序执行规则的):smtpd_recipient_restrictions = permit_mynetworks check_client_access regexp:/etc/postfix/google_relay.cf reject_unauth_destination # 这里可以保留你原来的其他规则,比如reject_invalid_hostname等同时,确保
mynetworks里只保留你的本地可信IP(比如服务器自身IP、内网IP),不要再手动加Google的IP段了。重启Postfix服务
保存配置后,重启Postfix让新规则生效:systemctl restart postfix
关键注意事项
- 反向DNS解析:这个规则生效的前提是Postfix能正确解析客户端IP的反向域名(PTR记录)。Google的邮件服务器IP的反向解析肯定是
google.com子域名,所以这一点不用担心,但如果你的服务器禁用了反向DNS查询,需要确保reverse_lookup_enable = yes(默认是开启的,可在main.cf里确认)。 - 正则规则的准确性:之前你用的
/.*\.google.com/没有转义最后一个.,也没有匹配结尾,可能会导致匹配不准确,换成/.*\.google\.com$/更严谨。
这样配置后,所有反向解析域名是Google子域名的客户端都会被允许中继邮件,不用再手动维护IP列表啦。
备注:内容来源于stack exchange,提问作者Tarik

