Назад | Перейти на главную страницу

Почему мой сервер имен EC2 (правильно) разрешает имена частным IP-адресам, а затем переключается на общедоступные IP-адреса?

Я использую сервер имен для нескольких машин на 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;
};