跳至主要內容

基于bind9建立本地dns服务(docker)

Mr.Lexon大约 4 分钟environment

基于bind9建立本地dns服务(docker)

重要

部署环境: ubuntu 20.04 docker 24.0.7 ubuntu/bind9 9.18.28

配置完之后如果出现错误请看”补充“可以更快得解决问题

## 初始化配置 ### 创建文件夹: ``` sh mkdir dns-server mkdir dns-server/config mkdir dns-server/data ``` ### 然后创建`docker-compose`文件 ``` bash touch docker-compose.yml ``` ### 编辑文件: ``` bash version: "3.3"

services: dns-server: image: dockerpull.org/ubuntu/bind9 container_name: dns-server networks: macvlan_net: ipv4_address: 192.168.1.200 ports: - "53:53/udp" - "53:53/tcp" restart: unless-stopped volumes: - ./data:/var/cache/bind #- ./config:/etc/bind

networks: macvlan_net: driver: macvlan driver_opts: parent: enp1s0 ipam: config: - subnet: 192.168.1.0/24


> [!warning]
> 将此行:
> `#- ./config:/etc/bind `
> 注释的原因是要从容器中复制第一次运行时的配置文件

> [!tip]
> 我这里的容器网络设置成`macvlan`模式,是因为部署`docker`的对应物理机的`53`端口已被占用所以采用和物理机同一网段

### 第一次运行:
``` bash
docker-compose up

注意

第一次运行时,bind9会从github中获取最新的更新,如果出现类似raw.githubusercontent.com无法连接或者连接错误的日志时,请检查raw.githubusercontent.com是否指向github,因为由于不可描述的原因导致raw.githubusercontent.com的dns被污染,解决这个问题,首先在ip查询网站中查询raw.githubusercontent.com指向的ip地址,找到为美国的ip,然后反向查询该ip是否属于或者曾被解析到github.com,确认完成之后,请将对应ip添加到/etc/hosts(目标安装系统的host文件)文件中即可。 如果在运行时出现/var/cache/bind 没有权限进入的情况,请修改文件夹的权限设置。

确认无报错时(未exit),执行以下命令:

复制配置:

docker cp <your_bind9_container>:/etc/bind .
mv bind/* config/

停止容器:

docker-compose down

提示

如果你是在另一个终端跑bind9容器的,请在该终端停止容器并执行以上命令

创建域名

创建域名

  1. 打开配置文件:
vim ./config/named.conf.local
  1. 在文件末尾添加以下内容(这个是创建域名)
zone "youdomain.xyz" {
  type master;
  file "/etc/bind/zones/db.youdomain.xyz";
};
  1. 创建文件夹
mkdir ./config/zones
  1. 创建文件:
vim ./config/zones/db.youdomain.xyz
  1. 添加以下内容
$TTL 86400
@   IN  SOA ns.youdomain.xyz. admin.youdomain.xyz. (
            2023111301
            604800
            86400
            2419200
            604800
)

@       IN  NS  ns.youdomain.xyz. ;

ns      IN  A   192.168.1.200
@       IN  A   192.168.2.131
www     IN  A   192.168.2.131
test    IN  A   192.168.2.131

自定义标题

在这一行

@       IN  NS  ns.lexonsite.xyz. ;

末尾的分号千万不要漏掉。 然后这一行:

ns      IN  A   192.168.1.200

指向的是解析这个域名的dns服务器的地址

  1. 保存之后执行(检查语法错误):
named-checkzone config/zones/db.youdomain.xyz

这一步是用于检查语法是否有错误,如果出现xxx cannot resolve之类的错误可以先忽略,等运行之后查看是否成功。

注意

配置完成时注意一下字符转义的问题,配置出现错误大概率是这个的问题。

第二次执行

  1. 打开docker-compose文件
vim docker-compose.yml
  1. 解除之前的注释行:
- ./data:/var/cache/bind 
  1. 启动服务
docker-compose up

测试

请在另一台PC上执行(这台PC与dns服务在同一局域网):

nslookup youdomain.xyz 192.168.1.200

出现

Server:         192.168.1.200
Address:        192.168.1.200#53

Name:   youdomain.xyz
Address: 192.168.2.131

即为成功。或者运行:

dig @192.168.1.200 youdomain.xyz

出现:

; <<>> DiG 9.18.26 <<>> @192.168.1.200 lexonsite.xyz
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 55971
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 0, ADDITIONAL: 1

中的status: NOERRORANSWER: 1表明成功。

补充

  1. 如果测试时无法解析到域名,并且输出没有错误,请看检查语法错误对配置文件进行语法检查,然后再检查域名是否与测试的一致,然后通过:
docker-compose down

将容器删除后重新运行,再重新测试。 2. 当配置完成之后,可以直接将其ip设置到使用的PC上,优先级最高,注意,一定要同一局域网内。 3. 可对其设置上游dns服务器以扩展解析,如何设置: 1. 打开文件: ``` bash vim ./config/named.conf.options

	2. 在`options`添加以下内容
	``` bash
	forwarders {
    1.1.1.1;
    8.8.8.8;
    8.8.4.4;
    114.114.114.114;
  };
3. 重启服务 
上次编辑于:
贡献者: Lexon