image

使用CoreDNS搭建简易内网DNS服务器

  • WORDS 2080

使用CoreDNS搭建内网简易DNS服务器

CoreDNS是一个使用 Go语言编写,高性能的 DNS服务器/转发器,官网

前言

最近在搭工作室内网的时候,好多服务都有通过域名访问的需求,之前是直接把域名和对应的IP地址写在 OpenWRT路由器的 hosts文件里的,后面域名列表多起来之后维护这个 hosts文件非常麻烦,于是就萌生了搭一个内网 DNS服务器的想法

后面大概总结了一下需求,主要是 内网的文件服务器和 Gitlab以及跑的一些前端服务,再加上需要劫持一下校园网的认证域名。最后综合了一下性能、易用性后决定选用 CoreDNS

下载安装

CoreDNS是基于 Go语言的项目并且使用了 go mod特性,编译需要 Go语言版本 >= 1.20

# 下载仓库
git clone https://github.com/coredns/coredns 

cd coredns

# 如果访问官方镜像仓库速度慢的 可以设置为国内的镜像地址
export GOPROXY=https://goproxy.cn

# 编译
make

编译完成后会在当前目录生成名为 coredns的可执行文件,直接运行即可

./coredns

# 会看到如下输出
.:53
CoreDNS-1.6.6
linux/amd64, go1.16.10, aa8c32

使用 dnsutils包提供的 dig工具测试 DNS服务是否可用

dig @127.0.0.1 -p 53 www.example.com

命令执行后会输出服务器返回的解析信息

自定义域名解析

需要自定义域名解析或者使用插件的功能的话,需要编辑 coredns的核心配置文件 Corefile

# 每一个 {} 是一个配置段

# 监听53端口 对所有域名生效
.:53 {
	# 启用whoami插件
    whoami
}

# 监听53端口 对所有ml后缀的域名生效
ml:53 {
	# 转发DNS请求到指定DNS地址
	forward . 8.8.8.8 223.5.5.5
	# 开启log插件 每次请求都会输出日志
	log
}

最终的配置

.:53 {
	# 使用host插件自定义域名解析 和hosts文件用法一致
	# 还可选用file插件等
    hosts {
        10.10.10.11    work.gitlab.ml
        10.10.10.10    www.xuecheng.ml xuecheng.ml ucenter.xuecheng.ml teacher.xuecheng.ml file.xuecheng.ml
        10.34.2.9      auth.cqtbi.edu.cn
        fallthrough
    }
    # hosts插件未匹配到的域名将会被转发到下面的dns服务器
    forward . 10.34.5.253 223.5.5.5 114.114.114.114 8.8.8.8 
    # 启用缓存
    cache
    # 打开log
    log
}

转为systemd

编译得到的二进制文件每次都需要手动启动停止,转为 systemd后可以使用 systemctl命令进行管理

我使用的 ArchLinux,所有用户包的 .service文件都放在 /usr/lib/systemd/system目录,先编辑 corednsservice文件

# 在network之后启动
[Unit]
After=network.target

[Service]
# 简单类型
Type=simple
# 指定二进制文件路径 配置文件路径已经进程文件目录
ExecStart=/home/cola/coredns/coredns -conf /home/cola/coredns/Corefile -pidfile /var/run/coredns/coredns.pid

[Install]
# 设置别名
Alias=coredns.service
# 添加用户参数 以便设置开机自启
WantedBy=multi-user.target

配置文件编辑完后新建进程文件的目录,否则启动会报错

sudo mkdir /var/run/coredns

然后就可以使用 systemctl管理 coredns

# 启动coredns
sudo systemctl start coredns

# 查看coredns状态
sudo systemctl status coredns

# 设置开机自启
sudo systemctl enable coredns

最后,服务跑起来之后将 OpenWRT路由器的 DNS服务器地址指向内网 DNSIP地址即可

关联文章

0 条评论