Настройка Split DNS на одном сервере Bind

Thank you for reading this post, don't forget to subscribe!

Split DNS (или split-horizon, или split-brain) — это кон­фи­гу­ра­ция, поз­во­ля­ю­щая отда­вать раз­ные запи­си зон DNS в зави­си­мо­сти от под­се­ти источ­ни­ка запро­са. Ее мож­но реа­ли­зо­вать с при­ме­не­ни­ем несколь­ких раз­ных сер­ве­ров DNS, одна­ко, Bind поз­во­ля­ет сде­лать нуж­ную нам настрой­ку на одном един­ствен­ном сер­ве­ре с помо­щью view.

Настройка Bind

Пер­вым делом настро­им view. Откры­ва­ем кон­фи­гу­ра­ци­он­ный файл. В зави­си­мо­сти от типа опе­ра­ци­он­ной систе­мы, его место­по­ло­же­ние будет разным.

а) в CentOS / Red Hat:

vi /etc/named.conf

б) в Ubuntu / Debian:

vi /etc/bind/named.conf.default-zones

* в вашей инфра­струк­ту­ре для опи­са­ния зон могут исполь­зо­вать­ся дру­гие фай­лы. Сто­ит это учи­ты­вать при настрой­ке view.

При­мер кон­фи­гу­ра­ции для зон в 3-х пред­став­ле­ни­ях — 2 внут­рен­ние сети и все остальные:

 

 

  • 2, 3 — созда­ем 2 acl, в кото­рых опи­сы­ва­ем под­се­ти наших внут­рен­них сетей. После мы их будем исполь­зо­вать для опре­де­ле­ния досту­па к view.
  • 5 - 12 — наш пер­вый view для пер­вой внут­рен­ней сети. В опции match-clients мы долж­ны пере­чис­лить acl, для кли­ен­тов кото­рой нуж­но отда­вать запи­си зон, вхо­дя­щих в дан­ный view.
  • 14 - 22— view для вто­рой внут­рен­ней сети. Обра­ти­те вни­ма­ние, что здесь мы ука­за­ли дру­гие acl, файл с настрой­ка­ми зоны. Так­же для дан­ной зоны мы раз­ре­ши­ли транс­фер на адрес 192.168.1.15.
  • 24 - 31 — послед­няя view для всех осталь­ных кли­ен­тов (как пра­ви­ло, из сети Интернет).

Особенности настройки

Мы созда­ли кон­фи­гу­ра­цию для наше­го сер­ве­ра DNS. Давай­те попро­бу­ем разо­брать­ся, какие три нюан­са нуж­но учитывать.

1. Any дол­жен быть внизу.

Наши бло­ки view чита­ют­ся систе­мой свер­ху вниз. Если сер­вер DNS при поис­ке нуж­ной зоны наты­ка­ет­ся на под­хо­дя­щий вари­ант, он исполь­зу­ет его. Таким обра­зом, если view с match-clients { "any"; }; поме­стить в самый верх, будет исполь­зо­вать­ся толь­ко этот блок, а дру­гие так и не задействуются.

2. Настрой­ка зон внут­ри view.

Внут­ри view мы можем опи­сы­вать зоны по-раз­но­му. Это могут быть раз­лич­ные настрой­ки или раз­ное коли­че­ство зон, напри­мер, для одно­го из пред­став­ле­ний мы можем создать толь­ко одну зону, когда в осталь­ных их может быть боль­ше. Дру­ги­ми сло­ва­ми, view не обя­за­ны зер­ка­ли­ро­вать друг друга.

3. Вне view не долж­но быть зон.

Как толь­ко мы нача­ли при­ме­нять view, вне этих бло­ков не долж­но быть ни одной зоны. Мы не можем сде­лать общие настрой­ки для одних зон, а дру­гие поме­стить внутрь пред­став­ле­ний. В про­тив­ном слу­чае, bind при попыт­ке пере­за­пус­ка выдаст ошибку.

Создание зон

В нашей кон­фи­гу­ра­ции мы опи­са­ли зону test.ru в трех view. Соот­вет­ствен­но, нам нуж­но создать 3 фай­ла. В зави­си­мо­сти от типа опе­ра­ци­он­ной систе­мы, их место­по­ло­же­ние будет различаться.

а) CentOS / Red Hat:

mkdir /var/named/master

б) Ubuntu / Debian:

mkdir /var/cache/bind/master

* если мы еще не созда­ва­ли зоны, то созда­ем дан­ные каталоги.

