Lokalne cache-owanie DNS-ów

22 02 2009

Podczas pojedynczej sesji pobieramy wiele razy wciąż ten sam adres IP zamieniony z hosta z serwera DNS. A co dopiero, gdy w systemie mamy kilku użytkowników, którzy w mniejszej lub większej części odwiedzają te same serwisy. Zapewne nie raz widzieliśmy na dolnym pasku przeglądarki kilkusekundowe “Ustalanie adresu (…)”, nawet gdy korzystaliśmy już z kilku(dziesięciu) stron na tym samym serwerze. Proces ten można nieco przyspieszyć, opierając się na fakcie, że IP serwera nie zmienia się kilka razy na godzinę, tylko jest stałe. Potrzebujemy usługi przynoszącej nam możliwość cache-owania DNS-ów na lokalnym komputerze.

Adekwatnych do naszej potrzeby cacherów mamy dwóch: dnsmasq i nscd. Ten drugi zawarty w glibc, niestety, może być używany tylko przez aplikacje korzystające z tej biblioteki translacji DNS-ów, której on sam używa, a więc przykładowy Firefox, będący w większości przypadków głównym konsumentem cachera, nie skorzysta na tym. Aczkolwiek nscd możemy użyć do cache-owania lokalnych haseł i grup użytkowników, więc o ile odrzucamy go w kwestii hostów, o tyle warto i tak mu się przyjrzeć.

dnsmasq natomiast pełni rolę serwera DNS-ów, co czyni go zdecydowanie bardziej uniwersalnym, będziemy mogli na nim oprzeć wszystkie internetowe aplikacje. Jest on ponadto serwerem DHCP, lecz w ujęciu desktopowego komputera pod tym kątem on się nam nie przyda, więc pozwolę sobie pominąć tą funkcjonalność w opisie konfiguracji.

Zacznijmy od zainstalowania i konfiguracji. dnsmasq znajduje się w oficjalnym repozytorium Slackware’a, więc nie będzie problemu ze zdobyciem jego paczki. Konfiguracja jest również prosta, bo polega na odkomentowaniu kilku opcji z jego pliku konfiguracyjnego /etc/dnsmasq.conf. Przedstawiam je poniżej, lecz aby zachować porządek w pliku proponuję ręcznie je odszukać, odkomentować i dodać potrzebne parametry.

interface=ra0
listen-address=127.0.0.1
expand-hosts
cache-size=1024
no-negcache

W opcji interface podajemy nasz interfejs sieciowy łączący nas z Internetem (w przypadku karty Ethernet będzie to zwykle eth0) — do sprawdzenia poleceniem ifconfig. listen-address definiuje IP, na którym serwer DNS-ów dnsmasq będzie nasłuchiwał. To z nim będą się łączyć wszelkie aplikacje klienckie, począwszy od ping, skończywszy na przeglądarce. expand-hosts sprawia, że cache-owane będą nie tylko adresy IP zawarte w pliku /etc/hosts, lecz również wszystkie te, z których korzystać będą aplikacje. cache-size to wielkość naszego cache-a, 1024 wydaje się wystarczająca. No i w końcu no-negcache, poprzez które informacja o nieistnieniu danego adresu nie będzie cache-owana, co wybawi nas od problemu fałszywej informacji, gdyby nagle host się pojawił na serwerze DNS.

Teraz wypada nadać uprawnienia wykonywalności skryptowi startowemu, aby dnsmasq był uruchamiany przy starcie systemu, i najlepiej od razu go uruchomić.

# chmod 755 /etc/rc.d/rc.dnsmasq
# /etc/rc.d/rc.dnsmasq start

W końcu musimy sprawić, żeby aplikacje wiedziały, że domyślnie mają się odwoływać nie do globalnych serwerów DNS, tylko do naszego pośredniczącego dnsmasq, który sam odwoła się do globalnych, jeżeli jeszcze dany adres nie będzie się znajdował w cache-u.
W związku z tym na początku pliku /etc/resolv.conf dopisujemy nasz lokalny serwer 127.0.0.1. W przypadku, gdy korzystamy z usług TP, może on wyglądać następująco:

search .
nameserver 127.0.0.1
nameserver 194.204.152.34
nameserver 194.204.159.1

Jeżeli używamy klienta DHCP, to musimy i go o tym poinformować, dodając do /etc/dhclient.conf linijkę:
prepend domain-name-servers 127.0.0.1,194.204.152.34,194.204.159.1

Od teraz cache-owanie przy pomocy dnsmasq powinno być w pełni funkcjonalne. Sprawdzić to możemy wywołując translację hosta na IP dig-iem. Najpierw, by IP zostało zapisane w cache-u; drugi raz, żeby sprawdzić, czy cache działa — odpowiedź serwera nie powinna być dłuższa niż kilka milisekund.

Za cenne wskazówki dziękuję slawulowi, który zresztą zainteresował mnie tym zagadnieniem. ;-)


Opcje

Info

5 Odpowiedzi do “Lokalne cache-owanie DNS-ów”

22 02 2009
gość (22:02:01) :

Dzieki za ten artykuł, bardzo ciekawe.

Czy to oznacza że działa?

; <> DiG 9.4.2-P2 <> wykop.pl
;; global options: printcmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 29062
;; flags: qr rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0

;; QUESTION SECTION:
;wykop.pl. IN A

;; ANSWER SECTION:
wykop.pl. 3532 IN A 91.102.117.196

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Sun Feb 22 20:59:08 2009
;; MSG SIZE rcvd: 42

To jest wynik za drugim razem. Za pierwszym miałem 1milisek.

22 02 2009
gość (22:03:07) :

errata
Za pierwszym miałem 14milisek

ps. nie ma edycji postów :/

22 02 2009
Zielony (22:28:13) :

Owszem, to oznacza, że działa. ;-) Za pierwszym razem można mieć nawet kilkaset przy kiepskim łączu, bo wtedy pobiera adres z serwera DNS. Natomiast przy drugim w granicach kilku, na nowszych komputerach 0, więc jak najbardziej wszystko w porządku. :P

22 02 2009
Argon (23:16:29) :

Dnsmasq siedzi zaszyty w większości firmware’ów w routerach. Jest malutki, dobrze radzi sobie jako DHCP i DNS, i jest łatwy w konfiguracji. Najlepsze jednak są miny ludzi, gdy na pytanie: “jakiego serwera DNS używasz?” odpowiedź brzmi “127.0.0.1″ :-)

23 02 2009
Zielony (00:16:04) :

Dobre, Argon. :D

Odpowiedz

Możesz używać tagów : <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>