Linux Local DNS caching using dnsmasq
A local DNS cache can help for faster browsing since you’re caching the DNS request instead of attempting that request multiple times. The internet speed will not get any faster, but the browsing speed will improve, because on each website there are usually quite a few DNS requests for which the local DNS cache will be used, bringing the query time to almost 0. You can find more info about DNS, on Wikipedia.
To see how fast your current domain name servers (DNS) are, open a terminal and paste this:
(Or dig google.com or whatever domain)
You should see something like this:
; <<>> DiG 9.6.1-P1 <<>> yahoo.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 42045 ;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;yahoo.com. IN A ;; ANSWER SECTION: yahoo.com. 20142 IN A 18.104.22.168 yahoo.com. 20142 IN A 22.214.171.124 yahoo.com. 20142 IN A 126.96.36.199 ;; Query time: 50 msec ;; SERVER: 188.8.131.52#53(184.108.40.206) ;; WHEN: Wed Dec 9 13:21:48 2009 ;; MSG SIZE rcvd: 75
Notice the "Query time" in bold. It's usually somewhere near 50 msec. (it depends on your domain name servers).
Run this one more time. If the query time decreases to less than 5 msec, it means your internet service provider DNS already uses some caching method and you do not need to follow this how-to. If the response time is almost the same and you are using a cable (broadband) internet connection, you can use this guide to cache the DNS for faster internet browsing.
Firstly, I would like to thank embraceubuntu for this how-to, I've just made it more newbie-friendly. So the credits go to him.
Before we get started, please note that there is an easier method on doing this (by only installing (well, actually you need to edit /etc/bind/named.conf.options with your ISP DNS) resolvconf and bind9: sudo apt-get install resolvconf bind9) but in my tests, using resolvconf and bind9, the first DNS query time was 200-300 msec (maybe it needs some tweaking but I couldn't figure out why there is such a big query time the first time) and then since it was cached, it went to 0. But the method I am going to explain will get an initial query time equal to your default DNS (~50 msec for me, as opposed to 200-300 msec which I got by using resolvconf and bind9).
Let's get started!
Manually configuring the local DNS cache
1. Install DNSMasq:
sudo apt-get install dnsmasq
2. Configure dnsmasq.conf
Press Alt + F2 and type:
gksu gedit /etc/dnsmasq.conf
Now search for "listen-address" (it's on line 90 on my Ubuntu Karmic installation), remove the "#" character in front of "listen-address" and add "127.0.0.1" after the "=" (all without the quotes). Basically, this is how the "listen-address" line should look like after editing it:
(Optional) You can also edit the cache size if you want. Search for this in the same file: "#cache-size=150" (it's on line 432 on my Ubuntu Karmic installation), remove the "#" character in front of the line (this uncomments it) and change "150" with the size you want for you DNS cache. This is how the line should look after editing it:
Obviously, "500" can be any number you want.
Don't forget to save the changes!
3. Edit dhclient.conf
Press Alt + F2 and type:
gksu gedit /etc/dhcp3/dhclient.conf
For newer Ubuntu versions (tested on Oneiric), dhclient.conf has moved, so use the following command instead:
gksu gedit /etc/dhcp/dhclient.conf
And modify the "prepend domain-name-servers" (it's on line 20 on my computer) to look like this:
prepend domain-name-servers 127.0.0.1;
4. Edit resolv.conf
Press Alt + F2 and paste this:
gksu gedit /etc/resolv.conf
Initially, this is how the resolv.conf file looks like:
nameserver ISP_DNS1 nameserver ISP_DNS2
Where ISP_DNS1 and ISP_DNS2 are your ISP domain name servers (or 220.127.116.11, etc if you are using Google DNS and so on).
Put this as the first line in your resolv.conf file:
Which means this is how your resolv.conf file will look like:
nameserver 127.0.0.1 nameserver ISP_DNS1 nameserver ISP_DNS2
Again, ISP_DNS1 and ISP_DNS2 are your ISP domain name servers.
As an example, this is how my resolv.conf file looks like (using local DNS cache, a Google DNS and an OpenDNS DNS):
nameserver 127.0.0.1 nameserver 18.104.22.168 nameserver 22.214.171.124
4.1 If you are using a DSL connection, you need to make sure the ppp client will not overwrite your /etc/resolv.conf file. To do this, press Alt + F2, and paste this:
gksu gedit /etc/ppp/peers/provider
Search for "usepeerdns" and replace it with "#usepeerdns" (we used "#" to comment that line so it's ignored).
5. Restart your networking and dnsmasq:
sudo /etc/init.d/networking restart
sudo /etc/init.d/dnsmasq restart
Please note that you can use this last command at any time you want to restart your DNS cache (flush DNS, clear the cache - call it whatever you want) without restarting the computer.
To see the peformance improvement, open a terminal and type:
The first time, it should be the same like in the beginning of the post (~50 msec. for me). Now type it again! You should see something like this:
dig yahoo.com ; <<>> DiG 9.6.1-P2 <<>> yahoo.com ;; global options: +cmd ;; Got answer: ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 57501 ;; flags: qr rd ra; QUERY: 1, ANSWER: 3, AUTHORITY: 0, ADDITIONAL: 0 ;; QUESTION SECTION: ;yahoo.com. IN A ;; ANSWER SECTION: yahoo.com. 20982 IN A 126.96.36.199 yahoo.com. 20982 IN A 188.8.131.52 yahoo.com. 20982 IN A 184.108.40.206 ;; Query time: 0 msec ;; SERVER: 127.0.0.1#53(127.0.0.1) ;; WHEN: Wed Dec 9 14:43:41 2009 ;; MSG SIZE rcvd: 75
0 msec. query time, because the domains are now cached.
Note: Using the method above, the DNS cache will be cleared once you reboot your computer. For persistent DNS caching (on the hard disk), see this excellent how-to on Ubuntu Forums.