Дэлегаванне зваротнай зоны падсеткі меней /24 у BIND. Як гэта працуе

Устала аднойчы перада мной задача, аддаць аднаму з кліентаў права на рэдагаванне PTR-запісаў аддадзенай яму падсеткі /28. Аўтаматызацыі для рэдагавання налад BIND звонку ў мяне няма. Таму я вырашыў пайсці іншым шляхам - дэлегаваць кліенту кавалак PTR-зоны падсеткі /24.

Здавалася б - што можа быць прасцей? Проста патрэбнай выявай прапісваем падсетку і накіроўваем на патрэбны NS як гэта робіцца з паддаменам. Але не. Не так усё проста (хоць на справе ўвогуле прымітыўна, але інтуіцыя не дапаможа), таму я і пішу гэты артыкул.

Хто захоча сам разабрацца, той можа пачытаць RFC
Хто хоча гатовага рашэння, сардэчна запрашаем пад кат.

Каб не затрымліваць тых, хто любіць метад капіпасты, спачатку я размяшчу практычную частку, а пасля яе тэарэтычную.

1. Практыка. Дэлегуем зону /28

Дапушчальны ў нас ёсць падсетка 7.8.9.0/24. Нам трэба дэлегаваць падсетку 7.8.9.240/28 на днс-кліента 7.8.7.8 (ns1.client.domain).

На правайдэрскім днс трэба знайсці файл, які апісвае зваротную зону гэтай падсеткі. Няхай будзе 9.8.7.у-addr.arpa.
Запісы ад 240 да 255 каментуем, калі ёсць. І ў канец файла пішам наступнае:

255-240  IN  NS      7.8.7.8
$GENERATE 240-255 $ CNAME $.255-240

не забываем павялічыць serial зоны і робім

rndc reload

На гэтым правайдэрская частка скончана. Пераходзім да кліенцкага дня.

Для пачатку створым файл /etc/bind/master/255-240.9.8.7.in-addr.arpa наступнага зместу:

$ORIGIN 255-240.9.8.7.in-addr.arpa.
$TTL 1W
@                       1D IN SOA       ns1.client.domain. root.client.domain. (
                        2008152607      ; serial
                        3H              ; refresh
                        15M             ; retry
                        1W              ; expiry
                        1D )            ; minimum
@                       IN NS        ns1.client.domain.
@                       IN NS        ns2.client.domain.
241                     IN PTR          test.client.domain.
242                     IN PTR          test2.client.domain.
245                     IN PTR          test5.client.domain.

І ў наз.канф дапісваем апісанне нашага новага файла:

zone "255-240.9.8.7.in-addr.arpa." IN {
        type master;
        file "master/255-240.9.8.7.in-addr.arpa";
};

B перазапускаем працэс bind.

/etc/init.d/named restart

Усё. Цяпер можна правяраць.

#>  host 7.8.9.245 
245.9.8.7.in-addr.arpa is an alias for 245.255-240.9.8.7.in-addr.arpa.
245.255-240.9.8.7.in-addr.arpa domain name pointer test5.client.domain.

Звярніце ўвагу, што аддаецца не толькі PTR-запіс і але і CNAME. Так і мусіць быць. Калі цікава чаму, то сардэчна запрашаем у наступны раздзел.

2. Тэорыя. Як гэта працуе.

Складана наладжваць і адладжваць чорную скрыню. Значна прасцей, калі разумееш што адбываецца ўсярэдзіне.

Калі мы дэлегуем паддамен у дамене дамен, то пішам нешта накшталт гэтага:

client.domain.	NS	ns1.client.domain.
ns1.client.domain.	A	7.8.7.8

Мы гаворым усім, хто пытаецца, што за гэты ўчастак не адказваем і гаворым хто адказвае. І ўсе запыты на client.domain рэдырэктуюць на 7.8.7.8. Пры праверцы мы бачым наступную карціну (апусцім што там у кліента. гэта ўсё роўна):

# host test.client.domain
test.client.domain has address 7.8.9.241

Г.зн. нам паведамілі, што ёсць такі А запіс і яго ip 7.8.9.241. Ніякай лішняй інфармацыі.

