Docker 搭建私有 DNS 服务器

温馨提醒
总结摘要
本文详细介绍了如何使用 Docker 快速部署基于 BIND9 的私有 DNS 服务器(sameersbn/bind 镜像),涵盖容器运行参数(特别是 --net=host 的必要性)、Web 管理界面配置、主区域与 A 记录创建,并重点解决了 Linux 客户端主机名解析失败的问题,提供了临时和永久设置搜索域(search domain)的方法,适用于内网域名解析、开发测试环境等场景。

daocker搭建私有dns服务器

前置量:需要docker环境,版本无要求

1
2
3
4
## 创建持久化存放文件的目录
mkdir -p /container-data/bind
## 使用容器创建应用
docker run --net=host --name bind -d --restart=always --publish 53:53/tcp --publish 53:53/udp --publish 10000:10000/tcp --volume /container-data/bind:/data sameersbn/bind:9.16.1-20200524

注意:私有dns部署的话用以下命令可以使用,但是该dns服务器只能解析记录的域名,没有记录的域名无法解析。原因是,容器内的网络默认是桥接的docker0的网卡,在容器内是无法访问公网的,所以就算配置了转发,也无法进行解析。

1
docker run --name bind -d --restart=always --publish 53:53/tcp --publish 53:53/udp --publish 10000:10000/tcp --volume /container-data/bind:/data sameersbn/bind:9.16.1-20200524

如果需要解析应记录以外的域名地址,则需要添加 --net=host 参数,这个参数将容器加入到主机的网络命名空间,直接使用主机的网络资源,可以提高网络性能,但是容器与主机之间的隔离性较差。

如果未关闭防火墙则使用systemctl stop firewalld ;systemctl disable firewalld关闭防火墙,如果docker run创建容器时未添加--net=host参数,则需要在防火墙上打开对应端口

1
2
3
firewall-cmd --add-port={53,10000}/tcp --permanent
firewall-cmd --add-port=53/udp --premanent
firewall-cmd --reload

处理好防火墙之后,使用浏览器,打开https://IP:10000地址,默认用户名和密码 root/password.

登录之后在左侧导航栏选择:server => BIND DNS Server => 创建新的主区域

image-20230223220627856

输入域名,可以是一级域名test或test.com。

image-20230223220831087

点击新建完成创建域名。

创建好之后,点击左上角的【地址】进行创建映射

image-20230223221050908

输入主机名以及对应的IP,点击新建

image-20230223221147229

新建完成之后,可以看到下方已经列出刚刚创建的映射,点击右上角应用配置,就创建好了

image-20230223221250108

使用cmd或这linux中的nslookup命令进行验证。

image-20230223221414200

解析成功,证明dns服务器解析记录生效。

在Linux中主机名解析

在Linux中,我们将服务器的dns地址改为刚刚创建的dns服务器的地址。使用ping命令或nslookup命令可以看到域名解析成功。

但是同样使用ping或者nslookup解析主机名就无法解析到ip地址。如图

image-20230223221710517

解决办法:

可以设置文件/etc/resolv.conf,在文件中加入默认搜索域search test.chang,多个搜索域可以使用空格隔开。如图:

image-20230223222333129

但是这样设置是临时的,重启服务器或者重启网络之后会被更改,永久修改办法:

1、修改/etc/sysconfig/network-scripts/ifcfg-***

image-20230223222526616

2、修改NetworkManager.conf

image-20230223222625791

3、修改dns服务器的named.conf文件

image-20230223222748547

修改之后如下,成功

image-20230223222836757