Теперь мож­но созда­вать сами фай­лы для зон.

а) CentOS / Red Hat:

vi /var/named/master/test.ru.in01

б) Ubuntu / Debian:

vi /var/cache/bind/master/test.ru.in01

При­мер фай­ла с мини­маль­но необ­хо­ди­мым набо­ром записей:

 

 

* это файл для зоны test.ru во view «internal-01». Он будет воз­вра­щать IP для запи­си 192.168.0.20. Пред­по­ла­га­ет­ся, что адрес DNS-сер­ве­ра в дан­ном сете­вом сег­мен­те 192.168.0.2.

Созда­ем опи­са­ние для зоны в сле­ду­ю­щем view.

а) CentOS / Red Hat:

vi /var/named/master/test.ru.in02

б) Ubuntu / Debian:

vi /var/cache/bind/master/test.ru.in02

Содер­жи­мое:

 

 

* файл для зоны во view «internal-02». Он будет воз­вра­щать IP для запи­си 192.168.1.20. Пред­по­ла­га­ет­ся, что адрес DNS-сер­ве­ра в дан­ном сете­вом сег­мен­те 192.168.1.2.

Нако­нец, созда­ем послед­ний файл.

а) CentOS / Red Hat:

vi /var/named/master/test.ru.any

б) Ubuntu / Debian:

vi /var/cache/bind/master/test.ru.any

Его содер­жи­мое:

 

 

* файл для зоны во view «external». Он будет воз­вра­щать IP для запи­си 92.53.123.166. Пред­по­ла­га­ет­ся, что адрес DNS-сер­ве­ра в дан­ном сете­вом сег­мен­те 92.53.123.165.

Проверка

Настрой­ки завер­ше­ны. Что­бы убе­дить­ся в их кор­рект­но­сти, пер­вым делом, про­ве­ря­ем кон­фи­гу­ра­ци­он­ный файл командой:

named-checkconf

* коман­да долж­на вер­нуть пустую строку.

После про­ве­ря­ем кор­рект­ность настрой­ки зон:

named-checkconf -z

Коман­да долж­на вер­нуть что-то на подобие:

zone test.ru/IN: loaded serial 2020120401
zone test.ru/IN: loaded serial 2020120401
zone test.ru/IN: loaded serial 2020120401

* в дан­ном при­ме­ре для зоны test.ru про­ве­ре­ны все фай­лы. Они корректны.

Теперь мож­но пере­за­пу­стить сер­вер DNS.

а) CentOS / Red Hat:

systemctl restart named

б) Ubuntu / Debian:

systemctl restart bind9

Пере­хо­дим на кли­ент­ский ком­пью­тер в пер­вом сете­вом сег­мен­те (192.168.0.0/24). Для про­вер­ки рабо­ты наше­го сер­ве­ра вво­дим коман­ду (на Linux или Windows клиенте):

nslookup test.ru 192.168.0.2

Мы долж­ны уви­деть IP из нашей зоны во view internal-01:

Server:         192.168.0.2
Address:        192.168.0.2#53

Name:   test.ru
Address: 192.168.0.20

Пере­хо­дим на дру­гой ком­пью­тер в сете­вом сег­мен­те 192.168.1.0/24. Вводим:

nslookup test.ru 192.168.1.2

В моем слу­чае был полу­чен уже дру­гой ответ:

Server:         192.168.1.2
Address:        192.168.1.2#53

Name:   test.ru
Address: 192.168.1.20

Выпол­ня­ем коман­ду с ком­пью­те­ра вне диа­па­зо­нов 192.168.0.0/24 или 192.168.1.0/24:

nslookup test.ru 92.53.123.165

При­мер ответа:

Server:         92.53.123.165
Address:        92.53.123.165#53

Name:   test.ru
Address: 92.53.123.166

Мы настро­и­ли Split DNS на Linux сер­ве­ре с Bind.

Альтернативы

Немно­го слов о дру­гих реа­ли­за­ци­ях, кото­рые поз­во­лят раз­вер­нуть Split DNS на еди­ном устройстве/сервере.

  • DNS сер­вер на Microsoft Windows Server 2016. Поз­во­ля­ет исполь­зо­вать ZoneScope для раз­де­ле­ния отве­тов для одной и той же зоны в зави­си­мо­сти от источ­ни­ка запроса.
  • Mac OS X Server. Но это тот же Bind.
  • На роу­те­рах Mikrotik (с вер­сии про­шив­ки 6.47).