Я настраиваю простой 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
.