Windows: DNS сервер BIND на Windows 7

Автор: | 13/03/2015

windows_logoВместо файла hosts в Windows – проще установить свой DNS сервер BIND, управлять которым (и, главное – добавлять новые домены/субдомены) намного проще.

Лично у меня изменения в hosts применяются только после рестарта системы, не смотря на ipconfig /flushdns и другие попытки его “оживить”.

Загружаем BIND https://www.isc.org/downloads.

Распаковываем, и запускаем BINDInstall.exe:

bind_1Редактируем переменные окружения:

bind_2

В PATH добавляем C:Program FilesISC BIND 9bin:

bind_3

Запускаем cmd от имени администратора (ConEmu в данном примере):

bind_4

Генерируем ключ для управления BIND:

C:Userssetevoy>rndc-confgen -a
wrote key file "C:Program FilesISC BIND 9etcrndc.key"

Переходим в каталог BIND-а:

C:Userssetevoy>cd c:Program FilesISC BIND 9

В каталоге etc создаём файл named.conf:

c:Program FilesISC BIND 9>notepad etcnamed.conf

Вписываем настройки:

options {
  directory "c:Program FilesISC BIND 9etc";
  listen-on { 192.168.1.146; 127.0.0.1; };
  allow-transfer { 192.168.1.1; };

  forwarders {
  192.168.1.1;
  8.8.8.8;
  };

};

logging {
  channel default-log {
    file "c:Program FilesISC BIND 9etcnamed.log";
    severity debug;
    print-severity yes;
    };
  category default {
    default-log;
    };
};

Кратко параметры:

  • listen-on – на каких адресах слушать, 192.168.1.146 – адрес Win-машины;
  • allow-transfer – кому разрешено выполнять рекурсивные запросы, в данном примере 192.168.1.1 – домашний роутер со своим DNS;
  • forwarders – адреса DNS-серверов, на которые пересылать запросы о неизвестных зонах (провайдер, например);

Сохраняем, закрываем.

Перезапускаем, что бы проверить что конфиг правильный:

C:Userssetevoy>rndc reload
server reload successful

Синтаксис файла можно проверить так:

c:Program FilesISC BIND 9>named-checkconf etcnamed.conf
etcnamed.conf:29: syntax error near '}'

В случае ошибки:

C:Userssetevoy>rndc reload
rndc: 'reload' failed: permission denied

Создаём пустой файл:

C:Userssetevoy>type NUL > "c:Program FilesISC BIND 9etcnamed.log"

Кликаем по нему правой кнопкой – Свойства > Безопасность, жмём Изменить:

bind_8

Потом – Добавить:

bind_9Дополнительно:

bind_10Поиск:

bind_11Находим named:

bind_12И устанавливаем полный доступ:

bind_13Переходим в настройки сети и добавляем 127.0.0.1 в список DNS-серверов:

bind_5Переходим в Управление:

bind_6Находим ISC BIND и запускаем:

bind_7Проверяем порт:

c:Program FilesISC BIND 9>netstat -a -b | find "127.0.0.1:53"
  TCP    127.0.0.1:53           setevoy-main:0         LISTENING
^C^C
c:Program FilesISC BIND 9>netstat -a -b | find "192.168.1.146:53"
  TCP    192.168.1.146:53       setevoy-main:0         LISTENING

Проверяем работу самого BIND:

c:Program FilesISC BIND 9>nslookup google.com 127.0.0.1
╤хЁтхЁ:  UnKnown
Address:  127.0.0.1

Не заслуживающий доверия ответ:
╚ь :     google.com
Addresses:  2a00:1450:400d:806::200e
          216.58.209.206

Добавим локальный домен.

В конец файла named.conf добавляем:

zone “domain.local” {
  type master;
  file “c:Program FilesISC BIND 9etcdomain.local.txt”;
};

Полное содержимое файла:

09:51:45 [setevoy@setevoy-main ~] $ cat /cygdrive/c/Program Files/ISC BIND 9/etc/named.conf
options {
  directory "c:Program FilesISC BIND 9etc";
  listen-on { 192.168.1.146; 127.0.0.1; };
  allow-transfer { 192.168.1.1; };

  forwarders {
  192.168.1.1;
  8.8.8.8;
  };
};

logging {
  channel default-log {
    file "c:Program FilesISC BIND 9etcnamed.log";
    severity debug;
    print-severity yes;
    };
  category default {
    default-log;
    };
};

zone "domain.local" IN {
        type master;
        file "c:Program FilesISC BIND 9etcdomain.local.txt";

Создаём файл:

c:Program FilesISC BIND 9>notepad etcdomain.local.txt

В него добавляем:

$TTL    604800
@       IN      SOA     domain.local. root.domain.local. (
                         2015030801     ; Serial
                         604800         ; Refresh
                         86400          ; Retry
                         2419200        ; Expire
                         604800 )       ; Negative Cache TTL
;

@       IN      NS      ns1.domain.local.
@       IN      NS      ns2.domain.local.
@       IN      A       192.168.1.146
ns1     IN      A       192.168.1.146
ns2     IN      A       192.168.1.146
*       IN      A       192.168.1.146

ВАЖНО: в конце описания зоны должна быть пустая строка.
ВАЖНО: при каждом изменении файла зоны – его Serial необходимо увеличить на 1: 2015030801 > 2015030802 и т.д.
ВАЖНО: при копировании отсюда – проверяйте кавычки – блог (или браузер?) иногда ставит “неправильные” (косые вместо прямых).

Проверяем файл зоны:

c:Program FilesISC BIND 9>named-checkzone -d domain.local etcdomain.local.txt
loading "domain.local" from "etcdomain.local.txt" class "IN"
zone domain.local/IN: loaded serial 10
OK

Перегружаем зоны BIND:

c:Program FilesISC BIND 9>rndc reload
server reload successful

Проверяем:

c:Program FilesISC BIND 9>nslookup domain.local 127.0.0.1
╤хЁтхЁ:  UnKnown
Address:  127.0.0.1

╚ь :     domain.local
Address:  192.168.1.146

Нормальным dig-ом:

$ dig @127.0.0.1 domain.local

; <<>> DiG 9.10.2 <<>> @127.0.0.1 domain.local
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 31881
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 3

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 4096
;; QUESTION SECTION:
;domain.local.                  IN      A

;; ANSWER SECTION:
domain.local.           604800  IN      A       192.168.1.146

;; AUTHORITY SECTION:
domain.local.           604800  IN      NS      ns2.domain.local.
domain.local.           604800  IN      NS      ns1.domain.local.

;; ADDITIONAL SECTION:
ns1.domain.local.       604800  IN      A       192.168.1.146
ns2.domain.local.       604800  IN      A       192.168.1.146

;; Query time: 1 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sun Mar 08 08:48:10 ope 2015
;; MSG SIZE  rcvd: 125

И пингуем:

c:Program FilesISC BIND 9>ping domain.local

Обмен пакетами с domain.local [192.168.1.146] с 32 байтами данных:
Ответ от 192.168.1.146: число байт=32 время<1мс TTL=128
Ответ от 192.168.1.146: число байт=32 время<1мс TTL=128

Вроде всё.

Настройка ничем не отличается от настройки на Linux/FreeBSD, кроме установки.

После настройки – уровень логгирования можно изменить на warning:

severity warning;

Ссылки по теме

http://www.brennan.id.au

http://rtfm.co.ua

http://rtfm.co.ua

http://rtfm.co.ua