![sendmail 是否缓存 DNS 或通过与 host/dig/nslookup 不同的方法获取它?](https://linux22.com/image/545228/sendmail%20%E6%98%AF%E5%90%A6%E7%BC%93%E5%AD%98%20DNS%20%E6%88%96%E9%80%9A%E8%BF%87%E4%B8%8E%20host%2Fdig%2Fnslookup%20%E4%B8%8D%E5%90%8C%E7%9A%84%E6%96%B9%E6%B3%95%E8%8E%B7%E5%8F%96%E5%AE%83%EF%BC%9F.png)
我们有一台 Linux 服务器正在运行sendmail
,它通过我们的主邮件服务器中继电子邮件,但自从上周更改 DNS 服务器以来,它一直无法连接到我们的邮件服务器。经过进一步调查,/var/log/maillog
显示如下行,包括不正确邮件服务器的 IP 地址:
Apr 4 15:37:32 yip sendmail[20583]: p34JVgLE020540: to=<[email protected]>, ctladdr=<[email protected]> (0/0), delay=00:05:50, xdelay=00:02:00, mailer=esmtp, pri=258071, relay=mailserver.domain.tld. [xxx.xxx.xxx.xxx], dsn=4.0.0, stat=Deferred: Connection timed out with mailserver.domain.tld.
现在,我们上周已通过编辑 更新了 Linux 服务器的 DNS 服务器以及迁移/etc/resolv.conf
。在 Linux 服务器上运行dig mailserver.domain.tld
、host mailserver.domain.tld
或nslookup mailserver.domain.tld
都会导致返回正确的 IP 地址。哪里可能sendmail
获取/缓存错误的 IP 地址,我该如何解决该问题?
答案1
- 重新开始
sendmail
。 - 重新启动
nscd
(如果系统正在使用)。
还要确保你有正确的MX 记录条目. Sendmail 依赖于 MX 查找。
尝试看看是否能得到正确的主机。如果没有,您可以使用通常位于 /etc/mail/ 中的文件dig mx domain.tld
强制 sendmail 发送发往特定域的邮件。mailertable
典型的 mailertable 条目如下所示:
xxx.com esmtp:[192.168.1.2]
其中“xxx.com”是域名,并明确说明了用于交付的IP。
答案2
发送邮件做在重新查询 DNS 之前缓存有关主机状态的信息。调整 Timeout.hoststatus 可以改变这种情况,但对于您的特定情况,重新启动 sendmail 是可行的方法(而不是等待超时到期)。
答案3
Sendmail 本身不进行任何缓存,它依赖于本地名称服务器。
有几件事值得检查,尽管你可能已经完成了:
- 检查 /etc/hosts 中没有中继服务器的条目,该服务器将优先于 DNS
- 检查 Sendmail 解析器选项,看看它是否实际设置为使用 DNS
- 确保 /etc/resolv.conf 仅指向更新的 DNS 服务器,并且其中 1 个不会返回旧值。通过运行 nslookup 并为每个 DNS 服务器输入“server 1.2.3.4”手动执行此操作,请记住,如果设置为具有重复条目,它可能会在重复查询中返回 2 个不同的 IP。我已经多次看到这种情况了。
我知道这些都是很基础的,但是对于一个非常匆忙的管理员来说,很容易犯像这样的简单错误。