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

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

我在 EC2 上为几台机器运行一个名称服务器。此名称服务器无法通过公共互联网访问。我希望我的所有 EC2 实例都使用它来相互查找并解析所有公共域名(例如google.com)。使用 CNAME,我应该能够创建自己的名称,但使用 Amazon 的内部 EC2 名称服务器来获取(内部)IP 地址。这种方法可以工作一段时间,但最终有些名字会错误地解析为民众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

一段时间后,实际发生的情况如下:

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

啊!如果我重新启动 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

如果因为我在其中一个配置文件中犯了一个简单的错误而看起来我不知道自己在做什么,那是因为我不知道自己在做什么。

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

我尝试过Eric Hammond 推荐的内容。这是我的/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; };
};

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;
};

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

include "/etc/bind/named.conf.options";
include "/etc/bind/named.conf.local";
include "/etc/bind/named.conf.default-zones";

以下是我区域的混淆绑定数据库/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.

呼。好的,这里还有一些文件,它们可能对整个画面是必要的。这是/etc/resolv.conf在名称服务器上ns

domain tld
search tld
nameserver 127.0.0.1

以下/etc/resolv.conffoo.tldbar.tld

domain tld
search tld compute-1.internal
nameserver 192.168.50.5
nameserver 172.16.0.23

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

此安装程序在 Ubuntu Server 11.10 上使用 BIND 9.7.3。

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

答案1

options {
    forward only;
    ...

来自 BIND ARM97:

向前first仅当转发器列表不为空时,此选项才有意义。值为默认,服务器会首先查询转发器 — 如果转发器没有回答问题,服务器将自行寻找答案。如果only指定,服务器将仅查询转发器。

在您的情况下,由于您实际上只需要 .amazonaws.com 的亚马逊 DNS 服务器,因此您也可以执行以下操作:

options {
    forwarders { };
...
}

zone "amazonaws.com" {
    type forward;
    forwarders { 172.16.0.23; };
    forward only;
};

相关内容