Поднимаем локальный DNS сервер под Mac OS X

Есть в 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

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>