Następna strona Poprzednia strona Spis treści

4. Całkiem prosta domena.

Jak skonfigurować własną domenę.

4.1 Wpierw troche teorii.

Zanim naprawdę rozpoczniemy ten rozdział, mam zamiar przedstawić ci trochę teorii na temat pracy DNSu. A ty to przeczytasz, ponieważ jest to ci potrzebne. Jeśli ci się nie chce, powinieneś choć zapoznać się z nim powierzchownie. Możesz przestać, gdy dojdziesz do wyjaśnień, co należy umieścić w pliku named.boot.

DNS jest systemem hierarchicznym. Domena główna (najwyższego poziomu) jest oznaczana kropką `.' i nazywana `root'. W domenie . można znaleźć kilka "Domen najwyższego poziomu (TLD)" np. ORG, COM, EDU czy NET. Lecz jest ich znacznie więcej. Gdy chcesz znaleźć adres kompuera prep.ai.mit.edu twój serwer musi odnaleźć komputer obsługujący domenę edu. Zadaje pytanie serwerowi domeny . (serwery domeny . zna z pliku root.cache), otrzymuje listę serwerów obsługujących domenę edu. Oto mała ilustracja:

$ nslookup
Default Server:  localhost
Address:  127.0.0.1

rozpoczynamy od zapytania serwera domeny głównej

> server c.root-servers.net.
Default Server:  c.root-servers.net
Address:  192.33.4.12

Ustawiamy rodzj zapytania: rekordy NS (adresy serwrów DNS)

> set q=ns

pytamy się o domenę edu.

> edu.

Kropka po słowie edu ma znaczenie, informuje serwer, że pytamy się o edu, które jest bezpośrednio w domenie głównej, w ten sposób wyłączamy z przeszukiwania domeny podane w pliku /etc/resolv.conf.

edu     nameserver = A.ROOT-SERVERS.NET
edu     nameserver = H.ROOT-SERVERS.NET
edu     nameserver = B.ROOT-SERVERS.NET
edu     nameserver = C.ROOT-SERVERS.NET
edu     nameserver = D.ROOT-SERVERS.NET
edu     nameserver = E.ROOT-SERVERS.NET
edu     nameserver = I.ROOT-SERVERS.NET
edu     nameserver = F.ROOT-SERVERS.NET
edu     nameserver = G.ROOT-SERVERS.NET
A.ROOT-SERVERS.NET      internet address = 198.41.0.4
H.ROOT-SERVERS.NET      internet address = 128.63.2.53
B.ROOT-SERVERS.NET      internet address = 128.9.0.107
C.ROOT-SERVERS.NET      internet address = 192.33.4.12
D.ROOT-SERVERS.NET      internet address = 128.8.10.90
E.ROOT-SERVERS.NET      internet address = 192.203.230.10
I.ROOT-SERVERS.NET      internet address = 192.36.148.17
F.ROOT-SERVERS.NET      internet address = 192.5.5.241
G.ROOT-SERVERS.NET      internet address = 192.112.36.4

Otrzymaliśmy informacje, że domenę edu obsługują serwery *.root-servers.net, tak więc możemy kontynuować nasze pytanie kierując je nadal do serwera c.root-serwers.net. Teraz chcemy wiedzieć, kto obsługuje domenę następnego poziomu: mit.edu.:

> mit.edu.
Server:  c.root-servers.net
Address:  192.33.4.12

Non-authoritative answer:
mit.edu nameserver = STRAWB.mit.edu
mit.edu nameserver = W20NS.mit.edu
mit.edu nameserver = BITSY.mit.edu

Authoritative answers can be found from:
STRAWB.mit.edu  internet address = 18.71.0.151
W20NS.mit.edu   internet address = 18.70.0.160
BITSY.mit.edu   internet address = 18.72.0.3

steawb, w20ns i bitsy obsługują mit, wybierz jeden z nich i spytaj się o ai.mit.edu:

> server W20NS.mit.edu.

W nazwach kompyterów wielkość liter nie ma znaczenia, lecz ja do przenoszenia tekstu używam myszy, zapytanie ma taką samą formę jak poprzedzająca je odpowiedź.

Server:  W20NS.mit.edu
Address:  18.70.0.160

