9856d3f3be | ||
---|---|---|
docker | ||
etc | ||
.gitignore | ||
.gitlab-ci.yml | ||
LICENSE | ||
README.md | ||
cache.go | ||
godns_test.go | ||
handler.go | ||
hosts.go | ||
log.go | ||
log_test.go | ||
main.go | ||
resolver.go | ||
server.go | ||
settings.go | ||
sfx_tree.go | ||
sfx_tree_test.go | ||
utils.go | ||
utils_test.go |
README.md
GODNS
A simple and fast dns cache server written by go.
Similar to dnsmasq, but supports 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
-
Install
$ go get github.com/kenshinx/godns
-
Build
$ cd $GOPATH/src/github.com/kenshinx/godns $ go build -o godns
-
Running
$ sudo ./godns -c ./etc/godns.conf
-
Test
$ dig www.github.com @127.0.0.1
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
server-list-file
Domain-specific nameservers configuration, formatting keep compatible with Dnsmasq.
server=/google.com/8.8.8.8
More cases please refererence dnsmasq-china-list
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"
Hosts file format is described in linux man pages.
More than that , *.
wildcard is supported additional.
redis hosts
This is a special requirment in our system. Must maintain a global hosts configuration, and support update the host records from other remote server. Therefore, while "redis-hosts" be enabled, 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.test.com 1.1.1.1
Compared with file-backend records, redis-backend hosts support multiple A entries.
redis > hset godns:hosts www.test.com 1.1.1.1,2.2.2.2
Benchmark
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
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.