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

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 секунд на запрос серверов ROOT ... однако клиент интерпретирует этот ответ как «домен не существует», а не как ошибку, которую можно исправить, попробовав следующий сервер.

Спасибо 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-пакет с одним сценарием установки, поэтому, надеюсь, его довольно просто настроить и использовать.

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

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

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

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

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

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