А як тое ж самае можна зрабіць з падсеткай?

Т.к. наш DNS-сервер прапісаны ў RIPE, то пры запыце PTR ip-адрасы з нашай сеткі, усё роўна першы запыт будзе да нас. Логіка тая ж што і з даменамі. Вось толькі як упісаць падсетку ў файл зоны?

Спрабуем упісаць вось так:

255-240  IN  NS      7.8.7.8

І… цуду не адбылося. Мы не атрымліваем ніякага перанакіравання запыту. Уся справа ў тым, што bind наогул не ў курсе што вось гэтыя запісы ў файле зваротнай зоны гэта ip-адрасы і ўжо тым больш не разумее запіс дыяпазону. Для яго гэта проста нейкі знакавы паддамен. Г.зн. для bind не будзе розніцы паміж «255-240»І«oursuperclient“. І запыт каб запыт сышоў куды трэба, адрас у запыце павінен выглядаць вось так: 241.255-240.9.8.7.in-addr.arpa. Або вось так, калі мы выкарыстоўваем знакавы паддамен: 241.oursuperclient.9.8.7.in-addr.arpa. Гэта адрозніваецца ад звычайнага: 241.9.8.7.у-addr.arpa.

Рукамі такі запыт будзе зрабіць праблематычна. А калі і атрымаецца, то ўсё роўна незразумела як гэта прымяніць у рэальным жыцці. Бо па запыце 7.8.9.241 нам па-ранейшаму адказвае правайдэрскі DNS, а не кліенцкі.

А вось тут у гульню ўступаюць CNAME.

На баку правайдэра трэба зрабіць для ўсіх ip-адрасоў падсеткі аліяс у фармат, які пераправіць запыт кліенцкаму DNS.

255-240  IN  NS      ns1.client.domain.
241     IN  CNAME   241.255-240
242     IN  CNAME   242.255-240
и т.д.

Гэта для працавітых =).

А для лянівых больш падыдзе канструкцыя ніжэй:

255-240  IN  NS      ns1.client.domain.
$GENERATE 240-255 $ CNAME $.255-240

Цяпер запыт інфармацыі па адрасе 7.8.9.241 з 241.9.8.7.у-addr.arpa на днс-серверы правайдэра будзе пераўтвораны ў 241.255-240.9.8.7.in-addr.arpa і пойдзе на днс-кліента.

З боку кліента неабходна будзе апрацоўваць такія запыты. Адпаведна мы ствараем зону 255-240.9.8.7.in-addr.arpa. У ёй мы ў прынцыпе можам размяшчаць зваротныя запісы для любых ip усёй падсеткі /24, але пытацца ў нас будуць толькі пра тыя, якія правайдэр да нас пераадрасуе, так што пабалаваць не атрымаецца =).
Для ілюстрацыі яшчэ раз прывяду прыклад утрымання файла зваротнай зоны са боку кліента:

$ORIGIN 255-240.9.8.7.in-addr.arpa.
$TTL 1W
@                       1D IN SOA       ns1.client.domain. root.client.domain. (
                        2008152607      ; serial
                        3H              ; refresh
                        15M             ; retry
                        1W              ; expiry
                        1D )            ; minimum
@                       IN NS        ns1.client.domain.
@                       IN NS        ns2.client.domain.
241                     IN PTR          test.client.domain.
242                     IN PTR          test2.client.domain.
245                     IN PTR          test5.client.domain.

Вось з-за таго, што мы з боку правайдэра выкарыстоўваем CNAME, то і атрымліваем у адказ на запыт дадзеных па ip-адрасу два запісы, а не адзін.

#>  host 7.8.9.245 
245.9.8.7.in-addr.arpa is an alias for 245.255-240.9.8.7.in-addr.arpa.
245.255-240.9.8.7.in-addr.arpa domain name pointer test5.client.domain.

І не забывайце карэктна наладжваць ACL. Таму што бессэнсоўна забіраць сабе PTR-зону і не адказваць нікому са знешкі =).

Крыніца: habr.com

Дадаць каментар