我有一个电子邮件服务器,配置了多个 sendmail 实例,每个实例在不同的 IPv4 和 IPv6 地址上运行。一切运行顺利,直到某个时候,对于某些域/电子邮件(显然是随机的),sendmail 尝试从 IPv6 地址而不是 IPv4 地址发送电子邮件,我开始收到如下消息:
SYSERR(root): makeconnection: cannot bind socket [IPv6:2001:db8::2]: Address family not supported by protocol
to=<[email protected]>, delay=04:23:07, xdelay=00:00:00, mailer=esmtp, pri=11918385, relay=bad-domain.example. [198.51.100.5], dsn=4.0.0, stat=Deferred: Address family not supported by protocol
IPv6 和 IPv4 地址被混淆了。
我观察到,但我不确定这是不是问题所在,坏域的 MX 记录是 CNAME,而不是直接 A 或 AAAA 记录。
我在 Fedora 16 上使用 Sendmail 8.14.5,所有 IP 都是静态配置的(IPv4 + IPv6)。如果无法解决基本问题,是否有办法指示 sendmail 对指定域列表仅使用 IPv4?
sendmail.mc 的摘录:
CLIENT_OPTIONS(`Family=inet,Addr=192.0.2.2')dnl
CLIENT_OPTIONS(`Family=inet6,Addr=2001:db8::2')dnl
DAEMON_OPTIONS(`Name=MTA-v4,Family=inet,Addr=192.0.2.2')dnl
DAEMON_OPTIONS(`Name=MTA-v6,Family=inet6,Addr=2001:db8::2')dnl
一些不良域名示例:donpac.ru、montevideo.com.uy、dalia-ingenierie.fr、opela.cz、orange.net、poisl.com.br、tamil.com、zerong.cn
LE:似乎所有记录都具有 CNAME 作为 MX 记录,但没有一个 CNAME 解析到 IPv6
答案1
虽然上述评论似乎表明这不是一个 v4-by-domain 问题,但今天我有理由需要按照你描述的方式去做,并在搜索时发现了这个问题。
我发现强制逐个域名进行 v4 交付的方法是启用 mailertable,方法是
FEATURE(`mailertable')
在我的 sendmail.mc 中(如果它已经存在,则无需再次添加)。然后我通过覆盖 DNS 强制基于 v4 的传递并指示传递到 mailertable 文件中的 v4 地址;这是来自/etc/mail/mailertable
:
.example.com esmtp:[260.240.18.38]
example.com esmtp:[260.240.18.38]
我通常不会编辑域名,但我不想让那些错误地实施 smtp-over-ipv6 的同事感到尴尬,因此需要我强制通过 v4 进行交付。IP 地址显然也是错误的;但在生产中,它是从 DNS 中获取的主 MX 的 v4 地址。