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