A simple, go-based DNS resolver/caching server
Go to file
kenshinx 1b660a33ff godns under the MIT license 2015-05-25 17:18:57 +08:00
.gitignore add IPv6 support 2015-02-03 20:33:54 +08:00
LICENSE godns under the MIT license 2015-05-25 17:18:57 +08:00
README.md godns under the MIT license 2015-05-25 17:18:57 +08:00
cache.go Add negative cache 2015-02-13 07:05:12 +01:00
godns.conf Make upstream query interval configurable match the PR #15 2015-05-07 17:58:31 +08:00
godns_test.go CodeReviewComments#imports 2015-02-10 17:04:57 +08:00
handler.go Add negative cache 2015-02-13 07:05:12 +01:00
hosts.go Adaptive with IPV6 in hosts records. 2015-02-12 14:54:02 +08:00
hosts_test.go add IPv6 support 2015-02-03 20:33:54 +08:00
main.go add benchmark test 2013-07-25 12:32:57 +08:00
resolver.go Make upstream query interval configurable match the PR #15 2015-05-07 17:58:31 +08:00
server.go #CodeReviewComments# imports standard library in the first group 2015-02-10 17:00:59 +08:00
settings.go Make upstream query interval configurable match the PR #15 2015-05-07 17:58:31 +08:00

README.md

GODNS

A simple and fast dns cache server written by go.

Similar to dnsmasq ,but support some difference features:

  • Keep hosts records in redis and the local file /etc/hosts

  • Auto-Reloads when hosts configuration is changed. (Yes, dnsmasq needs to be reloaded)

Installation & Running

  1. Install

     $ go get github.com/kenshinx/godns
    
  2. Build

     $ cd $GOPATH/src/github.com/kenshinx/godns 
     $ go build -o godns 
    
  3. Running

     $ sudo ./godns -c godns.conf
    
  4. Test

     $ dig www.github.com @127.0.0.1
    

More details about how to install and running godns can reference my blog (Chinese)

Use godns

	$ sudo vi /etc/resolv.conf
	nameserver #the ip of godns running

Configuration

All the configuration in godns.conf is a TOML format config file.
More about Toml :https://github.com/mojombo/toml

resolv.conf

Upstream server can be configured by changing file from somewhere other than "/etc/resolv.conf"

[resolv]
resolv-file = "/etc/resolv.conf"

If multiple namerservers are set in resolv.conf, the upsteam server will try in a top to bottom order

cache

Only the local memory storage backend is currently implemented. The redis backend is in the todo list

[cache]
backend = "memory"   
expire = 600  # default expire time 10 minutes
maxcount = 100000

hosts

Force resolve domain to assigned ip, support two types hosts configuration:

  • locale hosts file
  • remote redis hosts

hosts file

can be assigned at godns.conf,default : /etc/hosts

[hosts]
host-file = "/etc/hosts"

redis hosts

This is a special requirment in our system. Must maintain a global hosts configuration, and support update the hosts record from other remote server. so "redis-hosts" will be supported, and will query the redis db when each dns request is reached.

The hosts record is organized with redis hash map. and the key of the map is configured.

[hosts]
redis-key = "godns:hosts"

Insert hosts records into redis

redis > hset godns:hosts www.sina.com.cn 1.1.1.1

Benchmak

Debug close

$ go test -bench=.

testing: warning: no tests to run
PASS
BenchmarkDig-8     50000             57945 ns/op
ok      _/usr/home/keqiang/godns        3.259s

The result : 15342 queries/per second

The test environment:

CentOS release 6.4

  • CPU:
    Intel Xeon 2.40GHZ 4 cores

  • MEM:
    46G

Web console

Joke: A web console for godns

https://github.com/kenshinx/joke

screenshot

joke

Deployment

Deployment in productive supervisord highly recommended.


[program:godns]
command=/usr/local/bin/godns -c /etc/godns.conf
autostart=true
autorestart=true
user=root
stdout_logfile_maxbytes = 50MB
stdoiut_logfile_backups = 20
stdout_logfile = /var/log/godns.log

TODO

  • The redis cache backend
  • Update ttl

LICENSE

godns is under the MIT license. See the LICENSE file for details.