godns

command module
v0.0.0-...-7310c1d Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Sep 19, 2022 License: MIT Imports: 19 Imported by: 0

README

GODNS

A simple and fast dns cache server written by go. fork from kenshinx/godns.

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

  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

    $ dig @101.4.1.17 wiki.bjca
    
    ; <<>> DiG 9.10.6 <<>> @101.4.1.17 wiki.bjca
    ; (1 server found)
    ;; global options: +cmd
    ;; Got answer:
    ;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 1578
    ;; flags: qr rd; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 0
    ;; WARNING: recursion requested but not available
    
    ;; QUESTION SECTION:
    ;wiki.bjca.			IN	A
    
    ;; ANSWER SECTION:
    wiki.bjca.		600	IN	A	192.168.131.51
    
    ;; Query time: 4 msec
    ;; SERVER: 101.4.1.17#53(101.4.1.17)
    ;; WHEN: Mon Jul 25 16:36:20 CST 2022
    ;; MSG SIZE  rcvd: 52
    

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

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.

demo

% dig a.cn @127.0.0.1 -p5301

; <<>> DiG 9.10.6 <<>> a.cn @127.0.0.1 -p5301
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 64638
;; flags: qr rd; QUERY: 1, ANSWER: 2, AUTHORITY: 0, ADDITIONAL: 0
;; WARNING: recursion requested but not available

;; QUESTION SECTION:
;a.cn.                          IN      A

;; ANSWER SECTION:
a.cn.                   600     IN      A       192.168.1.1
a.cn.                   600     IN      A       192.168.1.2

;; Query time: 0 msec
;; SERVER: 127.0.0.1#5301(127.0.0.1)
;; WHEN: Mon Sep 19 13:07:32 CST 2022
;; MSG SIZE  rcvd: 62

bingoobjca@bingoobjcadeMacBook-Pro godns % 

Documentation

The Go Gopher

There is no documentation for this package.

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL