BIND - serijski brojevi u zonskim datotekama

U zonskim datotekama vaših DNS poslužitelja se nalazi serijski broj, kojeg obično povećamo kada dodajemo nove hostove ili jednostavno mijenjamo podatke u nasim zonama. Ovo radimo kako bi sekundarni DNS poslužitelji znali da je nastupila promjena i da trebaju skinuti novu inačicu zonske datoteke.

Podsjetimo se kako izgleda dio datoteke sa serijskim brojem:

@                       SOA     po hostmaster (
2010040601 ; serial
1800 ; refresh (30 minutes)
600 ; retry (10 minutes)
604800 ; expire (1 week)
3600 ; minimum (1 hour)
)

Serijski broj nema službeno definirani format, i možemo početi od jedinice, povećavati na dva, tri i tako dalje. No, zgodno je znati kada smo nešto mijenjali, kako bi lakše utvrdili kada je (i ako) došlo do greške. Zato se serijski broj obično piše u obliku datuma:

GGGGMMDDRR

Oznaka G je, naravno, godina, M mjesec, a D dan promjene. Kako u jednom danu možemo imati više izmjena, ostavili smo dva polja slobodna za broj revizije (R) toga dana. Ovo je znatno praktičnije i jednostavnije nego pisanje sata, minuta ili sekundi u tom polju.

Ukoliko se pitate zašto je predloženi format "obrnut" od "standardnog" DDMMGGGG, odgovor je jednostavan: zbog numeričkog sortiranja. Datum 2010101201 (12. listopada 2010.) će numerički uvijek biti ispred kasnijeg datuma, primjerice 2010121001 (10. prosinca 2010.). Na taj način ne morate misliti je li broj veći ili nije, nego jednostavno upišete datum na predviđeno mjesto, i ukoliko ima revizija povećate zadnju znamenku.

No, neiskusniji sistemci mogu napraviti pogrešku ukoliko nisu upoznati s ovim načinom obilježavanja. Naime, kako na prvi pogled znati je li prvi datum iz primjera 12. listopada ili 10. prosinca? No, zabune se u praksi događaju. Navest ćemo konkretan primjer sa helpdeska za sistem-inženjere:

Sep 17 08:59:02 server named[4867]: zone domena.hr/IN: serial number
(2010091701) received from master 161.53.X.Y#53 < ours (2010270204)

Nagađamo da je nepažnjom sistemca jednom zapisan datum u pogrešnom obliku (2010270204, 27. veljače), te da je nakon neke promjene u zonskoj datoteci zapisan pravilni oblik datuma (2010091701, 17. rujna). No, sada taj broj više nije veći od prethodnog i - imamo problem.

Ukoliko ne pratite logove (no, vi ih redovito pratite, zar ne?), ovu grešku nećete ni primijetiti, sve dok ne shvatite da se vaše promjene ne vide u DNS-u, ili vam netko ne javi da ne može pristupiti resursu za kojeg znate da ste ga dodali u DNS.

Grešku je, zapravo, lako popraviti, ukoliko stavimo veći serijski broj. No, on tada više neće moći održavati datum promjene (što možete staviti u komentar unutar datoteke). Dakle, najelegantnije rješenje je staviti sljedeći serijski broj:

2011010101

Prvi siječnja 2011. je svakako veći od pogrešno zapisanog datuma, a sve što trebate napraviti u sljedećoj godini je vratiti se  preporučenoj shemi GGGGMMDDRR. Ukoliko imate promjena i prije tog datuma, jednostavno povećavajte broj revizije - imate mogućnost napraviti još barem 98 revizija.

Ne možemo ovdje ne spomenuti specifičnost serijskog broja u BIND-u, a ona se pojavljuje i u drugim aspektima i primjenama u IKT. Serijski brojevi se računaju u tzv. SNA aritmetici - Serial Number Arithmetic (http://en.wikipedia.org/wiki/Serial_number_arithmetic), gdje je moguće da je 10 > 2500000000. Kako je to moguće?

Serijski broj u BIND zonama je 32-bitni broj (2^32), što kad izračunamo, dobijamo raspon mogućih vrijednosti od 0 do 4294967295. Nulu ne uzimamo u obzir, iako je nekad služila upravo za resetiranje serijskog broja, no danas to nije tako. U ovom načinu računanja, pola svih brojeva (2147483647) je veće, dok je druga polovica manja od trenutnog serijskog broja.

Nakon što ste dosegli najveći mogući broj, brojanje počinje iznova od jedan, pa je tako 10 manje od 11 do 11+2147483647, ali veće od brojeva od 11+2147483649 do 4294967295, a nakon prebacivanja maksimalne vrijednosti i od brojeva 1 do 8.

(Broj 2147483648 ne uzimamo u obzir, jer se nalazi točno u sredini raspona).

U konkretnom primjeru, a po preporuci iz O'Reilleyeve knjige "DNS and BIND" (strana 153.), kada želite smanjiti serijski broj, na trenutni broj dodajte vrijednost 2147483647. Ukoliko taj broj prelazi maksimalnu vrijednost 4294967295, taj broj oduzmite od 4294967296. Dakle, konkretno:

2010270204 + 2147483647 = 4157753851 

(rezultat nije prešao 4294967295, dakle ne morate dalje ništa računati).

Kako smo gore objasnili, broj 4157753851 je manji od brojeva u rasponu od 4157753852 do 4294967295, te nakon prelamanja od 1 do 2010270202.

Kada svi slave DNS poslužitelji preuzmu vašu zonu, možete postaviti željenu vrijednost 2010091701 koja će sada biti veća od zadnjeg serijskog broja (4157753851).

Serijski broj 4157753851 je manji od 2010270202, pa time i 2010091701, čime smo postigli naš cilj, u dva koraka.

Komplicirano? Naravno da jest, pa preporučujemo način iz prvog primjera, ali zapamtite ovaj specifičan način računanja serijskog broja - možda vam uštedi koji sat rada.

 

Kuharice: 
Vote: 
5
Vaša ocjena: Nema Average: 5 (1 vote)