我正在尝试在我的 djbdns 环境中设置 IPv6 MX 记录。我也在尝试使用 djbdns-fefe 来实现同样的目的。
根据 djbnds-fefe 文档,“... tinydns-edit 暂时不会接受 IPv6 地址作为 NS 或 MX 记录”。此外,我不知道如何在传统的 djbdns 环境中设置 IPv6 记录。
我一直在寻找该问题的解决方案,但却一无所获。
我不想完全放弃 dbjdns 或 djbdns-fefe,所以有谁知道如何在 djbdns 或 djbdns-fefe 环境中设置 IPv6 MX 记录?
...或者这根本就不可能?
先感谢您。
更新:
需要明确的是,djbdns 创建的 MX 记录的规范需要...
MX 记录的顶级 DNS 名称,(例如., “example.com”);
分配给将生成的 MX 域名的 IP 地址,(例如, "10.11.12.13");
它将生成的 MX 域名的前缀(例如, “X”);
优先权 (例如,0)。
在此示例中,它将创建以下“MX”记录:
example.com. IN MX 86400 0 x.mx.example.com.
而且它还自动创建第二条记录:“A”记录:
x.mx.example.com. IN A 86400 10.11.12.13
问题在于,djbdns 中用于创建 MX 记录的语法永远不会接受上述第 2 项的 IPv6 地址,并且它永远不会根据其 MX 记录规范自动创建任何 AAAA 记录。
尽管 djbdns-fefe 软件允许直接创建 AAAA 记录,但 djbdns-fefe 和原始 djbdns 均未提供任何方法来创建引用该 AAAA 记录中指定的基于 IPv6 的域名的 MX 记录。
我正在尝试找到解决此限制的方法,以便我仍然可以使用 djbdns 创建基于 IPv6 的 MX 记录(如果可能)。
这些是原始 djbdns 语法的规格...
https://cr.yp.to/djbdns/tinydns-data.html
这是 djbdns-fefe IPv6 增强功能的文档...
答案1
我必须撤消此答案,因为运行几天后,我发现它没有按我希望的方式工作。自动生成的 afxr bind9 输出有一些限制,我的许多子域都无法访问。
目前,我已经切换回 tinydns,并且暂时不使用 IPv6。
我将把原始答案留在这里,以防有人读到它时能够发现缺陷,并可能提出一些真正有效的建议。
我道歉。
最初的答案最终被证明不起作用
这对我的问题来说不是一个很肯定的答案,但这是我能想到的最好的答案。
似乎我在 djbdns 和 djbdns-fefe 提供指定 IPv6 MX 记录的语法方面完全没有运气,经过大量搜索后,我仍然没有找到任何可以让我按照我在这里询问的方式执行此操作的黑客或解决方法。
但是,我找到了一种间接的方法来做到这一点,而不必完全放弃基于 djbdns tinydns 的配置信息。
首先,我必须解释一下,几年前,我编写了一个自定义实用程序,用于根据更用户友好的语法生成 tinydns 命令(我所说的友好用户是“我”...哈哈)。目前,我想继续使用这个实用程序。
我对 IPv6 MX 问题的“解决方案”是继续使用旧的自定义实用程序,现在还要编写一个新实用程序,该实用程序将允许我根据当前的 djbdns 配置生成 bind9 配置文件,然后切换到使用 bind9 而不是 djbdns。在 bind9 中,我确实可以设置 IPv6 MX 记录。
有一天,我会重写我原来的自定义实用程序,以便它可以直接生成 bind9 特定的记录,而无需我经过 djbdns-configuration-to-bind9-configuration 转换的中间步骤。但我现在没有时间这样做,所以这里是我编写的新实用程序,用于将 djbdns 配置信息转换为 bind9 配置文件...
这个新实用程序是一个复杂的 Python 脚本,太长了,无法在此全部列出,因此我仅总结其工作原理。无论如何,其中很多内容都是针对我的特定主机的,因此我怀疑编写的脚本能否在除我自己的主机之外的任何地方运行。但总的来说,它的功能如下...
(1)安装并设置一个可工作的 bind9 服务。
(2) 即使我现在使用的是 bind9,djbdjs 服务器仍需要运行才能使我的脚本正常工作。我将其设置为“虚拟”DNS 服务器,它只监听私有的、本地专用的地址。
(3) 在 python 脚本中,我创建了一个名为“email_hosts”的列表,其中包含需要 IPv6 MX 记录的顶级域名的名称。
(4)当启动这个新脚本时,它首先通过 python“multiprocessing”包启动一个运行该命令的守护进程……
/command/envuidgid root /usr/bin/tcpserver -vDHRl0 [DNSSERVERADDR] 53 /command/axfrdns
...其中 [DNSSERVERADDR] 是虚拟 djbdns 服务器正在监听的私有、仅本地地址。
(5)脚本等待守护进程启动并运行,然后通过 python“多处理”包启动另一个守护进程,该守护进程循环遍历我托管的所有域名,并针对每个域(下面我将其称为 [DOMAINNAME]),运行此命令...
/usr/bin/dig axfr [DOMAINNAME] @[DNSSERVERADDR]
(6) 捕获每个“dig”调用的输出,然后循环遍历该输出中的所有行。如果我遇到任何我已存储在上述“email_hosts”列表中的域的 AAAA 记录,我会执行以下操作...
(7) 取出该特定 AAAA 记录的域名(我将其称为 [DOMAINNAME]),并在该域名前添加前缀“mx.” 。我将结果称为 [MXNAME] 。例如,如果 [DOMAINNAME] 为“myhost.example.com”,则 [MXNAME] 将包含名称“mx.myhost.example.com”。
(8)然后,我在输出列表中添加以下附加行,假设“myhost.example.com”在其 AAAA 记录中的 IPv6 地址是 [IPV6ADDRESS]:
mx.myhost.example.com 86400 IN AAAA [IPV6ADDRESS]
myhost.example.com 86400 IN MX mx.myhost.example.com 10
(9)我将给定域的所有这些输出行连接起来,包括我可能创建的两行新行,然后将结果写入 /var/lib/bind 目录中名为“db.[DOMAINNAME]”的文件中(我之前已将其原始内容备份为 /var/lib/bind.backup)。
(10)此外,对于此基于 dig-axfr-output 的客户端中处理的每个 [DOMAINNAME],我还将以下文本附加到新的 /etc/bind/named.conf.local 文件中(在将当前版本备份为 /etc/bind/named.conf.local.backup 之后)...
zone "[DOMAINNAME]" {
type master;
file "/var/lib/bind/db.[DOMAINNAME]";
};
还请注意,这个新创建的 /etc/bind/named.local.conf 文件的顶部如下所示:
include "/etc/bind/zones.rfc1918";
(11)以这种方式处理完所有域后,我终止了通过 python 的“多处理”机制启动的两个守护进程。
(12)然后我重新启动“named”守护进程。
这样,我可以继续使用几年前编写的相同实用程序来简化 tinydns 命令的生成,但同时,我实际上正在使用 bind9 作为我的 DNS 服务器。
正如我上面提到的,我最终会重写该实用程序以直接生成 bind9 特定的记录。然后,整个基于 axfr 的过程将消失。
尽管这么多年来我一直对 djbdns 很满意,但我不得不承认,我认为现在使用 bind9 更好。