由于开发需要多台服务器使用域名解析,需要在内网搭建一套dns系统,原来搭建过基于bind的dns服务器,但是这种服务器的配置修改比较繁琐,因此想搭建一个轻量级的dns服务器。这里我使用了dnsmasq服务。
首先了解一下什么是dnsmasq,维基百科这样说明:
这次的web-ui管理界面是基于go语言开发,下面让我们开始吧!
一、准备一台centos7的虚拟机服务器,最小安装即可,然后安装docker,这里关于docker的安装不再赘述;
二、在/home目录下编写Dockerfile文件
FROM alpine:edge
LABEL maintainer="dev@jpillora.com"
# webproc release settings
ENV WEBPROC_VERSION 0.1.9
ENV WEBPROC_URL https://github.com/jpillora/webproc/releases/download/$WEBPROC_VERSION/webproc_linux_amd64.gz
# fetch dnsmasq and webproc binary
RUN apk update \
&& apk --no-cache add dnsmasq \
&& apk add --no-cache --virtual .build-deps curl \
&& curl -sL $WEBPROC_URL | gzip -d - > /usr/local/bin/webproc \
&& chmod +x /usr/local/bin/webproc \
&& apk del .build-deps
#configure dnsmasq
run mkdir -p /etc/default/
RUN echo -e "ENABLED=1\nIGNORE_RESOLVCONF=yes" > /etc/default/dnsmasq
COPY dnsmasq.conf /etc/dnsmasq.conf
ADD program.toml /etc/default.toml
#run!
ENTRYPOINT ["webproc","/etc/default.toml"]三、在Dockerfile文件目录下编写webui启动配置文件program.toml
ProgramArgs = ["dnsmasq","--no-daemon"]
# Interface to serve web UI. Warning: defaults to ALL interfaces.
Host = "0.0.0.0"# Port to serve web UI
Port = 8080# 登录管理dns的用户名密码 web UI
User = "dns"
Pass = "dns"# 允许哪些ip地址范围访问webui,安全配置选项,全部清空表示不做任何限制
# For example, ["10.0.0.0/8"]
AllowedIPs = ["133.3.103.0/24","133.3.5.0/24"]Log = "both"
# OnExit dictates what action to take when the process exits:
# "ignore" - ignore and wait for manual restart via the web UI
# "proxy" - also exit webproc with the same exit code
# "restart" - automatically restart with exponential backoff time delay between failed restarts
OnExit = "restart"ConfigurationFiles = ["/etc/dnsmasq.conf"]
RestartTimeout = "30s"
四、在Dockerfile目录下配置dnsmasq执行时使用的配置文件
#dnsmasq config, for a complete example, see:
# http://oss.segetech.com/intra/srv/dnsmasq.conf
#log all dns queries
log-queries
#dont use hosts nameservers
no-resolv
#use google as default nameservers
server=133.0.160.15
#server=8.8.8.8
#serve all .company queries using a specific nameserver
server=/zqkzzx/133.3.5.145
#explicitly define host-ip mappings
address=/freenas.zqkzzx.com/133.3.103.174
address=/cloud.zqkzzx.com/133.3.103.193
#serve all .xfvip queries using a specific nameserver
server=/xfvip/133.3.5.145
address=/nas.xfvip.com/133.3.103.174
address=/cloud.xfvip.com/133.3.103.193
address=/wok.xfvip.com/133.3.103.202
#serve all .xfvip queries using a specific nameserver
server=/xykz/133.3.5.145
address=/master.xykz.com/192.168.1.100
address=/node1.xykz.com/192.168.1.55
address=/node2.xykz.com/192.168.1.208
address=/nfs2.xykz.com/192.168.1.74五、docker编译镜像
docker build -t dnsmasq:v2 .
在dockerfile文件目录下应该有三个前面已经准备好的文件如下:
具体编译过程如下
六、查看编译好的镜像
docker images
我们可以发现有两个版本的dnsmasq,我们上面编译生成的v2版本
七、执行镜像运行dnsmasq,开启dns服务与webui管理
docker run \
--name dnsmasq \
-d \
-p 53:53/udp \
-p 5380:8080 \
-v /home/wangli/dnsmasq/dnsmasq.conf:/etc/dnsmasq.conf \
--restart always \
dnsmasq:v2
容器内开启udp53端口提供dns服务,开启8080端口提供webui服务,在容器运行的主机上对外发布udp53端口与tcp5380端口,其中通过tcp5380端口完成webui的管理
八、通过chrome浏览器登录docker宿主机5380端口配置dns
1、server下对于bind配置中的zone,也就是一个域
2、每个server下可以配置多个A记录,也就是address
3、dnsmasq可以支持同时配置多个域
这个webui界面非常简洁明了,纵向分三列,最左边是控制台负责操作服务重启与日志开关,第二列是配置文件加载内容,由于在docker运行时我们把配置文件写在本地/home/wangli/dnsmasq/dnsmasq.conf,所以即使docker挂掉也可以保证数据不丢失,如果把配置文件写在nfs或其他网络共享磁盘上可以供多个dnsmasq服务使用。
最右边就是dnsmasq运行日志,通过最左边的控制台可以控制输出内容,默认全部输出。
九、在客户机上配置dns解析服务器地址为docker主机ip
十、测试dns解析是否成功
dnsmasq日志显示主机dns请求
十一、源码补充说明
1、如果启动时定义了default.toml,则通过docker -e 选项导入的环境变量会被default.toml文件中定义的变量值覆盖;
2、port、http_user、http_pass这三个变量是可以通过docker -e 方式导入执行的,如果没有与default.toml冲突;
如果配置了AllowedIPs选项,则没有在其中的ip地址访问webui时会被拒绝。具体如下: