我在 Centos 6.5 服务器上使用 Bind 将子域解析为 IP。
我有 *.ddns.example.com 和 ddns.example.com 通过 A 记录指向我的服务器。我为此添加了一个区域,请参阅 named.conf:
options {
listen-on port 53 { any; };
listen-on-v6 port 53 { any; };
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
allow-query { any; };
recursion yes;
dnssec-enable yes;
dnssec-validation yes;
dnssec-lookaside auto;
/* Path to ISC DLV key */
bindkeys-file "/etc/named.iscdlv.key";
managed-keys-directory "/var/named/dynamic";
};
logging {
channel default_debug {
file "data/named.run";
severity dynamic;
};
};
zone "." IN {
type hint;
file "named.ca";
};
include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";
zone "ddns.example.com" {
type master;
file "/var/named/ddns.example.com.hosts";
};
这是我的 ddns.example.com.hosts 文件:
$ttl 38400
ddns.example.com. IN SOA ns1.digitalocean.com. [email protected]. (
1414575123
10800
3600
604800
38400 )
ddns.example.com. IN NS ns1.digitalocean.com.
bob.ddns.example.com. IN A 8.8.8.8
我已重新启动命名服务,在 ping 域 bob.ddns.example.com 时,我收到了来自 8.8.8.8 的回复,因此从本地服务器 ping 时记录工作正常。但是,在服务器外部(即另一个网络)ping 时,子域 bob.ddns.example.com 仍解析为配置了 bind 的服务器的 IP。
我已经完全停止了 iptables 以排除这种情况,但结果是一样的,Bind 服务器的 IP 是从子域解析的,而不是预期的 8.8.8.8。我已按照其他一些帖子的建议设置了以下选项:
listen-on port 53 { any; };
listen-on-v6 port 53 { any; };
allow-query { any; };
我是否需要设置其他选项来允许从外部进行解析?或者我是否完全忽略了一些东西?
挖
该域实际上是一个.es
域,因此我将在此处如此引用它。
以下是一个例子dig +trace bob.ddns.example.es
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.30.rc1.el6 <<>> +trace bob.ddns.example.es
;; global options: +cmd
. 518304 IN NS e.root-servers.net.
. 518304 IN NS b.root-servers.net.
. 518304 IN NS f.root-servers.net.
. 518304 IN NS i.root-servers.net.
. 518304 IN NS d.root-servers.net.
. 518304 IN NS g.root-servers.net.
. 518304 IN NS h.root-servers.net.
. 518304 IN NS m.root-servers.net.
. 518304 IN NS l.root-servers.net.
. 518304 IN NS k.root-servers.net.
. 518304 IN NS c.root-servers.net.
. 518304 IN NS j.root-servers.net.
. 518304 IN NS a.root-servers.net.
;; Received 228 bytes from 127.0.0.1#53(127.0.0.1) in 608 ms
es. 172800 IN NS ns1.cesca.es.
es. 172800 IN NS ns-ext.nic.cl.
es. 172800 IN NS ns15.communitydns.net.
es. 172800 IN NS ns3.nic.fr.
es. 172800 IN NS sns-pb.isc.org.
es. 172800 IN NS a.nic.es.
es. 172800 IN NS f.nic.es.
;; Received 461 bytes from 192.36.148.17#53(192.36.148.17) in 1540 ms
example.es. 86400 IN NS ns1.tsohost.co.uk.
example.es. 86400 IN NS ns2.tsohost.co.uk.
;; Received 84 bytes from 192.134.0.49#53(192.134.0.49) in 120 ms
bob.ddns.example.es. 1 IN A 178.62.171.XXX
;; Received 51 bytes from 95.142.155.4#53(95.142.155.4) in 20 ms
以下是命令 dig @127.0.0.1 bob.ddns.example.es 的输出
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.30.rc1.el6 <<>> @127.0.0.1 bob.ddns.example.es
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 11646
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 1, ADDITIONAL: 0
;; QUESTION SECTION:
;bob.ddns.example.es. IN A
;; ANSWER SECTION:
bob.ddns.example.es. 1 IN A 8.8.8.8
;; AUTHORITY SECTION:
ddns.example.es. 1 IN NS ns1.digitalocean.com.
;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Thu Oct 30 04:55:19 2014
;; MSG SIZE rcvd: 83
以下是该命令的输出dig @8.8.8.8 bob.ddns.example.es
; <<>> DiG 9.8.2rc1-RedHat-9.8.2-0.30.rc1.el6 <<>> @8.8.8.8 bob.ddns.example.es
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 35748
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; QUESTION SECTION:
;bob.ddns.example.es. IN A
;; ANSWER SECTION:
bob.ddns.blu.es. 0 IN A 178.62.171.XXX
;; Query time: 55 msec
;; SERVER: 8.8.8.8#53(8.8.8.8)
;; WHEN: Thu Oct 30 04:56:48 2014
;; MSG SIZE rcvd: 49
还请注意,该域名是在 Godaddy 注册的。在 Godaddy 上,我们将 ns1.tsohost.co.uk 设置为名称服务器。在这里,我们在 tsohost 托管包上提供网站(即 example.es 和 www.example.es)。在 tso 上,我们为 ddns.example.es 和 *.ddns.example.es 创建了一条 A 记录,以转到数字海洋服务器,即 178.62.171.XXX,我们希望在此服务器上操纵这些域的 IP 地址。
答案1
根据显示的dig +trace
输出,最可能的原因是到达面向互联网的 IP 的数据包没有被您认为的服务器进程接收。这可以通过以下CHAOS
查询明确证明,该查询表明面向互联网的 IP 由 PowerDNS 守护程序管理。
$ dig @95.142.155.4 chaos txt version.bind
; <<>> DiG 9.8.4-rpz2+rl005.12-P1 <<>> @95.142.155.4 chaos txt version.bind
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 24158
;; flags: qr aa rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
;; WARNING: recursion requested but not available
;; QUESTION SECTION:
;version.bind. CH TXT
;; ANSWER SECTION:
version.bind. 5 CH TXT "PowerDNS Authoritative Server 3.3.1 ([email protected] built 20131217140448 [email protected])"
;; Query time: 97 msec
;; SERVER: 95.142.155.4#53(95.142.155.4)
;; WHEN: Sat Nov 1 08:57:18 2014
;; MSG SIZE rcvd: 158
除非您在其中一个包含文件中定义自定义version.bind
字符串(这种可能性极小),否则互联网上的查询根本不会到达您的 BIND 服务器。
更进一步说,以下评论让我怀疑您可能没有正确配置以实现预期目的:
还请注意,该域名是在 Godaddy 注册的。在 Godaddy 上,我们将 ns1.tsohost.co.uk 设置为名称服务器。在这里,我们在 tsohost 托管包上提供网站(即 example.es 和 www.example.es)。在 tso 上,我们为 ddns.example.es 和 *.ddns.example.es 创建了一条 A 记录,以转到数字海洋服务器,即 178.62.171.XXX,我们希望在此服务器上操纵这些域的 IP 地址。
粗体强调是我的。如果您的目标是让面向互联网的 DDNS 正常工作,您需要使用记录NS
而不是A
记录指向您的 Digital Ocean 服务器。NS
记录会告诉服务器,控制权ddns.example.es
已委托给您的 BIND 名称服务器。会dig +trace
遵循该引用并停在您的 BIND 名称服务器上,但显然并非如此。
附注:NS
记录必须指向名称,而不是 IP 地址,因此A
除了这些记录之外,您还需要为这些名称服务器创建记录NS
。
答案2
上述示例,至少在撰写本文时,显示出了相互矛盾的结果。我假设您正在更改主机名和 IP 地址以保护您的身份?这很好,但使得诊断问题变得非常困难。
因此,我的建议如下。首先确保您的 DNS 记录设置正确。
验证您的域名是否已在根服务器和 .es 域根服务器上正确注册。这显示在上面的第一次 dig +trace 结果中。据此,您的 dns 服务器
example.es. 86400 IN NS ns1.tsohost.co.uk.
example.es. 86400 IN NS ns2.tsohost.co.uk.
如果这些不正确,那么您的域名注册很可能有错误的名称服务器,因此您必须修复此问题。如果这些是正确的,那么当您查询它们时它们是否返回正确的答案?在您上面的 dig +trace 中,它们返回的是
bob.ddns.example.es. 1 IN A 178.62.171.XXX
这是正确的吗? 我也会特别检查它们两个:
dig bob.ddns.blu.es @ns1.tsohost.co.uk +norecurse
dig bob.ddns.blu.es @ns2.tsohost.co.uk +norecurse
这将告诉您问题出在哪里。对于另外两个示例:
dig @127.0.0.1 bob.ddns.example.es
dig @8.8.8.8 bob.ddns.example.es
我不知道您从哪个主机运行它们(即在名称服务器还是其他主机上运行?),所以我帮不上什么忙。但是,当您运行 dig 时,请使用 +trace 选项,这样您就可以准确地知道哪里出了问题。
还请注意,该域名是在 Godaddy 注册的。在 Godaddy 上,我们将 ns1.tsohost.co.uk 设置为名称服务器。在这里,我们在 tsohost 托管包上提供网站(即 example.es 和 www.example.es)。在 tso 上,我们为 ddns.example.es 和 *.ddns.example.es 创建了一条 A 记录,以转到数字海洋服务器,即 178.62.171.XXX,我们希望在此服务器上操纵这些域的 IP 地址。
正如 AndrewB 注意到而我却没有注意到的,这看起来像是你的问题。如果你在 tsohost 名称服务器上有一个指向你的数字海洋服务器的 A 记录,那么你就是告诉它其 A 记录查询的最终答案是数字海洋名称服务器。DNS 将不会进一步查询数字海洋服务器 - 它已经得到了答案。相反,从 tsohost 中删除该 A 记录并告诉它将子域的请求委托给你的其他名称服务器。通过添加另一个委托给你的子域的原点和 NS 记录来执行此操作:
; sub-domain definitions
; zone fragment for ddns.example.com
$ORIGIN ddns.example.com.
; we define two name servers for the sub-domain
@ IN NS <name of your dns server>.
请注意,您的 DNS 服务器也必须专门在 GO DADDY 或您的注册商处注册为 DNS 服务器。 如何进行子域名委派