Ecosyste.ms: Awesome

An open API service indexing awesome lists of open source software.

Awesome Lists | Featured Topics | Projects

https://github.com/kenshinx/godns

A fast dns cache server written by go
https://github.com/kenshinx/godns

Last synced: about 2 months ago
JSON representation

A fast dns cache server written by go

Awesome Lists containing this project

README

        

GODNS
====

A simple and fast dns cache server written by go.

Similar to [dnsmasq](http://www.thekelleys.org.uk/dnsmasq/doc.html), 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

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 ./etc/godns.conf

4. 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](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](https://github.com/felixonmars/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](http://man7.org/linux/man-pages/man5/hosts.5.html).
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](https://github.com/kenshinx/joke)

screenshot

![joke](https://raw.github.com/kenshinx/joke/master/screenshot/joke.png)

## 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.