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

我正在为EC2上的几台机器运行一个名称服务器。 此名称服务器无法通过公共Internet访问。 我希望所有的EC2实例都能使用它来find对方,并parsing所有公共域名(例如google.com )。 使用CNAME我应该能够创build我自己的名字,但是推迟到亚马逊的(内部)IP地址的内部EC2域名服务器 。 它工作了一段时间,但最终一些名称错误地parsing为其公有 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,它会返回正确parsing名称到私有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 

如果看起来我不知道我在做什么,因为我在这些configuration文件中犯了一个简单的错误,那是因为我不知道我在做什么。

我build立了自己的顶级域名:“.tld”(混淆 – 希望为顶级域名select的真实angular色不重要)。

我试图做什么埃里克·哈蒙德build议 。 这是我的/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是亚马逊DNS服务器的IP地址,只能从EC2内部访问。 这是唯一一个知道我的机器正确的内部/私有IP。 这几乎就好像我的服务器有时无法parsingfoo.tld ,然后到其他[公共]域名服务器,然后查询被borked(此后parsing为公共IP)。 我似乎没有完成的诀窍是,我的域名服务器绝不能超越172.16.0.23来解决这些x.compute-1.amazonaws.com名称。 另一种可能性是,有时候亚马逊的域名服务器搞砸了,并且给了我一个公共的IP,但是为什么我的域名服务器不能最终纠正这个错误并且有时候再次parsing私有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

 domain tld search tld nameserver 127.0.0.1 

这里是foo.tldbar.tld/etc/resolv.conf

 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 )

 options { forward only; ... 

从BIND ARM97:

转发此选项仅在转发器列表不为空时才有意义。 first缺省值会导致服务器首先查询转发器 – 如果没有回答问题,则服务器将自己查找答案。 如果only指定,服务器将只查询转发器。

在你的情况下,因为你实际上只需要.amazonaws.com的亚马逊DNS服务器,你也可以这样做:

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