> ai.mit.edu.
Server:  W20NS.mit.edu
Address:  18.70.0.160

Non-authoritative answer:
ai.mit.edu      nameserver = WHEATIES.AI.MIT.EDU
ai.mit.edu      nameserver = ALPHA-BITS.AI.MIT.EDU
ai.mit.edu      nameserver = GRAPE-NUTS.AI.MIT.EDU
ai.mit.edu      nameserver = TRIX.AI.MIT.EDU
ai.mit.edu      nameserver = MUESLI.AI.MIT.EDU

Authoritative answers can be found from:
AI.MIT.EDU      nameserver = WHEATIES.AI.MIT.EDU
AI.MIT.EDU      nameserver = ALPHA-BITS.AI.MIT.EDU
AI.MIT.EDU      nameserver = GRAPE-NUTS.AI.MIT.EDU
AI.MIT.EDU      nameserver = TRIX.AI.MIT.EDU
AI.MIT.EDU      nameserver = MUESLI.AI.MIT.EDU
WHEATIES.AI.MIT.EDU     internet address = 128.52.32.13
WHEATIES.AI.MIT.EDU     internet address = 128.52.35.13
ALPHA-BITS.AI.MIT.EDU   internet address = 128.52.32.5
ALPHA-BITS.AI.MIT.EDU   internet address = 128.52.37.5
GRAPE-NUTS.AI.MIT.EDU   internet address = 128.52.32.4
GRAPE-NUTS.AI.MIT.EDU   internet address = 128.52.36.4
TRIX.AI.MIT.EDU internet address = 128.52.32.6
TRIX.AI.MIT.EDU internet address = 128.52.38.6
MUESLI.AI.MIT.EDU       internet address = 128.52.32.7
MUESLI.AI.MIT.EDU       internet address = 128.52.39.7

Okazuje się, że weaties.ai.mit.edu jest serwerem nazw dla doemny ai.mit.edu:

> server WHEATIES.AI.MIT.EDU.
Default Server:  WHEATIES.AI.MIT.EDU
Addresses:  128.52.32.13, 128.52.35.13

Teraz zmieniam rodzaj zapytania. Znamy już nazwę serwera nazw dla interesującej nas domeny, spytamy sie o jakiekolwiek informacje jakie serwer posiada na temat prep.ai.mit.edu.

> set q=any
> prep.ai.mit.edu.
Server:  WHEATIES.AI.MIT.EDU
Addresses:  128.52.32.13, 128.52.35.13

prep.ai.mit.edu CPU = dec/decstation-5000.25    OS = unix
prep.ai.mit.edu
        inet address = 18.159.0.42, protocol = tcp
         #21 #23 #25 #79
prep.ai.mit.edu preference = 1, mail exchanger = life.ai.mit.edu
prep.ai.mit.edu internet address = 18.159.0.42
ai.mit.edu      nameserver = alpha-bits.ai.mit.edu
ai.mit.edu      nameserver = wheaties.ai.mit.edu
ai.mit.edu      nameserver = grape-nuts.ai.mit.edu
ai.mit.edu      nameserver = mini-wheats.ai.mit.edu
ai.mit.edu      nameserver = trix.ai.mit.edu
ai.mit.edu      nameserver = muesli.ai.mit.edu
ai.mit.edu      nameserver = count-chocula.ai.mit.edu
ai.mit.edu      nameserver = life.ai.mit.edu
ai.mit.edu      nameserver = mintaka.lcs.mit.edu
life.ai.mit.edu internet address = 128.52.32.80
alpha-bits.ai.mit.edu   internet address = 128.52.32.5
wheaties.ai.mit.edu     internet address = 128.52.35.13
wheaties.ai.mit.edu     internet address = 128.52.32.13
grape-nuts.ai.mit.edu   internet address = 128.52.36.4
grape-nuts.ai.mit.edu   internet address = 128.52.32.4
mini-wheats.ai.mit.edu  internet address = 128.52.32.11
mini-wheats.ai.mit.edu  internet address = 128.52.54.11
mintaka.lcs.mit.edu     internet address = 18.26.0.36

