我在 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.conf
是foo.tld
和bar.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;
};