godns 簡單dnsmasq 的dns 替換方案


godns 可以用來替換dnsmasq,同時包含了一些新的特性

  • 數據可以在hosts 文件以及redis
  • 當hosts 文件變動的時候,自動reload
  • 包含了一個相對比較全的ui(支持添加以及刪除操作,dnsmasq可以基於jpillora/webproc實現一個ui的包裝,但是一般)
    以下是一個測試使用

環境准備

  • docker-compose 文件
    包含了redis,godns以及joke,說明對於godns 以及joke 的構建都是基於源碼的(使用了go mod)
 
version: "3"
services: 
  redis:
     image: redis
     ports: 
     - "6379:6379"
  joke: 
     image: dalongrong/godns:joke
     build: 
      context: ./
      dockerfile: ./Dockerfile-joke
     ports: 
     - "1223:1223"
  godns: 
     image: dalongrong/godns
     build: 
      context: ./
      dockerfile: ./Dockerfile-godns
     ports: 
     - "53:53/udp"
     - "53:53/tcp"
  • godns dockerfile
    基於golang 的supervisord進行管理
 
FROM golang:1.13-alpine AS build-env
WORKDIR /go/src/app
RUN  /bin/sed -i 's,http://dl-cdn.alpinelinux.org,https://mirrors.aliyun.com,g' /etc/apk/repositories
ENV  GO111MODULE=on
ENV  GOPROXY=https://goproxy.cn
COPY code/godns/ .
RUN apk update && apk add git \
    && go build
FROM alpine:latest
WORKDIR /app
RUN  /bin/sed -i 's,http://dl-cdn.alpinelinux.org,https://mirrors.aliyun.com,g' /etc/apk/repositories
RUN apk update && apk add ca-certificates && rm -rf /var/cache/apk/*
COPY --from=ochinchina/supervisord:latest /usr/local/bin/supervisord /usr/local/bin/supervisord
COPY --from=build-env /go/src/app/godns /app/godns
COPY supervisor-godns.conf /etc/supervisord.conf
COPY godns.conf /etc/godns.conf
EXPOSE 53/udp 53 9001
CMD ["/usr/local/bin/supervisord"]
  • joke dockerfile
FROM golang:1.13-alpine AS build-env
WORKDIR /go/src/app
RUN  /bin/sed -i 's,http://dl-cdn.alpinelinux.org,https://mirrors.aliyun.com,g' /etc/apk/repositories
ENV  GO111MODULE=on
ENV  GOPROXY=https://goproxy.cn
COPY code/joke/ .
RUN apk update && apk add git \
    && go build
FROM alpine:latest
WORKDIR /app
RUN  /bin/sed -i 's,http://dl-cdn.alpinelinux.org,https://mirrors.aliyun.com,g' /etc/apk/repositories
RUN apk update && apk add ca-certificates && rm -rf /var/cache/apk/*
COPY --from=ochinchina/supervisord:latest /usr/local/bin/supervisord /usr/local/bin/supervisord
COPY --from=build-env /go/src/app/joke /app/joke
COPY --from=build-env /go/src/app/static /app/static
COPY --from=build-env /go/src/app/views /app/views
COPY supervisor-joke.conf /etc/supervisord.conf
COPY joke.conf /etc/joke.conf
EXPOSE 1223 9001
CMD ["/usr/local/bin/supervisord"]
  • godns 配置
    修改了一些添加了redis 的配置,默認是沒有直接支持redis的
 
#Toml config file
Title = "GODNS"
Version = "0.1.2"
Author = "kenshin"
Debug = false
[server]
host = "0.0.0.0"
port = 53
[resolv]
# Domain-specific nameservers configuration, formatting keep compatible with Dnsmasq
# Semicolon separate multiple files.
#server-list-file = "./etc/apple.china.conf;./etc/google.china.conf"
resolv-file = "/etc/resolv.conf"
timeout = 5  # 5 seconds
# The concurrency interval request upstream recursive server
# Match the PR15, https://github.com/kenshinx/godns/pull/15
interval = 200 # 200 milliseconds
setedns0 = false #Support for larger UDP DNS responses
[redis]
enable = true
host = "redis"
port = 6379
db = 0
password =""
[memcache]
servers = ["127.0.0.1:11211"]
[log]
stdout = true
level = "INFO"  #DEBUG | INFO |NOTICE | WARN | ERROR  
[cache]
# backend option [memory|memcache|redis]  
backend = "redis"  
expire = 600  # 10 minutes
maxcount = 0 #If set zero. The Sum of cache itmes will be unlimit.
[hosts]
#If set false, will not query hosts file and redis hosts record
enable = true
host-file = "/etc/hosts"
redis-enable = true
redis-key = "godns:hosts"
ttl = 600
refresh-interval = 5 # 5 seconds
  • joke 配置
#[beego]
appname = Joke
httpaddr = "0.0.0.0"
httpport = 1223
runmode = "dev"
autorender = true
autorecover = true
viewspath = "views"
#[auth]
#username:password.
#basic_auth = "joke:hello"
#[redis]
redisaddr = "redis:6379"
redisdb = 0
redispassword = ""
bindkey = "godns:hosts"
#[log]
stdout = true
logfile = "logs/joke.log"
logrorate = true
  • supervidord 配置
    基本都一樣可以參考
 
[program:godns]
command =/app/godns -c /etc/godns.conf
[inet_http_server]
port = :9001
  • 啟動
docker-compose up -d
  • 添加redis key
    這個數據程序的一個設計問題,沒有自動添加hash key
 
hset godns:hosts demo.rong.com 192.168.0.109

測試試用

  • ui 效果

 

 

  • dig 測試
dig @127.0.0.1 demo.rong.com

效果

 

 

說明

godns 還是一個不錯的dns 選擇(測試),如果我們集成了coredns 會更加強大(rewrite,log,trace,metrics。。。),同時相關docker
image 已經push 到docker hub 了,參考dalongrong/godns dalongrong/godns:joke

參考資料

https://github.com/rongfengliang/godns-joke-learning
https://github.com/kenshinx/godns
https://github.com/kenshinx/joke
https://www.cnblogs.com/rongfengliang/p/11498598.html
https://github.com/coredns/coredns


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM