Cómo acelerar la navegación por Internet en Linux con dnsmasq

Dnsmasq es un servidor ligero DNS y DHCP. Aquí vamos a centrarnos en su uso como DNS de sólo caché. De esta manera, dnsmasq guardará en su caché local los resultados de las consultas DNS que realicemos a los servidores DNS principales que tengamos configurados en el equipo. En las sucesivas consultas, por tanto, nuestro sistema recurrirá a la caché local de dnsmasq en vez de a los servidores DNS principales, lo que resultará en una navegación por Internet más rápida.

Para instalarlo, si estamos en un sistema Debian o derivado:

aptitude install dnsmasq

Si estamos en un sistema Red Hat o derivado:

yum install dnsmasq

Una vez realizada la instalación procederemos a hacer un pequeño retoque en el fichero de configuración principal de la misma /etc/dnsmasq.conf. Buscamos la línea listen-address e introducimos:

listen-address=127.0.0.1

Por otro lado, debemos tener en cuenta que dnsmasq utiliza el puerto 53, por lo que debemos asegurar acceso desde ese puerto y que ningún otro servicio esté utilizándolo (véase BIND o similares).

Posteriormente en el fichero /etc/resolv.conf definiremos en orden de prioridad los servidores DNS que utilizará nuestro sistema. Pondremos al servidor dnsmasq local como primero en la lista de servidores de resolución de nombres:

nameserver 127.0.0.1
nameserver 208.67.222.222
nameserver 208.67.220.220

De esta manera, nuestra máquina lo primero que hará será recurrir al servidor dnsmasq local (127.0.0.1) y si no encuentra en su caché la respuesta, recurrirá a los subsiguientes. Por cierto, para los interesados, los otros dos servidores DNS de la lista son los de OpenDNS. Dicho sea de paso, funcionan a las mil maravillas (y no, no cobro comisión por decirlo).

Una vez realizado este sencillo cambio en los DNS del sistema, para saber si el servidor dnsmasq cachea correctamente, podemos hacer unas sencillas comprobaciones después de haber navegado anteriormente por google (por poner un ejemplo). Digo después de haber navegado porque si es la primera vez que entramos a una determinada página, dnsmasq aún no habrá cacheado la respuesta DNS. La primera consulta nunca la resuelve nuestro dnsmasq local. Bien, pasemos a las comprobaciones:

  • Comprobar con dig:
    root@debian7stable:~# dig www.google.es @localhost
    ; <<>> DiG 9.8.4-rpz2+rl005.12-P1 <<>> dig www.google.es @localhost
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 42614
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0
    
    ;; QUESTION SECTION:
    ;www.google.es.                 IN      A
    
    ;; ANSWER SECTION:
    www.google.es.          105     IN      A       173.194.34.248
    www.google.es.          105     IN      A       173.194.34.247
    
    ;; Query time: 49 msec
    ;; SERVER: 127.0.0.1#53(127.0.0.1)
    ;; WHEN: Sun Oct  6 16:03:48 2013
    ;; MSG SIZE  rcvd: 63

    En la línea SERVER: 127.0.0.1#53(127.0.0.1) tenemos la respuesta: es nuestro servidor local el que responde.

  • Comprobar con nslookup:
    root@debian7stable:~# nslookup www.google.es localhost
    Server:         localhost
    Address:        127.0.0.1#53
    
    Non-authoritative answer:
    Name:   www.google.es
    Address: 173.194.34.248
    Name:   www.google.es
    Address: 173.194.34.247

    De nuevo, la clave está en el servidor que responde, el local:

    Server:         localhost
    Address:        127.0.0.1#53
  • Comprobar conexiones de red:
    root@debian7stable:~# netstat -netaup | grep 53
    tcp        0      0 0.0.0.0:111             0.0.0.0:*               LISTEN      0          5337        1736/rpcbind
    tcp        0      0 0.0.0.0:53              0.0.0.0:*               LISTEN      0          18151       8564/dnsmasq
    tcp6       0      0 :::111                  :::*                    LISTEN      0          5344        1736/rpcbind
    tcp6       0      0 :::53                   :::*                    LISTEN      0          18153       8564/dnsmasq
    udp        0      0 0.0.0.0:639             0.0.0.0:*                           0          5336        1736/rpcbind
    udp        0      0 127.0.0.1:671           0.0.0.0:*                           0          5391        1767/rpc.statd
    udp        0      0 0.0.0.0:36674           0.0.0.0:*                           102        5397        1767/rpc.statd
    udp        0      0 0.0.0.0:53              0.0.0.0:*                           0          18150       8564/dnsmasq
    udp        0      0 0.0.0.0:111             0.0.0.0:*                           0          5333        1736/rpcbind
    udp        0      0 0.0.0.0:5353            0.0.0.0:*                           106        5911        2285/avahi-daemon:
    udp6       0      0 :::639                  :::*                                0          5343        1736/rpcbind
    udp6       0      0 :::53                   :::*                                0          18152       8564/dnsmasq

    Y ahí lo tenemos, tanto en TCP/UDP IP versión 4 y 6, en el puerto 53.

Como véis, una forma fácil de implementar un DNS de sólo caché sin complicarnos la vida con mamotretos como BIND o similares.