DNS需求
最近甲方项目中有一个需求点需要DNS服务配合,项目要求该DNS系统能让用户自行操作记录,并允许用户通过命令自行修改DNS记录。
领导把这个任务交给我了一个什么还不懂的小白,怎么办?
于是我和我们team的其他同事开始了在网上找一些开源系统,测试几个开源DNS(如bind、powerdns、MyDNS、MaraDNS),它们都非常不错,但并不能直接满足项目要求,需进行二次开发。为节省人力成本,我们并不想针对DNS投入开发成本。通过一位深资运维朋友介绍了一款bind-webadmin的软件,经测试非常适合我们项目要求,bind-webadmin是基于bind9而开发的web管理系统,可快速创建一台动态DNS系统。该软件的作者也非常不错,我在测试中遇到问题时给他发邮件时回复很及时,解答很有耐心,相当给力~~~。
bind-webadmin的官网
https://bind-webadmin.com
bind-webadmin的demo
https://mm-dns.com
废话少说,参照bind webadmin
官网开始我的测试,哈~
安装
在安装前,需配置好docker环境。
# wget https://bind-webadmin.com/dw/bind-webadmin.v0.1.tar.gz
# tar zxvf bind-webadmin.v0.1.tar.gz
# cd bind-webadmin.v0.1
# sh install.sh /bindwebadmin # 格式: sh install.sh /install_dir
# 安装目录为 /install_dir
# 书写格式: 以 / 开头,且不能以 / 为结尾
# 例如:
# /abc/123 正确
# /abc/123/ 错误
# 若不写明安装目录,则默认安装目录为 /app , 如下。
# sh install.sh
# tree /bindwebadmin # 安装在 /bindwebadmin 目录。在安装前需保证本宿主中没有该目录。安装过程中会创建该目录。
/bindwebadmin
├── bind # bind9配置文件。容器第一次被创建时,会修改named.conf文件。
│ ├── named.ca
│ ├── named.conf # bind9主配置文件。在容器启动后,若修改此文件,需重启容器。
│ ├── named.empty
│ ├── named.localhost
│ ├── named.loopback
│ ├── named.rfc1912.zones
│ ├── redirect.db
│ ├── rndc.conf
│ └── rndc.key
├── cert # 证书目录
│ ├── dhparams.pem
│ ├── fullchain.pem
│ └── privkey.pem
├── docker-compose.yml # docker compose 配置文件.容器间调用采用的是容器名称,不要更改此文件中的容器名称。
├── env.txt # 主配置文件(环境变量)。供各个容器初始化时统一调用。仅第一次创建容器时生效。
├── mysql/ # mysql数据目录。当容器第一次创建时,该目录会被写入数据库初始化数据。
└── server # 后台配置。当容器第一创建时,系统自动修改app.conf。
├── app.conf # 在容器启动后,若修改此文件,需重启容器。
└── lisence.txt # 授权配置文件
这里的主要配置文件是env.txt
.
测试时我使用的域名是talknow-tech.com
,由于我还没有证书,关闭SSL。
env.txt
修改如下
# 提示
# 各个容器会启动时读取如下值并到更新自己的相应配置中。
# NS_DOMAIN值必须与bind_backend中的配置文件app.conf中的ns变量值相同。
# Note:
# - 此参数为核心配置
# - 此时 NS_DOMAIN 值不能配置为 test.io 和 example.com ,主要原因是这两个域名已被系统默认写入数据库,供 demo 用户测试使用。
# - 支持子域名配置,如 NS_DOMAIN='diy.talknow-tech.com', 但不建议使用。
NS_DOMAIN='talknow-tech.com'
# bind webadmin服务器IP,如下两种情况,二选一。
# 情况一:当配置为公共DNS服务时,将下面的NS_IP改为当前bind webadmin服务器的公网NAT映射IP
# 情况二: 仅配置为私有DNS时,将下面的NS_IP改为当前bind webadmin服务器的私有ip
# 此参数为核心配置
NS_IP=192.168.3.14
# ns域名中的相关A记录值
IP_FRONT_orgin_A=${NS_IP}
IP_FRONT_DNS_A=${NS_IP}
IP_FRONT_WWW_A=${NS_IP}
IP_API_A=${NS_IP}
IP_NS1_A=${NS_IP}
IP_NS2_A=${NS_IP}
# mysql基本配置
MYSQL_HOST=bind_mysql
MYSQL_ROOT_PASSWORD=mysql+888
MYSQL_ALLOW_EMPTY_PASSWORD=no
MYSQL_POST=3306
MYSQL_DB=BindDB
MYSQL_USERNAME=root
MYSQL_USERPWD=mysql+888
# 提示
# 1.MYSQL_POST值必须与mysql容器启动时的配置相同
# 2.MYSQL_HOST值必须与mysql空器的服务名称相同
# 3.当采用root时,MYSQL_USERPWD与MYSQL_ROOT_PASSWORD相同
# 4.采用非root方式,需手工创建帐号
# mysql运行环境(初始化时中文支持)
LANG=C.UTF-8
MYSQL_CHARSET=utf8mb4
MYSQL_COLLATION=utf8mb4_unicode_ci
#后面API接口(不要以/为结尾)
#该值必须与后端接口对外开放的配置保持一致,即接口外部域名和端口
#为外部的api接口。
#API_URL=http://192.168.3.7:9090
#API_URL_SSL=http://192.168.3.7:9090
#若采用本系统的api接口,此值为
# API_URL=http://api.${NS_DOMAIN}
# 若有证书,需配置为
# API_URLs=https://api.${NS_DOMAIN}
#API_URL=http://192.168.3.7:9090
SSL=false
API_URL=http://api.${NS_DOMAIN}
API_URL_SSL=https://api.${NS_DOMAIN}
#----------------------------
#前端参数
ICP=粤ICP备999999号(示例)
OTHERCODE=粤公网安备999999号(示例)
LOGIN_FOOTER_TEXT='Mobile: 130xxxxxxx email: xxxx@qq.com'
#title配置
APP_TITLE=TalkNows
#sider页脚
Footter_line_sider_1=TalkNow
Footter_line_sider_2='测试中'
#普通页面页脚
Footter_line_1='DNS自主系统'
Footter_line_2='by talknow-tech.com'
#前端在产生api Token时为该token配置的TTL
#1年=1000*60*60*24*365*1=31536000000
TTLApiToken=315360000000
#前端所有cookie的TTL值
#1天:60*60*1000*24
TTLCookie=86400000
主要参数如下
- NS_DOMAIN='talknow-tech.com'
- NS_IP=192.168.3.14,当配置为公共DNS服务时,将NS_IP改为当前bind webadmin服务器的公网NAT映射IP。当仅配置为私有DNS时,将的NS_IP改为当前bind webadmin服务器的私有ip
docker compose方式安装
# cd /bindwebadmin
# docker compose up -d
[+] Running 63/31
✔ bind_front 13 layers [⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿] 0B/0B Pulled 24.7s
✔ bind_proxy 18 layers [⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿] 0B/0B Pulled 63.7s
✔ bind_mysql 14 layers [⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿⣿] 0B/0B Pulled 74.5s
✔ bind_backend 5 layers [⣿⣿⣿⣿⣿] 0B/0B Pulled 56.0s
✔ bind9 8 layers [⣿⣿⣿⣿⣿⣿⣿⣿] 0B/0B Pulled 27.0s
[+] Running 6/6
✔ Network app_mynet Created 0.2s
✔ Container app-bind_mysql-1 Started 0.4s
✔ Container app-bind9-1 Started 0.1s
✔ Container app-bind_backend-1 Started 0.0s
✔ Container app-bind_front-1 Started 0.1s
✔ Container app-bind_proxy-1 Started 0.2s
第一次启动需pull镜像,时间久一点。
查看容器启动状态
# docker ps
CONTAINER ID IMAGE COMMAND CREATED STATUS PORTS NAMES
d40d04593625 registry.cn-hangzhou.aliyuncs.com/darry/bind_proxy:v1 "/entrypoint.sh" 3 minutes ago Up 3 minutes 0.0.0.0:80->80/tcp, 22/tcp, 0.0.0.0:443->443/tcp app-bind_proxy-1
696dd06e5b4e registry.cn-hangzhou.aliyuncs.com/darry/bind_front:v1 "/docker-entrypoint.…" 3 minutes ago Up 3 minutes 80/tcp, 0.0.0.0:9091->9091/tcp app-bind_front-1
80eb68220fc3 registry.cn-hangzhou.aliyuncs.com/darry/bind:v1 "docker-entrypoint.sh" 3 minutes ago Up 3 minutes 0.0.0.0:53->53/tcp, 0.0.0.0:53->53/udp, 953/tcp app-bind9-1
133d74406e11 registry.cn-hangzhou.aliyuncs.com/darry/bind_backend:v1 "/entrypoint.sh" 3 minutes ago Up 3 minutes 0.0.0.0:9090->9090/tcp app-bind_backend-1
1e388216d4bd registry.cn-hangzhou.aliyuncs.com/darry/bind_mysql:v1 "docker-entrypoint.s…" 3 minutes ago Up 3 minutes 0.0.0.0:3306->3306/tcp, 33060/tcp app-bind_mysql-1
测试
将测试机中的网络配置中将DNS一项改为当前bind webadmin服务器的IP
C:\Users\Administrator>nslookup
Address: 192.168.3.1
> server 192.168.3.14 # bind webadmin服务器的ip
默认服务器: [192.168.3.14]
Address: 192.168.3.14
> baidu.com
服务器: [192.168.3.14]
Address: 192.168.3.14
非权威应答:
名称: baidu.com
Addresses: 39.156.66.10
110.242.68.66
> dns.talknow-tech.com
服务器: [192.168.3.14]
Address: 192.168.3.14
名称: dns.talknow-tech.com
Address: 192.168.3.14
> talknow-tech.com
服务器: [192.168.3.14]
Address: 192.168.3.14
名称: talknow-tech.com
Address: 192.168.3.14
> api.talknow-tech.com
服务器: [192.168.3.14]
Address: 192.168.3.14
名称: api.talknow-tech.com
Address: 192.168.3.14
>
采用google浏览器,直接打开 http://talknow-tech.com 。
采用默认帐号进入admin/admin1111mm
界面很简洁,没有多余的页面,非常清晰。
注册新用户
注册一个新用户(yanglitu/1@qwWWqqq
)进入,添加域名和记录。
添加域名
添加解析记录
添加解析记录时再配置token(默认的token有效期是10年)
查看解析结果
C:\>nslookup -qt=soa abc.com 192.168.3.14
服务器: UnKnown
Address: 192.168.3.14
abc.com
primary name server = ns1.talknow-tech.com
responsible mail addr = info.abc.com
serial = 2024060100
refresh = 86400 (1 day)
retry = 86400 (1 day)
expire = 86400 (1 day)
default TTL = 86400 (1 day)
C:\>nslookup -qt=a www.abc.com 192.168.3.14
服务器: UnKnown
Address: 192.168.3.14
名称: www.abc.com
Address: 1.1.1.1
解析api token测试
除通过web方式修改解析记录值以外,bind-webadmin还提供了3种方式来修改解析记录值,适应不同场景。
例如json方式
# curl -XPOST "http://talknow-tech.com/updatejson" -d '{
"data":"9.9.9.9",
"token":"5HXUtJTM5Hm2w4fIiB/ViDfgx0OhuYfQWuNrwzKVgCvrv4fz4dxXJpGsCVF0BvYD8+0nVoCtuJX8tYbywP8BhgCrmGHFWxXzOwpxxBLXdvFt0oL9MGj8g1m5mtXC0Llp"
}
'
# 返回
{"info":"ok"}
查看结果
C:\>nslookup -qt=a www.abc.com 192.168.3.14
服务器: UnKnown
Address: 192.168.3.14
名称: www.abc.com
Address: 9.9.9.9
后续
通过体现bind webadmin
的功能,感觉它非常不错,可以很轻松创建一套自己的动态域名系统。
为每一位DNS爱好者提供了一种拥有自己独特DNS系统的可能性。
今天测试到这里吧,下一步将bind-webadmin部署在公网上,创建一套像 https://mm-dns.com 一样的真正的外部DNS系统。
在后续部署中可能还会有其它问题,到时还需要向开发者发邮件请教。