BIND/Named: отключена рекурсия, клиент должен использовать альтернативные серверы

BIND/Named: отключена рекурсия, клиент должен использовать альтернативные серверы

Я настраиваю простой DNS-сервер (BIND/Named), который работает локально на ноутбуке с OSX.

Его цель — преобразовать все запросы «*.laptop.example.com» в «192.168.2.2», который является назначенным вручную IP-адресом (не DHCP) виртуального сетевого интерфейса.

Я использую виртуальный сетевой интерфейс (предоставленный Parallels), чтобы гарантировать, что IP-адрес всегда остается одним и тем же (eth0 будет менять свой IP-адрес при подключении к разным сетям), а также чтобы гарантировать его постоянную доступность (eth0 отключен/недоступен, если сетевой кабель не подключен).

Я использовал следующую настройку:

options {

  ...

  forwarders {
    192.168.1.1;
  };
  forward only;

};

Однако для этого необходимо обновлять конфигурацию каждый раз, когда ноутбук меняет сеть (поскольку большинство сетей используют другой DNS-адрес).

Я хотел бы отказаться от этого требования, чтобы, если BIND/Named не распознает доменное имя (т. е. оно не является поддоменом «laptop.example.com»), он возвращал ошибку, чтобы ноутбук мог попробовать второй DNS-адрес, который у него есть в записи (тот, который он получил от DHCP).

Одна из возможностей — использовать:

options {

  ...

  forwarders {
  };
  forward only;

  recursion no;

};

Что избавляет его от необходимости тратить более 3 секунд на запрос к корневым серверам... однако клиент интерпретирует этот ответ как «домен не существует», а не как ошибку, которую можно исправить, попробовав обратиться к следующему серверу.

решение1

Спасибо Alnitak, duffbeer703, John Gardeniers, все очень хорошие отзывы.

Решение, которое я использовал для решения своей проблемы, — это использование launchd для обнаружения изменений в /etc/resolv.conf, а затем обновление списка серверов пересылки.

Создав файл:

/Library/LaunchDaemons/myname.update.plist

С содержанием:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN"
   "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
    <key>Disabled</key>
    <false/>
    <key>Label</key>
    <string>myname.update</string>
    <key>ProgramArguments</key>
    <array>
        <string>[PATH]/update.sh</string>
    </array>
    <key>WatchPaths</key>
    <array>
        <string>/var/run/resolv.conf</string>
    </array>
</dict>
</plist>

И загружаем это с помощью:

launchctl load /Library/LaunchDaemons/myname.update.plist
launchctl start myname.update

Сценарий по адресу:

[PATH]/update.sh

Можно запустить что-то вроде:

DST="/var/named/forwarders.conf";

echo "forwarders {" > $DST

cat /etc/resolv.conf | \
    grep -v -E "(127.0.0.1|localhost)" | \
    awk '{ sub("^nameserver ", "\t"); sub("$", ";"); print }' >> $DST

echo "};" >> $DST

И затем в именованной конфигурации его можно использовать с:

options {
    directory "[PATH]/conf/";
    listen-on { 127.0.0.1; [IP_ADDRESS_HOST]; };
    include "/var/named/forwarders.conf";
    forward only;
};

Если вы хотите увидеть или использовать полную реализацию, перейдите по ссылкемоя страница настройки BINDи используйте форму загрузки... она создает ZIP-пакет с одним установочным скриптом, поэтому, надеюсь, его будет довольно просто установить и использовать.

решение2

Почему бы просто не добавить запись в файл hosts и не избавить себя от всех этих хлопот?

решение3

Вы, возможно, захотите более подробно рассказать о том, что вы пытаетесь сделать, — это не имеет особого смысла. Мой совет — не ковыряться в основах DNS, — вы ломаете то, что просто работает.

Первичный и вторичный DNS-серверы находятся в конфигурации вашей сети для обеспечения доступности. Если DNS-сервер не может предоставить ответ, клиент не обращается к вторичному серверу — люди, которые изобрели DNS, реализовали концепцию «рекурсии» для решения этой проблемы.

Если вы используете компьютеры Mac, то использование Bonjour/mDNS может оказаться более продуктивным.

решение4

Попробуйте использоватьunboundвместо.

Хотя это в первую очередь рекурсивный сервер, я считаю, что он способен обеспечить как необходимое вам подстановочное переопределение, так и пересылку всего остального на сервертекущийвышестоящие DNS-серверы, автоматически полученные из /etc/resolv.conf.

Связанный контент