为什么我的 EC2 名称服务器(正确)将名称解析为私有 IP,然后切换到公共 IP?

Ada*_*sen 5 ubuntu bind amazon-ec2

我正在 EC2 上为几台机器运行名称服务器。此名称服务器无法通过公共 Internet 访问。我希望我的所有 EC2 实例都使用它,以便能够找到彼此并解析所有公共域名(例如google.com)。使用 CNAME,我应该能够创建自己的名称,但对于(内部)IP 地址遵循 Amazon 的内部 EC2 名称服务器。它工作了一段时间,但最终某些名称错误地解析为其公共IP 地址。

这是应该发生的事情:

foo$ host bar
bar.tld is an alias for ec2-88-88-88-88.compute-1.amazonaws.com.
ec2-88-88-88-88.compute-1.amazonaws.com has address 192.168.50.17
Run Code Online (Sandbox Code Playgroud)

以下是一段时间后实际发生的情况:

foo$ host bar
bar.tld is an alias for ec2-88-88-88-88.compute-1.amazonaws.com.
ec2-88-88-88-88.compute-1.amazonaws.com has address 88.88.88.88
Run Code Online (Sandbox Code Playgroud)

确认!如果我重新启动 BIND,它会在一段时间内正确地将名称解析为私有 IP,然后最终为公共 IP 提供服务。除非我重新启动 BIND,否则它似乎永远不会再次恢复为私有 IP 提供服务。

顺便说一句,这似乎总是有效:

foo$ host ec2-88-88-88-88.compute-1.amazonaws.com 172.16.0.23
ec2-23-21-222-199.compute-1.amazonaws.com has address 192.168.50.17
Run Code Online (Sandbox Code Playgroud)

如果因为我在这些配置文件之一中犯了一个简单的错误而似乎不知道自己在做什么,那是因为我不知道自己在做什么。

我建立了自己的顶级域:“.tld”(混淆了——希望为顶级域选择的真实字符无关紧要)。

我试着按照埃里克哈蒙德的建议去做。这是我的/etc/bind/named.conf.options

options {
  directory "/var/cache/bind";
  forwarders { 172.16.0.23; };
  auth-nxdomain no;
  listen-on-v6 { any; };
  allow-query { 127.0.0.1; 192.168.50.0/24; };
};
Run Code Online (Sandbox Code Playgroud)

172.16.0.23 是 Amazon 的 DNS 服务器的 IP,只能从 EC2 内部访问。它是唯一知道我的机器的正确内部/私有 IP 的人。就好像我的服务器foo.tld有时无法解析,然后转到其他一些 [公共] 名称服务器,然后查找被中断(此后解析为公共 IP)。我似乎没有完成的技巧是我的名称服务器绝不能超过 172.16.0.23 来解析这些x.compute-1.amazonaws.com名称。另一种可能性是,有时亚马逊的域名服务器会出错并给我一个公共 IP,但为什么我的域名服务器有时不会最终纠正错误并再次解析私有 IP?

无论如何,继续……这里是/etc/bind/named.conf.local

zone "tld" {
  type master;
  file "/etc/bind/db.tld";
  notify no;
};
Run Code Online (Sandbox Code Playgroud)

为了完整起见,这里是/etc/bind/named.conf

include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";
include "/etc/bind/named.conf.default-zones";
Run Code Online (Sandbox Code Playgroud)

这是我的区域的混淆绑定数据库/etc/bind/db.tld

$TTL    1h
@       IN      SOA     tld. ns.tld. (
          2012021425         ; Serial
                  1m         ; Refresh
                  2m         ; Retry
                  1w         ; Expire
                  1h )       ; Negative Cache TTL
;
@       IN      NS      ns.tld.
@       IN      A       192.168.50.5
ns              A       192.168.50.5

foo     CNAME   ec2-99-99-99-99.compute-1.amazonaws.com.
bar     CNAME   ec2-88-88-88-88.compute-1.amazonaws.com.
Run Code Online (Sandbox Code Playgroud)

哇。好的,这里还有几个文件可能是整个画面所必需的。这是/etc/resolv.conf在名称服务器上ns

domain tld
search tld
nameserver 127.0.0.1
Run Code Online (Sandbox Code Playgroud)

下面是/etc/resolv.conf关于foo.tldbar.tld

domain tld
search tld compute-1.internal
nameserver 192.168.50.5
nameserver 172.16.0.23
Run Code Online (Sandbox Code Playgroud)

我不知道这是否正确。也许我应该只有nameserver 192.168.50.5

此设置在 Ubuntu Server 11.10 上使用 BIND 9.7.3。

(仅供参考:交叉发布于http://alestic.com/2009/06/ec2-elastic-ip-internal

San*_*an4 3

options {\n    forward only;\n    ...\n
Run Code Online (Sandbox Code Playgroud)\n\n

来自 BIND ARM97:

\n\n

转发此选项仅在转发器列表不为空时才有意义。值(first默认)会导致服务器查询转发器 \xef\xac\x81rst \xe2\x80\x94,如果没有\xe2\x80\x99 回答问题,\n服务器将查找答案本身。如果only是speci\xef\xac\x81ed,服务器将只查询转发器。

\n\n

在您的情况下,由于您实际上只需要 .amazonaws.com 的 amazon DNS 服务器,您也可以这样做:

\n\n
options {\n    forwarders { };\n...\n}\n\nzone "amazonaws.com" {\n    type forward;\n    forwarders { 172.16.0.23; };\n    forward only;\n};\n
Run Code Online (Sandbox Code Playgroud)\n