Есть в Mac OS небольшая проблемка. Если у нас имеется несколько VPN соединений и у каждого свой DNS, иногда при разрыве соединения DNS либо вообще теряется, либо подставляется неправильный. Как-либо решить это через настройки ОС не получается. Поэтому было придумано решение: свой собственный DNS. Во-первых, мы получаем полную независимость от DNS провайдера. Все адреса будут резолвиться на локальной машине и кешироваться. Что еще и добавит скорости. Во-вторых, мы можем как угодно рулить внешними DNS серверами.
DNS сервер уже включен в состав ОС. Это и неудивительно, поскольку ядро юниксовое. Называется он bind и нам лишь надо его настроить и активировать. Инструкцию по настройке bind я позаимствовал вот здесь:
http://hints.macworld.com/article.php?story=20050420025219402
Во-первых, нам нужно создать секретный ключ, по которому bind будет опознавать хосты, которые к нему подключаются. По идее, нам он не нужен, так как мы подключаемся с локальной машины и не выставляем его наружу. Однако, без этого bind работать не будет.
Для простоты открываем shell с правами рута:
# sudo bash
Создаем ключ:
# rndc-confgen > /etc/rndc.conf
# head -n 6 /etc/rndc.conf > /etc/rndc.key
Далее нам нужно отредактировать файл конфигурации bind. Находится он в /etc/named.conf. Редактировать можно любым редактором, но при этом он должен быть запущен из под root. Например:
# sudo nano /etc/named.conf
Дальше нам нужно прописать DNS сервера для тех доменов, которые мы не знаем и которые находятся за VPN. Предположим, у нас есть домен office.local, который должен резолвиться через DNS сервер по адресу 192.168.0.50:
zone "office.local" {
type forward;
forward only;
forwarders { 192.168.0.50; };
};
Если мы хотим все-таки использовать DNS сервер провайдера (хотя непонятно, зачем это может быть нужно), то добавляем вот такую запись:
forwarders {
x.x.x.x;
x.x.x.x;
};
Вместо x.x.x.x вписываем адреса DNS серверов провайдера.
Но это полдела. Теперь нам надо, чтобы bind запускался при старте системы, а также чтобы система им пользовалась. Второе делается очень просто через настройки сети — удаляем оттуда DNS провайдера и вместо него вписываем 127.0.0.1.
# cd /System/Library/StartupItems
# mkdir BIND
# cd BIND
# touch BIND; pico -w BIND
Перед нами текстовый редактор. Вводим туда следующий текст:
#!/bin/sh
. /etc/rc.common
if [ "${DNSSERVER}" = "-YES-" ]; then
ConsoleMessage "Starting BIND DNS Server"
/usr/sbin/named
fi
Сохраняем файл, выходим из редактора.
# touch StartupParameters.plist; pico -w StartupParameters.plist
Опять попадаем в текстовый редактор, вводим текст:
{
Description = "Local Caching DNS Server";
Provides = ("DNS Server");
OrderPreference = "None";
Messages =
{
start = "Starting BIND DNS Server";
stop = "Stopping BIND DNS Server";
};
}
Сохраняем файл.
Даем скрипту права на исполнение:
# chmod +x BIND
Запускаем bind при старте системы:
# pico -w /etc/hostconfig
Добавляем в этот файл запись:
DNSSERVER=-YES-
Запускаем bind:
# sudo /System/Library/StartupItems/BIND/BIND
Вуаля — все работает.
Leave a Reply