У меня есть домен, для которого я контролирую DNS, и он размещен в Интернете. У меня также есть внутренняя сеть с NAT (192.168.0.0/24) с доступом в Интернет, которую я также контролирую. В этой внутренней сети у меня также есть преобразователь DNS. Программное обеспечение DNS на обоих - PowerDNS.
Я хочу, чтобы DNS-преобразователь во внутренней сети мог добавлять / изменять записи запросов и результатов, которые поступают с авторитетного сервера. Например, на полномочном сервере может быть одна запись для animal.example.com:
animal.example.com. IN AAAA 2001:140:283::1
Однако мне бы хотелось, чтобы внутренние клиенты, выполняющие поиск в DNS для animal.example.com, могли получить в ответ следующее:
animal.example.com. IN AAAA 2001:140:283::1
animal.example.com. IN A 192.168.0.2
Очевидно, я мог бы настроить внутренний DNS-сервер так, чтобы он притворялся авторитетным, например, example.com, но это потребует изрядных усилий, чтобы синхронизировать основной DNS-сервер и внутренний DNS-сервер для записей, которые одинаковы между обе. Если бы внутренний DNS-сервер каким-то образом можно было сделать подчиненным основного DNS-сервера, но при этом иметь возможность добавлять свои собственные результаты, это было бы идеально.
Это возможно?
Я думаю, вам нужна настройка DNS с разделенным горизонтом, однако PowerDNS не поддерживает ее напрямую (в отличие от Bind или DJBDNS). Официальный ответ автора здесь: http://mailman.powerdns.com/pipermail/pdns-users/2006-September/003779.html
Я никогда не считал, что DNS с разделением горизонта особенно сбивает с толку, особенно если файлы четко разложены в файловой системе, например ./master-interal/domain.com ./master-external/domain.com
Единственный вариант, который они предлагают, - это запустить два разных экземпляра PowerDNS на сервере, прослушивающем разные порты. Я предполагаю, что тогда вы могли бы использовать iptables для перенаправления трафика на порт 53 в зависимости от того, какой экземпляр подходит.
На самом деле, если я было для этого я бы использовал Lua Script с рекурсором, который искажает данные в postresolve.
Однако я действительно рекомендую что-то другое: просто используйте отдельную авторитетную зону, такую как internal.example.com, где вы используете AXFR example.com от авторитетных серверов, и просто добавьте свои локальные данные RFC1918.
Таким образом, вы все еще можете отлаживать авторитетную зону, как будто она находится в Интернете, из вашей локальной сети, и использовать внутренние данные.
О сценариях Lua для PowerDNS Recursor: http://doc.powerdns.com/recursor-scripting.html
Я настоятельно рекомендую вам не идти по этому пути, поскольку он чрезвычайно запутанный, сложный и трудный для управления. Вместо этого вы должны создать отдельный внутренний домен, например inside.example.com
. Затем, если ваш внешний DNS-сервер также находится во внутренней сети, вы должны настроить его как авторитетный для обоих доменов. Однако, если ваш внешний DNS-сервер находится вне вашей внутренней сети, вам следует настроить внутренний DNS-сервер как авторитетный для inside.example.com. Затем ваш внутренний DNS-сервер должен пересылать все остальные запросы на внешний DNS-сервер.
Я понимаю, что обратная сторона этого заключается в том, что вам нужно изменить домен на всех ваших внутренних машинах, но выполнение этой предварительной работы сейчас избавит вас от многих проблем в будущем.
После того, как я некоторое время возился с моей Fedora 20, я, кажется, заставил ее работать. Я нигде не нашел полного практического руководства, поэтому краткое описание минимальной настройки:
Мы хотим решить webserver.dyndns.org
для доступа к веб-сервису на нем как из Интернета, так и из локальной сети.
Машина а в Интернете решает webserver.dyndns.org
на IP-адрес IPisp. Behing IPisp это маршрутизатор с NAT, который перенаправляет порт 80 на IP-адрес LAN IPx, таким образом делая веб-сервис доступным в Интернете.
Естественно, это делается путем регистрации IP-адреса. IPisp на полномочном сервере имен для домена dyndns.org, который в случае службы, такой как DynDns, выполняется с помощью ddclient работает на маршрутизаторе или где-то в локальной сети и поэтому не представляет здесь интереса.
Машина б в локальной сети решает webserver.dyndns.org
на IP-адрес IPx, чтобы веб-сервис стал доступен непосредственно в локальной сети. Кроме того, предполагая, что все машины в локальной сети названы в соответствии с bar.localdomain, имя webserver.localdomain
должен также решить IPx. Мы также хотим иметь обратный поиск для хорошей оценки, разрешая IPx к webserver.dyndns.org
внутри локальной сети (в Интернете, IPx ничего не решает и IPisp преобразуется в произвольную строку, сгенерированную интернет-провайдером.)
Мы предполагаем pdns-recursor работает на отдельной машине с IP IPdns, но мы также можем запустить его на веб-сервере (на том же IP-адресе, что и IPx или по псевдониму), или иметь только одну машину в локальной сети.
Машина «b» может быть настроена статически или динамически через DHCP; видеть dhclient
и dnsmasq
и возможно avahi
. NetworkManager
также входит сюда, потому что он может перезаписать /etc/resolv.conf
; пока предположим статическую конфигурацию.
Также предположим:
IPx = 192.168.1.1
IPdns = 192.168.1.2
IPbar = 192.168.1.3
Затем:
/etc/resolv.conf
на любой машине:
nameserver 192.168.1.2
domain localdomain
Конфигурация для pdns-recursor:
/etc/pdns-recursor/recursor.conf
в основном сводится к:
setuid=pdns-recursor
setgid=pdns-recursor
allow-from=127.0.0.0/8, 192.168.1.0/8, ::1/128, fe80::/10
auth-zones=webserver.dyndns.org=/etc/pdns-recursor/[webserver.dyndns.org].zone, localdomain=/etc/pdns-recursor/[localdomain].zone, 168.192.in-addr.arpa=/etc/pdns-recursor/[168.192.in-addr.arpa].zone
local-address=192.168.1.2
Приведенные выше ссылки очень сильно урезаны файлы зоны (их настоящие имена не важны):
В /etc/pdns-recursor/[168.192.in-addr.arpa].zone
(обратите внимание на отсутствие точки в конце имени записи - это относительное имя, а не абсолютное: 1.1
средства 1.1.168.192.in-addr.arpa
). Это работает с «IN» или без него.
1.1 IN PTR webserver.dyndns.org.
2.1 IN PTR dns.localdomain.
3.1 IN PTR b.localdomain.
В /etc/pdns-recursor/[webserver.dyndns.org].zone
(обратите внимание на точку в конце имени записи - это абсолютное имя, а не относительное)
webserver.dyndns.org. IN A 192.168.1.1
В /etc/pdns-recursor/[localdomain].zone
webserver IN A 192.168.1.1
dns IN A 192.168.1.2
b IN A 192.168.1.3
После перезапуска pdns-recursor
, можно проверить с помощью dig
выполнив эти команды:
PDNS=192.168.1.2
# Test unknwon domain resolution and webserver resolution
dig @$PDNS www.cnn.com | grep -A1 ";; ANSWER SECTION:"
dig @$PDNS webserver.dyndns.org | grep -A1 ";; ANSWER SECTION:"
# Test responses for localdomain
dig @$PDNS unknown.localdomain | grep -A1 ";; ANSWER SECTION:"
dig @$PDNS webserver.localdomain | grep -A1 ";; ANSWER SECTION:"
dig @$PDNS b.localdomain | grep -A1 ";; ANSWER SECTION:"
dig @$PDNS dns.localdomain A | grep -A1 ";; ANSWER SECTION:"
# Test responses for localdomain if the domain is omitted
dig +search @$PDNS webserver | grep -A1 ";; ANSWER SECTION:"
# Test reverse resolution
dig @$PDNS -x 192.168.1.1 | grep -A1 ";; ANSWER SECTION:"
dig @$PDNS -x 192.168.1.2 | grep -A1 ";; ANSWER SECTION:"
dig @$PDNS -x 192.168.1.3 | grep -A1 ";; ANSWER SECTION:"
dig @$PDNS -x 192.168.1.4 | grep -A1 ";; ANSWER SECTION:"
Использовать Труба в PowerDNS. Я создал несколько систем на Python.
PipeBackend:
PipeBackend в первую очередь предназначен для быстрой разработки новых серверных программ без тесной интеграции с PowerDNS. Это позволяет конечным пользователям писать серверные части PDNS на любом языке.