Velocizzare le navigazione con una cache DNS

Ogni volta che è richiamato indirizzo internet per nome (quale www.ubuntu.com) viene effettuata una richiesta al server DNS (Domain Name System) che risolverà il nome dell’host in un indirizzo IP a cui il programma poi potrà connettersi.

Queste richieste sono spesso continue e ogni richiesta impiegherà del tempo tra andata, elaborazione e ritorno, ciò si traduce in continue perdite di tempo nella navigazione e tempi di accesso più elevati. Installando una cache DNS le richieste saranno mantenute in memoria e non dovranno essere ogni volta reinoltrate ai server DNS.

L’installazione è molto semplice e richiede unicamente due pacchetti: dnsmasq e dnsmasq-base, per cui all’interno di un terminale:

sudo apt-get install dnsmasq dnsmasq-base

Il servizio si autoconfigurerà e si porrà in ascolto sulla porta TCP 53, come un normale server DNS. Se la nostra necessità è utilizzarlo autonomamente è possibile chiudere la connessione su altri indirizzi IP e accettare unicamente richieste provenienti dal nostro PC. Per far ciò basterà modificare il file /etc/dnsmasq.conf con:

gksudo gedit /etc/dnsmasq.conf

Trovare le definizioni #interface (circa alla riga 85) e #bind-interfaces (circa riga 103) e modificarle in:

interface lo
bind-interfaces

Salvare e chiudere il file, quindi modificare il file con gli indirizzi DNS da utilizzare:

gksudo gedit /etc/resolv.conf

E aggiungere in cima:

nameserver 127.0.0.1

Quindi chiudere il file e riavviare il servizio dnsmasq con:

sudo /etc/init.d/dnsmasq restart

Fatto ciò le richieste DNS transiteranno prima per dnsmasq che ricercherà innanzitutto nella propria cache, qualora il risultato sarà presente fornirà l’indirizzo altrimenti la richiesta sarà girata al server DNS e quindi memorizzata nella cache. I tempi di accesso dalla cache sono mediamente di 1-2 ms, i tempi di accesso ad un server DNS sono mediamente 50 volte superiori. ;)

L’opzione predefinita di dnsmasq assume che vengano memorizzati gli ultimi 150 indirizzi in cache ma questo valore può essere ampliato modificando il parametro cache-size nel file dnsmasq.conf (circa riga 370) e ovviamente togliendo il simbolo # dall’inizio della riga.

E’ possibile effettuare un test dei tempi con:

dig www.ubuntu.com

La prima volta si otterrà una risposta simile:

;; Query time: 104 msec

Mentre le volte successive:

;; Query time: 1 msec

Il vantaggio è notevole, almeno per quanto riguarda le richieste DNS. Ulteriori informazioni sui DNS:
http://www.kernel-panic.it/it/openbsd/dns/dns2.html
http://www.comefunziona.net/articolo.asp?Ogg=dns&Pro=5

6 Risposte a “Velocizzare le navigazione con una cache DNS”

  1. Mir Dice:

    Immagino che la cache non sia permanente; questo limite è invece superato da pdnsd.
    Quanto alla configurazione del programma, conviene decommentare la riga
    prepend domain-name-servers 127.0.0.1;
    in /etc/dhcp3/dhclient.conf
    Ave!

  2. stefano Dice:

    La riga interface lo è sbagliata. Il tutorial è scopiazzato da 1000 altri in rete uguali e non spiega dove sta la cache.

  3. Muflone Dice:

    stefano, ottimo commento inutile
    rispondo solo per chi passera` da qui in seguito

    l’uso della specifica dell’interfaccia lo al posto dell’indirizzo 127.0.0.1 consente di porre in ascolto il demone su tutti gli indirizzi dell’interfaccia di loopback, che non e` detto che debba essere sempre e SOLO 127.0.0.1
    io personalmente ho due indirizzi assegnati all’interfaccia lo e cosi` ho dnsmasq in ascolto su entrambi gli indirizzi. preferire listen-address non e` migliorativo ma generalmente solo limitativo

    quanto alla cache la risposta sta nelle faq: http://thekelleys.org.uk/dnsmasq/docs/FAQ
    la cache di dnsmasq non viene salvata su disco perche` sarebbe poco utile, dato il TTL di quasi tutti i server dns. se vuoi vedere cosa realmente tiene in cache ci sono ottime opzioni di debug che dumpano il contenuto della cache al sighup (kill -1)

    il guadagno e` facilmente verificabile:
    time ping -c 3 http://www.google.com => real 0m2.196s senza dnsmasq
    time ping -c 3 http://www.google.com => real 0m2.090s con dnsmasq

  4. sacarde Dice:

    ciao,
    e’ corretto che dopo aver avviato il servizio dnsmasq
    trovo tra i log:

    ay 2 10:02:32 arch64 dnsmasq[3109]: exiting on receipt of SIGTERM
    May 2 10:02:37 arch64 dnsmasq[29088]: started, version 2.47 cachesize 290
    May 2 10:02:37 arch64 dnsmasq[29088]: compile time options: IPv6 GNU-getopt no-DBus no-I18N TFTP
    May 2 10:02:37 arch64 dnsmasq[29088]: reading /etc/resolv.conf
    May 2 10:02:37 arch64 dnsmasq[29088]: using nameserver 192.168.1.1#53
    May 2 10:02:37 arch64 dnsmasq[29088]: using nameserver 193.70.152.25#53
    May 2 10:02:37 arch64 dnsmasq[29088]: using nameserver 193.70.192.25#53
    May 2 10:02:37 arch64 dnsmasq[29088]: ignoring nameserver 127.0.0.1 – local interface
    May 2 10:02:37 arch64 dnsmasq[29088]: read /etc/hosts – 1 addresses

    e a volte non mi risolve i nomi

    • Muflone Dice:

      a volte non e` indicativo
      perche` hai quel dns su 192.168.1.1 ?
      quando non te li risolve prova a fare la risoluzione manualmente con
      nslookup ip serverdns
      e fai il giro con tutti e 3 i dns

  5. sacarde Dice:

    ho messo nel config solo: eth0

    per adesso funziona, grazie

    p.s.
    ho anche aumentato il tempo di lease del server dhcp a 24ore

Lascia una Risposta