Jak widać rozpoczynając od domeny głównej . znaleźliśmy kolejne serwery DNS. Gdybyśmy skorzystali z własnego serwera DNS, named zpamiętałby wszystkie informacje otrzymywane z sieci i nie musiałby przej jakiś czas pytać się serwerów, korzystając z przechowywanych informacji.

Mniej opisywaną lecz równie ważną domeną jest in-addr.arpa. Tak jak zwykłe domeny również posiada strukturę hierachiczną. in-addr.arpa pozwala na znalezienie nazwy komputera, jeśli tylko posiadamy jego adres IP. Należy tu zwrócić uwagę, że adres IP jest zapisywany w odwrotnej kolejności. Jeśli twój komputer posiada adres 192.128.52.43 named będzie się zachowywał tak samo jak w przykładzie poszukiwania informacji na temat komputera prep.ai.mit.edu: znajdź serwery domey arpa., znajdź serwery in-addr.arpa., znajdź serwery 192.in-addr.arpa., znajdź serwery 128.192.in-addr.arpa./, znajdź serwery 52.128.192.in-addr.arpa./, znjdź niezbędne rekordy dla 43.52.128.192.in-addr.arpa.. Jasne, nie ?! (opowiedz 'tak'). Przez pierwsze dwa lata odwracanie kolejności częsci adresu IP sprawia małe kłopoty.

Właśnie skłamałem. DNS nie pracuje dokładnie w taki sposów jaki wam przed chwilą przedstawiłem. Lecz jest to bardzo dobre przbliżenie.

4.2 Nasza własna domena.

Teraz zdefiniujemy naszą własną domenę. Nazwijmy ją linux.bogus. Umieśćmy w niej jeden komputer. Specjalnie używam całkowicie bzdurną nazwę domeny, aby mieć pewność, że nie przeszkodzimy nikomu z Sieci.

Rozpoczęliśmy tę część dodając do named.boot wiersz:


primary         0.0.127.in-addr.arpa            pz/127.0.0

Proszę zwrócić uwagę na brak kropki `.' kończącej nazwy domen. Pierwszy wiersz określa, że plik pz/127.0.0 zawiera informacje definiujące domenę 0.0.127.in-addr.arpa. Plik ten już został utworzony, wygląda następująco:


@               IN      SOA     linux.bogus. hostmaster.linux.bogus. (
                                1       ; Serial
                                28800   ; Refresh
                                7200    ; Retry
                                604800  ; Expire
                                86400)  ; Minimum TTL
                        NS      ns.linux.bogus.
1                       PTR     localhost.

Proszę zwrócić uwagę na kropkę `.' kończącą pełne nazwy domen, w przeciwieństwie do omawianego wcześniej pliku named.boot. Niektórzy wolą rozpoczynać każdy plik strefy dyrektywą $ORIGIN lecz nie jest to konieczne. Pochodzenie (miejsce w hierarchi DNS, do którego przynależy) pliku strefy jest określone w kolumnie `domain' w pliku named.boot, w tym przypadku jest to 0.0.127.in-addr.arpa.

Powyższy plik strefy zawiera trzy rekordy (RR): SOA RR, NS RR i PTR RR. SOA jest skrótem Start Of Authority. Znak `@' jest znakiem specjalnym określającym pochodzenie, a ponieważ kolumna `domain' odpowiadająca temu plikowi mówi 0.0.127.in-addr.arpa, dlatego pierwszy wiersz tak naprawdę ma postać:

  0.0.127.IN-ADDR.ARPA. IN      SOA ...

NS to rekord serwera nazw. Wskazuje komputer, który jest serwerem nazw dla tej domeny. I na koniec rekord PTR mówi, że 1 (w pełnej formie 1.0.0.127.in-addr-arpa, tzn. 127.0.0.1) nosi nazwę localhost.

Rekord SOA stanowi nagłówek wszystkich plików stref, w każdym z plików powinien znajdować się dokładnie jeden rekord SOA, powinien to być pierwszy rekord w pliku. Opisuje on strefę, z której pochodzi (komputer o nazwie linux.bogus), kto jest odpowiedzialny za jej zawartość (hostmaster@linux.bogus), numer wersji pliku strefy (serial 1) oraz inne informacje, mające znaczenie dla pracy serwerów drugorzędnych. Jeśli dla pól refresh, retry, expire i minimum będziesz używał wartości jakie występują w tym dokumencie wszystko powinno działać poprawnie.

