基于bind9建立本地dns服务(docker)
基于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容器的,请在该终端停止容器并执行以上命令
创建域名
创建域名
- 打开配置文件:
vim ./config/named.conf.local
- 在文件末尾添加以下内容(这个是创建域名)
zone "youdomain.xyz" {
type master;
file "/etc/bind/zones/db.youdomain.xyz";
};
- 创建文件夹
mkdir ./config/zones
- 创建文件:
vim ./config/zones/db.youdomain.xyz
- 添加以下内容
$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服务器的地址
- 保存之后执行(检查语法错误):
named-checkzone config/zones/db.youdomain.xyz
这一步是用于检查语法是否有错误,如果出现xxx cannot resolve之类的错误可以先忽略,等运行之后查看是否成功。
注意
配置完成时注意一下字符转义的问题,配置出现错误大概率是这个的问题。
第二次执行
- 打开
docker-compose文件
vim docker-compose.yml
- 解除之前的注释行:
- ./data:/var/cache/bind
- 启动服务
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: NOERROR和ANSWER: 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. 重启服务