自建DNS-容器化方案

DNS是最影响网络访问体验的部分,搭建定制本地化的DNS可以大程度优化使用感观。

目前网上比较流行的dns工具有多种,本文使用轻量化的dnsmasq工具进行搭建。

本文大纲:

  • 构建自定义镜像
  • 启动容器
  • (配置文件介绍)
  • #(设置一键脚本)
1、构建镜像

思路:为了轻量化,尽量避免不需要的插件。使用alpine作为基础镜像,只安装dnsmasq来使用。同时,保证容器的时区和本地一致,方便日志统一时间。(扩展:如部署在公有云中,可以添加iptables工具设置防火墙白名单模式来保护DNS服务,本文只本地最轻量化部署。)

Dockerfile:(Docker基础使用可先自行学习,有时间再写一篇补充)

# 使用 Alpine Linux 作为基础镜像
FROM alpine:latest
# 复制启动脚本到工作目录,可自行添加自定义命令
COPY start.sh /etc/init.d/start.sh

# 修改阿里云软件源、安装dnsmasq、修改时区、设置启动脚本权限
RUN sed -i 's/dl-cdn.alpinelinux.org/mirrors.aliyun.com/' /etc/apk/repositories && \
    apk update && \
    apk add  dnsmasq tzdata && \
    cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \
    echo "Shanghai/Asia" > /etc/timezone && \
    apk del tzdata &&\
    apk cache clean && \
    chmod +x /etc/init.d/start.sh

# 复制 dnsmasq 配置文件到容器,dnsmasq配置文件参数见目录3配置文件
COPY dnsmasq.conf /etc/dnsmasq.conf

# 复制dns配置文件到容器,可添加自己的配置文件。也可删除。
COPY accelerated-domains.china.conf /etc/dnsmasq.d/accelerated-domains.china.conf
COPY bogus-nxdomain.china.conf /etc/dnsmasq.d/bogus-nxdomain.china.conf
COPY resolv.dnsmasq.conf /etc/dnsmasq.d/resolv.dnsmasq.conf

# 添加元数据,可写自己邮箱也可删除。
LABEL maintainer="Run <hi_itboy@126.com>"

# 暴露 DNS 端口
EXPOSE 53/udp

# 设置容器启动时运行的命令
CMD ["/etc/init.d/start.sh"]

其中复制到容器中的配置文件均可自行修改,或启动容器后在本地目录映射到/etc/dnsmasq.d/目录下。
启动脚本start.sh是为了方便添加命令,内容只有dnsmasq & tail -f /dev/null这个命令用来保持后台。

构建时可选择多CPU架构构建
docker buildx build -t run/dns:1.0-arm –platform linux/arm . –load

简单构建:进入Dockfile同目录下输入以下命令,其中run/dns:1.0是镜像名称和版本号,可自行修改。

docker build -t run/dns:1.0 .

2、启动容器

可使用docker compose 设置每一项参数,也可直接docker run ,为了后续一键脚本方便设置,示例:

docker run -d \
–name dns \
-v dns:/etc/dnsmasq.d:ro \
-v /var/log/dns:/var/log:ro \
–restart always \
run/dns:1.0

其中,-d 保持后台运行,–name设置容器名称,-v dns:/etc/dnsmasq.d:ro 是宿主机新建dns卷,和容器内对应dnsmasq.d配置文件目录进行绑定(不会覆盖容器目录),ro是容器只读权限,宿主机可读写。 -v /var/log/dns:/var/log:ro 是绑定绝对路径,把宿主机/var/log/dns目录 !覆盖 !映射到容器的/var/log目录,若宿主机没对应的卷和文件夹,会自动创建。–restart 设置宿主机重启容器也会自动启动。

运行后,可查看容器的IP地址,docker inspect dns(容器名称),然后进行dns测试。

nslookup www.baidu.com 172.17.0.2(容器IP)

如果没问题,可以修改宿主机的/etc/resolv.conf文件,让宿主机DNS设置成容器的IP来使用。

同时可在run中直接映射宿主机的53端口到容器上,这样请求宿主机的DNS会直接转发给容器53端口。
-p 53:53/udp \

3、dnsmasq配置文件
参数说明
resolv-file定义dnsmasq从哪里获取上游DNS服务器的地址, 默认从/etc/resolv.conf获取。
strict-order表示严格按照resolv-file文件中的顺序从上到下进行DNS解析,直到第一个解析成功为止。
listen-address定义dnsmasq监听的地址,默认是监控本机的所有网卡上。
address启用泛域名解析,即自定义解析a记录,例如:address=/long.com/192.168.115.10 访问long.com时的所有域名都会被解析成192.168.115.10
bogus-nxdomain对于任何被解析到此 IP 的域名,将响应 NXDOMAIN 使其解析失效,可以多次指定 通常用于对于访问不存在的域名,禁止其跳转到运营商的广告站点
server指定使用哪个DNS服务器进行解析,对于不同的网站可以使用不同的域名对应解析。 例如:server=/google.com/8.8.8.8 #表示对于google的服务,使用谷歌的DNS解析。
no-hosts直接查询上游DNS,忽略hosts文件。
no-reslov不做上游DNS查询。
cache-size设置缓存域名的数量,默认150,硬限制为1000。
log-queries记录查询请求,并通过log-facility指定记录日志。
详细配置介绍:dnsmasq详解及配置dnsmasq高阶配置详解 – 国内外域名分流解析国内域名列表

构建使用dnsmasq.conf配置参数:

# 允许监听所有网络接口
#listen-address=0.0.0.0
#interface=eth0
# 配置域名解析规则
#address=/example.com/192.168.1.100

#表示严格按照resolv-file文件中的顺序从上到下进行DNS解析,直到第一个解析成功为止
#all-servers 则是同时查找选择回应最快的一个结果返回
strict-order

#上游服务器配置文件
#resolv-file=/etc/resolv.conf 默认文件最多三个上游服务器
resolv-file=/etc/dnsmasq.d/resolv.dnsmasq.conf

#指定配置文件目录全部conf后缀的为配置文件
conf-dir=/etc/dnsmasq.d/,*.conf

#开启查询记录日志并设置目录
log-queries
log-facility=/var/log/dns.log
#设置缓存最大条目
cache-size=2000

no-hosts
enable-ra
clear-on-reload

#查询流程:先hosts文件,再查找/etc/dnsmasq.d/*.conf,之后查找/etc/dnsmasq.conf
#此配置文件也可添加记录
#预计划配置文件名称:
#accelerated-domains.china.conf 国内域名解析
#bogus-nxdomain.china.conf 反劫持配置

#resolv.dnsmasq.conf 上游服务器配置
#地址来源https://github.com/felixonmars/dnsmasq-china-list/tree/master
4、一键脚本

思路:基于镜像完整打包的情况,一键部署到系统。

下载镜像–导入镜像–启动容器–设置映射目录–设置后台进程–持续运行且能设置重启容器内进程

留下评论

您的邮箱地址不会被公开。 必填项已用 * 标注