我对 opendmarc 有疑问。该软件使用 perl 函数发送报告邮件。因此,在源代码中,我看到 /etc/opendmarc_reports 还使用函数 hostnamefqdn() 将其传递给 helo 命令 smtp。然后我在 postfix 日志中看到此消息:Helo 命令被拒绝:需要完全限定的主机名。
我的配置:/etc/hosts
127.0.1.1 mail.本地邮件
/etc/主机名
邮件
$ hostname -f
mail.local
$ perl -e 'use Net::Domain qw(hostfqdn); print hostfqdn()."\n";'
mail
为什么 perl 函数 hostnamefqdn() 在这种情况下仅返回短名称域而不是 fqdn ? 当然,当我将主机名更改为 mail.local 时,一切正常。
答案1
大多数尝试确定主机的 FQDN 的代码都是通过查看 gethostbyname() 或 getaddrinfo() 函数返回的“规范名称”字段来实现的。
当 /etc/hosts 处理查找时,第一的每行中的名称是该条目的“规范”名称,其余的是“别名”。您的条目应如下所示:
127.0.1.1 mail.local mail
答案2
Net::Domain 在几个地方查找域:
- 网络::配置
- /etc/resolv.conf -
search
和domain
选项 - NIS(通过
domainname
命令) - LOCALDOMAIN 和 DOMAIN 环境变量
- /etc/hosts、DNS(通过
gethostbyname
)
根据代码中的注释,该模块旨在尽可能避免 DNS 请求。