前言
因为项目原因,想自建一个内网DNS服务器/公网DNS服务器用于自己用以及项目上能够节省宝贵的外网带宽(哪怕只有一点点),所以想着自己建立一个DNS服务器来保证稳定性以及实现自定义域名的指向(方便使用域名来指向内网服务器)
环境
OS:Ubuntu 20.04
ENV: Dokcer 24.0.7
APP: DNS Server
开始部署
下载指定的Docker镜像,并根据官方docker file进行配置
docker pull technitium/dns-server
我不需要用到一些高级特性,例如DNS over http 等,所以仅开放两个端口,使用本地目录而不是docker 卷来进行文件存储。
注意:端口53
要同时开放 TCP 及 UDP 访问。
5380
用于网页面板53
用于DNS服务
运行docker镜像,开启服务:
sudo docker run -d \
-e DNS_SERVER_DOMAIN=dns.olderfox.com \
-p 5380:5380 \
-p 53:53 \
-p 53:53/udp \
-v /mnt/data/dockers/dnsServer:/etc/dns \
--name DnsServer \
--restart always \
technitium/dns-server
视情况不同,你可能会在较新的Ubuntu实例中遇到以下问题:
$ sudo docker run -d -e DNS_SERVER_DOMAIN=dns.olderfox.com -p 5380:5380 -p 53:53 -p 53:53/udp -v /mnt/data/dockers/dnsServer:/etc/dns --name DnsServer --restart always technitium/dns-server
#fc43291bedcf7e7547bff62338256e4203acb265feb41dacbdd116bb11ecd624
#docker: Error response from daemon: driver failed programming external connectivity on endpoint DnsServer (e7694233517f9e164df3924c5e1096826120d4828507e93ac0c38fbd12080e8b): Error starting userland proxy: listen tcp4 0.0.0.0:53: bind: address already in use.
Ubuntu 会告诉你端口已经被占用,但作为公共DNS我们又不能重新指定端口,如果你需要解决此问题,请展开以下部分,如果并没有遇到,请跟随往下
可选步骤:关闭Ubuntu systemd 自带的DNS服务
首先停用systemd-resolved, 并取消开机自动启动,接下来修改NetworkManager配置,让它能自动获取dns
#禁用开机启动
sudo systemctl disable systemd-resolved.service
#关闭服务
sudo systemctl stop systemd-resolved
#删除`/etc/resolve.conf对应的软连接`
sudo rm -rf /etc/resolv.conf
#重新创建新的软连接
sudo ln -s /run/systemd/resolve/resolv.conf /etc/resolv.conf
之后,修改 /etc/resolv.conf
将dns暂改为公共dns服务器以恢复域名解析就可以了。
sudo nano /etc/resolv.conf
启动docker镜像,此时端口5380所对应的网页面板已经可以访问,若有需要,可以创建对应的反向代理
注意:反向代理前建议指定docker容器监听IP为127.0.0.1
来避免不可预知的反代绕过
初次登录需要创建Administrator的密码。
更改完毕后便可以查看一些图表数据,以及创建各种域名解析。
记得设置上游DNS服务器,以及允许访问到上游DNS
至此:安装完成,更多配置项及详细文档,请参考:官方文档