Rekord NS określna kto serwuje informacje DNS na temat 0.0.127.in-addr.arpa, jest to ns.linux.bogus. Rekord PTR mówi nam, że 1.0.0.127.in-addr.arpa (aka 127.0.0.1) jest znany pod nazwą localhost.

Teraz zrestartuj proces named (poleceniem ndc restart) i sprawdź poczynione zmiany programem nslookup:

$ nslookup

Default Server:  localhost
Address:  127.0.0.1

> 127.0.0.1
Server:  localhost
Address:  127.0.0.1

Name:    localhost
Address:  127.0.0.1

jak widać udało się pobrać informacje o localhost z komputera 127.0.0.1, to dobrze. Teraz nasze podstawowe zadanie, domena linux.bogus, dodaj do pliku named.boot wiersz definiujący nową domenę:


primary               linux.bogus                     pz/linux.bogus

Zwróć uwagę na powtarząjący sie brak znaku `.' kończących nazwy domen w pliku named.boot.

In the linux.bogus zone file we'll put some totally bogus data:


;
; Plik strefy linux.bogus
;
; Obowiązkowy zestaw minimum potrzebny do prawidłowej definicje domeny
;
@       IN      SOA     linux.bogus. hostmaster.linux.bogus. (
                        199511301       ; serial, todays date + todays serial #
                        28800           ; refresh, seconds
                        7200            ; retry, seconds
                        3600000         ; expire, seconds
                        86400 )         ; minimum, seconds
                NS      ns.linux.bogus.
                NS      ns.friend.bogus.
                MX      10 mail.linux.bogus   ; Primary Mail Exchanger
                MX      20 mail.friend.bogus. ; Secondary Mail Exchanger

localhost       A       127.0.0.1
ns              A       127.0.0.2
mail            A       127.0.0.4

Należy zrócić uwagę na dwie rzeczy dotyczące rekordu SOA. ns.linux.bogus musi byc rekordem RR typu A, czyli nazwą komputera, która posiada przydzielony numer IP. Niedopuszczalne jest, aby nazwa uzywana w rekordzie SOA byla rekordem tymu CNAME. Sam komputer nie musi nosic nazwy 'ns', może to byc dowolna poprawna nazwa. hostamster.linux.bogus należy odczytać jako hostmaster@linux.bogus, musi to byc adres (lub alias do) osoby (lub osób) opiekujących się DNSem dla tej domeny (i czytajacyh regularnie tę pocztę). Wszelka korespondencja dotycząca tej domeny będzie wysyłana na ten adres, może to być dowolny adres e-mail, choć kązdy spodziewa się, że adres 'hostmaster' będzie również adresem kontaktowym domeny.

W powyższym pliku znalazł się rekord RR nowego typu, a mianowicie rekord MX, inaczej rekord Mail eXchanger. Dostarcza on systemowi pocztowemu informacji, dokąd wysyłać pocztę adresowaną ktoś@linux.bogus, w tym przypadku do mail.linux.bogud lub mail.friend.bogus. Liczba poprzedzająca nazwę komputera oznacza priorytet rekordu. System pocztowy powinien korzystać w pierwszej kolejności z rekordów o najmniejszym priorytecie (w naszym przypadku 10). Jeśli nie uda się dostarczyć poczty na ten adres, należy spróbować innego adresu, o wyższym priorytecie. W naszym przypadku byłby to mail.friend.bogus, który posiada priorytet 20.

Teraz trzeba zrestartowac program named wydając polecenie ndc restart. Rezultaty naszej pracy mozemy sprawdzić programem nslookup.

$ nslookup
> set q=any
> linux.bogus
Server:  localhost
Address:  127.0.0.1

linux.bogus
        origin = linux.bogus
        mail addr = hostmaster.linux.bogus
        serial = 199511301
        refresh = 28800 (8 hours)
        retry   = 7200 (2 hours)
        expire  = 604800 (7 days)
        minimum ttl = 86400 (1 day)
linux.bogus     nameserver = ns.linux.bogus
linux.bogus     nameserver = ns.friend.bogus
linux.bogus     preference = 10, mail exchanger = mail.linux.bogus.linux.bogus
linux.bogus     preference = 20, mail exchanger = mail.friend.bogus
linux.bogus     nameserver = ns.linux.bogus
linux.bogus     nameserver = ns.friend.bogus
ns.linux.bogus  internet address = 127.0.0.2
mail.linux.bogus        internet address = 127.0.0.4

Przypatrując się dokładnie widzimy, że popełniliśmy błąd. Wiersz

  linux.bogus     preference = 10, mail exchanger = mail.linux.bogus.linux.bogus

jest niepoprawny. powinien wyglądać następująco:

  linux.bogus     preference = 10, mail exchanger = mail.linux.bogus

Specjalnie popełniłem błąd, abyście mogli się na nim uczyć :-). Przyglądając się plikowi źródłowemu zauważamy, że w wierszu

@               MX      10 mail.linux.bogus     ; Primary Mail Exchanger
brakuje kropki. Lub inaczej mówiać ma zbyt wiele członów 'linux.bogus'. Gdy nazwa komputera występująca w pliku żródłowym strefy nie kończy się kropką, program na koniec dokleja 'origin' (pochodzenie, domenę definiowaną przez ten plik źródłowy). Dlatego nazwy komputerów należy podawać w sposób pełny, pilnując końcowej kropki


@               MX      10 mail.linux.bogus.    ; Primary Mail Exchanger

lub uproszczony


@               MX      10 mail                 ; Primary Mail Exchanger

Oba sposoby są poprawne. Osobiście preferuje drugą metodę, mniej pisania. W pliku strefy domena powinna być podana w całości, razem z kończącą ją kropką (.) lub w ogole nie powinna być podawana. W takim przypadku domyślnie przyjmuje się tzw. origin. Muszę podkreślić, że nazwy domen w pliku named.boot nie powinny się kończyć kropką. Nie macie pojęcia, jak wiele razy nadmierna liczba kropek, lub ich brak spowodowała zamieszanie i ogłupiła mnóstwo ludzi.

Skoro już powiedziłąem co miałęm do powiedzenia, poniżej przedstawiam nowy źródłowy plik strefy z nowymi, dodatkowymi informacjami:


;
; Plik strefy dla linux.bogus
;
; Obowiązkowy zestaw minimum potrzebny do prawidłowej definicje domeny
;
@       IN      SOA     linux.bogus. hostmaster.linux.bogus. (
                        199511301       ; serial, todays date + todays serial #
                        28800           ; refresh, seconds
                        7200            ; retry, seconds
                        604800          ; expire, seconds
                        86400 )         ; minimum, seconds

                NS      ns              ; Inet Address of name server
                NS      ns.friend.bogus.
                MX      10 mail         ; Primary Mail Exchanger
                MX      20 mail.friend.bogus. ; Secondary Mail Exchanger

localhost       A       127.0.0.1
ns              A       127.0.0.2
mail            A       127.0.0.4
;
; Extras
;
@               TXT     "Linux.Bogus, your DNS consultants"

ns              MX      10 mail
                MX      20 mail.friend.bogus.
                HINFO   "Pentium" "Linux 1.2"
                TXT     "RMS"
richard         CNAME   ns
www             CNAME   ns

donald          A       127.0.0.3
                MX      10 mail
                MX      20 mail.friend.bogus.
                HINFO   "i486"  "Linux 1.2"
                TXT     "DEK"

mail            MX      10 mail
                MX      20 mail.friend.bogus.
                HINFO   "386sx" "Linux 1.0.9"

ftp             A       127.0.0.5
                MX      10 mail
                MX      20 mail.friend.bogus.
                HINFO   "P6" "Linux 1.3.59"

Moglibyście chcieć przesując pierwsze trzy rekordy A, tak aby sąsiadowały z innymi rekordami tego typu, zamiast siedzieć na początku listy.

W powyższym przykładzie pojawiły się rekordy nowego typu: HINFO (Host INFOrmation) składa się z dwóch częsci, dobrym zwyczajem jest umiesczenie obu w cudzysłowach. Pierwsza część określa hardware, lub procesor komputera, druga oprogramowanie lub pracujący na nim system operacyjny. Komputer ns to Pentium, pracujące pod Linuxem 1.2. Rekord TXT może zawierać dowolny tekst. Można go wykorzystywać do różnych celów. CNAME (Cannonical NAME) to sposób na nadanie wielu nazw jednemu komputerowi. Tak więc richard i www są aliasami komputera ns. To ważne aby pamiętać, że rekordy A, MX, CNAME i SOA nigdy nie powinny wskazywać na rekord CNAME. Zawsze powinny wsazywać na rekord A. Dlatego ta forma jest niepoprawna


foobar  CNAME   richard                 ; NO!

i powinna zostać zastąpiona przez


foobar  CNAME   ns                      ; Yes!

Równie ważne jest pamiętanie, że rekord CNAME nie jest poprawną nazwą, którą można stosować w adresach e-mail. Nawiązując do poprzedniego przykładu, adres wmail webmaster@www.linux.bogus nie jest niepoprawny. Możesz oczekiwać, że całkiem spora liczba administratorów pocztowych Stamtąd będzie wymagała popdorządkowania się tej regule pomimo, że w twoim przypadku wszystko może działać poprawnie. Sposobem na uniknięcie kłopotów jest stosowanie rekordów A (i być może również innych, np. rekordów MX):


www     A       127.0.0.2

Paul Vixie, największy z wizardów programu named, sugeruje aby nie korzystać z rekordów CNAME. Dlatego bardzo poważnie zastanów się nad ograniczeniem uzywania rekordów CNAME.

Załaduj nową wersję bazy wydając polecenie ndc reload, wymusi ona na procesie ponowne odczytanie plików konfiguracyjnych.

$ nslookup
Default Server:  localhost
Address:  127.0.0.1

> ls -d linux.bogus

Powyższe polecenie spowoduje przedstawienie wszystkich rekordów.

[localhost]
 linux.bogus.                   SOA   linux.bogus hostmaster.linux.bogus. (1995
11301 28800 7200 604800 86400)
 linux.bogus.                   NS    ns.linux.bogus
 linux.bogus.                   NS    ns.friend.bogus
 linux.bogus.                   MX    10   mail.linux.bogus
 linux.bogus.                   MX    20   mail.friend.bogus
 linux.bogus.                   TXT   "Linux.Bogus, your DNS consultants"
 localhost                      A     127.0.0.1
 mail                           A     127.0.0.4
 mail                           MX    10   mail.linux.bogus
 mail                           MX    20   mail.friend.bogus
 mail                           HINFO 386sx       Linux 1.0.9
 donald                         A     127.0.0.3
 donald                         MX    10   mail.linux.bogus
 donald                         MX    20   mail.friend.bogus
 donald                         HINFO i486        Linux 1.2
 donald                         TXT   "DEK"
 www                            CNAME ns.linux.bogus
 richard                        CNAME ns.linux.bogus
 ftp                            A     127.0.0.5
 ftp                            MX    10   mail.linux.bogus
 ftp                            MX    20   mail.friend.bogus
 ftp                            HINFO P6          Linux 1.3.59
 ns                             A     127.0.0.2
 ns                             MX    10   mail.linux.bogus
 ns                             MX    20   mail.friend.bogus
 ns                             HINFO Pentium     Linux 1.2
 ns                             TXT   "RMS"
 linux.bogus.                   SOA   linux.bogus hostmaster.linux.bogus. (1995
11301 28800 7200 604800 86400)

Jest dobrze. Zobaczmy jaką odpowiedź otrymamy pytając się wyłącznie o komputer www:

> set q=any
> www.linux.bogus.
Server:  localhost
Address:  127.0.0.1

www.linux.bogus canonical name = ns.linux.bogus

... Innymi słowy, prawdziwa nazwa komputera www.linux.bogus to ns.linux.bogus.

linux.bogus     nameserver = ns.linux.bogus
linux.bogus     nameserver = ns.friend.bogus
ns.linux.bogus  internet address = 127.0.0.2

a ns.linux.bogus ma adres 127.0.0.2. To również wygląda poprawnie.

4.3 Co dalej.

Oczywiście powyższa domena jest nierzeczywista, jak również adresy IP podane w przykładzie, co może utrudniać zrozumienie. Przykład przwdziwej domeny znjdziecie w następnym rozdziale.


Następna strona Poprzednia strona Spis treści