Я использую сервер имен для нескольких машин на EC2. Этот сервер имен недоступен через общедоступный Интернет. Я хочу, чтобы все мои экземпляры EC2 использовали его, чтобы иметь возможность находить друг друга и разрешать все общедоступные доменные имена (например, google.com
). Используя CNAME, я Предполагается, что у меня есть возможность создавать свои собственные имена, но подчиняться внутреннему серверу имен EC2 Amazon для (внутренних) 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-адрес. Кажется, он никогда не вернется к обслуживанию частного IP, если я не перезапущу BIND.
Кстати, это всегда работает:
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» (запутанный - надеюсь, реальные символы, выбранные для домена верхнего уровня, не имеют значения).
Я пытался сделать что рекомендует Эрик Хаммонд. Вот мой /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 - это IP-адрес DNS-сервера Amazon, доступный только изнутри EC2. Это единственный, кто знает правильные внутренние / частные IP-адреса для моих машин. Как будто мой сервер не может разрешить foo.tld
иногда затем переходит на какой-то другой [общедоступный] сервер имен, и поиск затем прекращается (после этого разрешается общедоступный IP-адрес). Уловка, которую я, кажется, не выполняю, заключается в том, что мой сервер имен должен никогда выйти за рамки 172.16.0.23, чтобы устранить эти x.compute-1.amazonaws.com
имена. Другая возможность заключается в том, что иногда сервер имен Amazon облажается и дает мне общедоступный 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
?
Эта настройка использует BIND 9.7.3 на Ubuntu Server 11.10.
(К вашему сведению: размещено на http://alestic.com/2009/06/ec2-elastic-ip-internal)
options {
forward only;
...
Из BIND ARM97:
вперед Эта опция имеет смысл только в том случае, если список пересылки не пуст. Ценность first
, по умолчанию, заставляет сервер сначала опрашивать серверы пересылки - и если это не дает ответа на вопрос, сервер сам будет искать ответ. Если only
указано, сервер будет запрашивать только серверы пересылки.
В вашем случае, поскольку вам действительно нужны DNS-серверы Amazon только для .amazonaws.com, вы также можете:
options {
forwarders { };
...
}
zone "amazonaws.com" {
type forward;
forwarders { 172.16.0.23; };
forward only;
};