DNS Cache that Autoupdates



  • This may be either a dumb question or something that isn't possible.

    I'm about to order pfSense hardware to change my router.

    I'm wanting to maintain my own DNS server and cache perhaps the top 1-5,000 domains. I want the database to update every 24-48 hours using Google or some other DNS database.

    Is this possible?  My goal is to reduce latency by not needing to send the DNS request to Google when the web page is loaded.



  • Since the DNS entries are cached once fetched and they persist for some period of time (based on the expire time the DNS server you query sets) a very simple way to accomplish this is to just do a name lookup of each host you want cached. If you want to be simple just use a single list, fancier use multiple lists based on the expire times. Dig will give you the expire times to play with and if run in batch mode will process your lists.

    ; <<>> DiG 9.9.6-P1 <<>> pfsense.com
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 40735
    ;; flags: qr rd ra; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 1
    
    ;; OPT PSEUDOSECTION:
    ; EDNS: version: 0, flags:; udp: 4096
    ;; QUESTION SECTION:
    ;pfsense.com.                   IN      A
    
    ;; ANSWER SECTION:
    pfsense.com.            35588   IN      CNAME   pfsense.org.
    pfsense.org.            300     IN      A       208.123.73.69
    
    ;; Query time: 153 msec
    ;; SERVER: 172.16.0.1#53(172.16.0.1)
    ;; WHEN: Sun Jun 12 18:52:09 MST 2016
    ;; MSG SIZE  rcvd: 81
    

    So for the pfsense sites as an example, pfsense.com shows 35588 while pfsense.org shows  300 seconds when checked from my pfSense system which is served by OpenDNS.com.

    It is a bit more complicated than that in some situations, this has a bit more detail:  http://serverfault.com/questions/179630/how-can-i-see-time-to-live-ttl-for-a-dns-record

    I don't know just how much time you are going to save here since new DNS fetches are only done if the cached record has expired. You will be saving one lookup every X seconds where X is set by the server you query.

    Have you played with NameBench to see how your DNS is performing?  https://code.google.com/archive/p/namebench/


  • LAYER 8 Global Moderator

    "I want the database to update every 24-48 hours using Google or some other DNS database. "

    You need to do some more research on how dns caching works..

    While stan tried to go into how ttl works, his example is just bad..  The ttl on cname of pfsense.com is large, while the A record is short..  He did not get that A record from his cache because it would of been something less than 300 and it wouldn't of taken 153 ms to pull it from his cache..

    So here is query that was authoritative

    
    ;; QUESTION SECTION:
    ;pfsense.org.                   IN      A
    
    ;; ANSWER SECTION:
    pfsense.org.            300     IN      A       208.123.73.69
    
    ;; Query time: 31 msec
    ;; SERVER: 192.168.9.253#53(192.168.9.253)
    ;; WHEN: Mon Jun 13 06:10:54 Central Daylight Time 2016
    
    

    Notice how it took 31 msec… I then looked it up again and was 0 msec because it just grabbed it from the cache notice how the ttl has started counting down from the 300

    
    ;; QUESTION SECTION:
    ;pfsense.org.                   IN      A
    
    ;; ANSWER SECTION:
    pfsense.org.            292     IN      A       208.123.73.69
    
    ;; Query time: 0 msec
    ;; SERVER: 192.168.9.253#53(192.168.9.253)
    ;; WHEN: Mon Jun 13 06:11:02 Central Daylight Time 2016
    
    

    Currently pfsense uses unbound as resolvler and not a forwarder out of the box.  But if your using the forwarder dnsmasq or unbound the resolver they both cache.  And items will be cached for the length of their ttl.  This is how dns is designed to work.  There really is little need to pre-populate this cache or update it on any sort of schedule.

    But if you wanted you could turn on the prefetch feature in unbound..



Log in to reply