一、安装bind主从

1.0 环境介绍

HostName IP ADDR 部署服务
dns-master 192.168.99.253 Bind9-master、mysql、bindpod
dns-slave 192.168.99.254 Bind9-slave

1.1 配置dns-master服务器

设置主机名

1
2
3
4
5
$ cat > /etc/hostname <<EOF
dns-master
EOF

$ hostnamectl set-hostname dns-master && bash

安装bind9服务

1
yum install -y bind*

获取rndc的key

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ rndc-confgen					# 获取第一个key配置
# Start of rndc.conf
# 将下面key配置文件复制到/etc/named.conf
key "rndc-key" {
algorithm hmac-md5;
secret "d+tLRbCXGROJbK/c9sllfg==";
};


$ cd /var/named/
$ dnssec-keygen -a HMAC-MD5 -b 128 -n USER bindpod
Kbindpod.+157+18906
$ chown named.named Kbindpod.*
$ cat Kbindpod.+157+18906.key
bindpod. IN KEY 0 3 157 QKBQhGexWw9O2TeCLfE+Cw== # 将此key记录下来,和上面一样写入到named.conf配置文件

修改named配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
$ vim /etc/named.conf
// 第一次生成的key配置
key "rndc-key" {
algorithm hmac-md5;
secret "d+tLRbCXGROJbK/c9sllfg==";
};


// 第二次生成的key内容
key "bindpod" {
algorithm hmac-md5;
secret "QKBQhGexWw9O2TeCLfE+Cw==";
};

// 定义slave的列表和内网允许查询的列表
acl corpnets { 10.0.0.0/8; 172.16.0.0/12; 192.168.0.0/16; 127.0.0.0/8; };
acl slavesList { 192.168.99.254/32; };

options {
listen-on port 53 { any; };
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
recursing-file "/var/named/data/named.recursing";
secroots-file "/var/named/data/named.secroots";
// 仅允许定义的网段进行dns查询
allow-query { corpnets; };
// 必须设置,不然解析外部dns很慢
allow-query-cache { any; };

// 是否递归查询
recursion yes;
// 转发查询配置
forward first;
forwarders { 114.114.114.114; 8.8.8.8; };
allow-update { key bindpod; };

// slave 传输配置
allow-transfer { slavesList; };
// 解析记录更新, 要通知的slave地址
also-notify { 192.168.99.254; };

// 是否支持DNSSEC开关,默认为yes。 开启后forward容易不生效
dnssec-enable no;
// 是否进行DNSSEC确认开关,默认为no
dnssec-validation no;
auth-nxdomain no;

/* Path to ISC DLV key */
bindkeys-file "/etc/named.root.key";

managed-keys-directory "/var/named/dynamic";

pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
};

logging {
// 默认日志
channel default_debug {
file "data/named.run";
severity dynamic;
};

// 查询日志
channel query_log {
file "query.log" versions 3 size 1024m;
severity info;
print-time yes;
print-severity yes;
print-category yes;
};
category queries {
query_log;
};
};

zone "." IN {
type hint;
file "named.ca";
};

include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";

添加域名区域配置

1
2
3
4
5
6
$ vim /etc/named.rfc1912.zones
zone "putianhui-local.com" IN {
type master;
file "putianhui-local.com.zone";
allow-update { key bindpod; };
};

添加域名区域解析配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
$ cd /var/named/
# 从模板复制一个域名配置文件,文件名称和区域配置中file一致
$ cp named.localhost putianhui-local.com.zone
# 修改权限,不然报错
$ chown named putianhui-local.com.zone


# 新增域名区域文件
$ vim putianhui-local.com.zone

$TTL 1D
@ IN SOA putianhui-local.com. admin.putianhui-local.com. (
0 ; serial
1D ; refresh
1H ; retry
1W ; expire
3H ) ; minimum
NS ns1.putianhui-local.com.
NS ns2.putianhui-local.com.
ns1 A 192.168.99.253
ns2 A 192.168.99.254

区域解析文件参数介绍

1
2
3
4
5
6
7
8
9
10
11
12
13
14
$TTL 1D	#生存周期为1天
@ IN SOA nnv5.cn. admin.nnv5.cn. (
#授权信息 #区域地址 #域管理员邮箱地址(不要用@)
0 ; serial #更新序列号
1D ; refresh #更新时间
1H ; retry #重试延时
1W ; expire #失效时间
3H ) ; minimum #无效解析记录缓存时间
NS ns.nnv5.cn. #域名服务器记录
ns A 192.168.2.223 #dns服务器地址记录(ns.nnv5.cn.对应的ip地址)
MX 10 mail.nnv5.cn. #邮箱交换记录
mail A 192.168.2.100 #地址记录(mail.nnv5.cn.对应的ip地址)
www A 192.168.2.66 #地址记录(www.nnv5.cn.对应的ip地址)
bbs A 192.168.2.54 #地址记录(bbs.nnv5.cn.对应的ip地址)

重启named服务并加入开机自启动

1
systemctl enable named && systemctl restart named

客户端dns设置自建dns服务器地址,验证解析是否生效。

1.2 配置dns-slave服务器

设置主机名

1
2
3
4
5
$ cat > /etc/hostname <<EOF
dns-slave
EOF

$ hostnamectl set-hostname dns-slave && bash

安装bind9服务

1
yum install -y bind*

修改named配置文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
$ vim /etc/named.conf
// dns-master第一次生成的key配置
key "rndc-key" {
algorithm hmac-md5;
secret "d+tLRbCXGROJbK/c9sllfg==";
};


// dns-master第二次生成的key内容
key "bindpod" {
algorithm hmac-md5;
secret "QKBQhGexWw9O2TeCLfE+Cw==";
};

// 定义master的列表和内网允许查询的列表
acl corpnets { 10.0.0.0/8; 172.16.0.0/12; 192.168.0.0/16; 127.0.0.0/8; };
acl mastersList { 192.168.99.253/32; };

options {
listen-on port 53 { any; };
directory "/var/named";
dump-file "/var/named/data/cache_dump.db";
statistics-file "/var/named/data/named_stats.txt";
memstatistics-file "/var/named/data/named_mem_stats.txt";
recursing-file "/var/named/data/named.recursing";
secroots-file "/var/named/data/named.secroots";
// 仅允许定义的网段进行dns查询
allow-query { corpnets; };
// 必须设置,不然解析外部dns很慢
allow-query-cache { any; };

// 是否递归查询
recursion yes;
// 转发查询配置
forward first;
forwarders { 114.114.114.114; 8.8.8.8; };
allow-update { key bindpod; };

// master的列表
allow-notify { mastersList; };

// 是否支持DNSSEC开关,默认为yes。 开启后forward容易不生效
dnssec-enable no;
// 是否进行DNSSEC确认开关,默认为no
dnssec-validation no;
auth-nxdomain no;

/* Path to ISC DLV key */
bindkeys-file "/etc/named.root.key";

managed-keys-directory "/var/named/dynamic";

pid-file "/run/named/named.pid";
session-keyfile "/run/named/session.key";
};

logging {
// 默认日志
channel default_debug {
file "data/named.run";
severity dynamic;
};

// 查询日志
channel query_log {
file "query.log" versions 3 size 1024m;
severity info;
print-time yes;
print-severity yes;
print-category yes;
};
category queries {
query_log;
};
};

zone "." IN {
type hint;
file "named.ca";
};

include "/etc/named.rfc1912.zones";
include "/etc/named.root.key";

添加域名区域配置

1
2
3
4
5
6
$ vim /etc/named.rfc1912.zones
zone "putianhui-local.com" IN {
type slave;
masters { 192.168.99.253; };
file "slaves/putianhui-local.com.zone";
};

重启named服务并加入开机自启动

1
systemctl enable named && systemctl restart named

客户端dns设置自建dns-slave服务器地址,验证解析是否生效。

1.3 验证主从是否同步

修改dns-master下面的/var/named/putianhui-local.com.zone文件中新添加一条A记录 ,然后重启master-dns的named服务,客户端只指定dns-slave的地址,通过域名解析新增加的A记录,如果成功解析代表同步成功。

二、安装bindpod前后端

bindpod前端项目地址:https://github.com/xiaoxin1992/bindpod-web

bindpod后端项目地址:https://github.com/xiaoxin1992/bind-pod

我这里bindpod管理ui是安装在dns-master机器上,所以以下操作都在dns-master上操作

2.0 安装mysql

1
2
3
4
5
6
$ curl https://www.putianhui.cn/package/script/install_mysql57.sh | bash

# 出现以下内容即mysql安装成功
查看密码命令:grep 'temporary password' /var/log/mysqld.log'
请使用命令登录:mysql -uroot -p
alter user 'root'@'localhost' identified by 'Test123!@#';

修改mysql默认密码

1
2
3
4
5
6
7
8
9
10
11
12
# 查看mysql初始密码
$ grep 'temporary password' /var/log/mysqld.log
2021-11-11T07:27:34.519820Z 1 [Note] A temporary password is generated for root@localhost: eXqssz132p!z # eXqssz132p!z就是初始密码

# 使用默认密码登录mysql
$ mysql -uroot -p
Enter password: eXqssz132p!z

# 修改密码并刷新权限,新密码修改为'XXXXXXX'
alter user 'root'@'localhost' identified by 'XXXXXXX';
grant all on *.* to 'root'@'%' identified by 'XXXXXXX';
flush privileges;

创建bindpod使用的mysql数据库

1
2
3
$ mysql -uroot -p
mysql> CREATE DATABASE `bindpod` CHARACTER SET utf8 COLLATE utf8_general_ci;
mysql> show databases;

2.1 部署bindpod后端

安装python3和nginx服务

1
$ yum -y install git gcc gcc-c++ python3-devel python3 python3-pip python3-setuptools python3-libs nginx

克隆源代码到服务器本地/data目录下

1
2
$ mkdir /data	&& cd /data
$ git clone https://github.com/xiaoxin1992/bind-pod.git && cd bind-pod

安装python依赖包

1
$ pip3 install -i http://mirrors.aliyun.com/pypi/simple/ --trusted-host mirrors.aliyun.com -r requirements.txt

配置后端数据库信息及rndc信息

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
$ vim config/bindpod.json
{
"dns": {
"server": "127.0.0.1", // dns服务器地址,rndc配置可以通过named控制允许访问的IP地址
"port": 53, // dns端口号
"key": "bindpod", // named.conf配置的第二次生成key的名称
"secret": "QKBQhGexWw9O2TeCLfE+Cw==" // named.conf配置的第二次生成key的内容
},
"database": {
"sqlite": {
"default": {
"ENGINE": "django.db.backends.sqlite3",
"NAME": "./db.sqlite3"
}
},
"mysql": { // 配置使用的mysql信息
"default": {
"ENGINE": "django.db.backends.mysql",
"NAME": "bindpod",
"USER": "root",
"PASSWORD": "XXXXXXX",
"HOST": "127.0.0.1",
"PORT": "3306",
"OPTIONS": {
"init_command": "SET sql_mode='STRICT_TRANS_TABLES'"
}
}
},
"select": "mysql" // 这里选择使用mysql为后端数据存储
}
}

生成数据库表及基础数据

1
2
3
4
5
6
7
8
9
10
11
12
13
# 生成数据库表
$ python3 manage.py makemigrations
# 生成表报错内容:django.core.exceptions.ImproperlyConfigured: Error loading MySQLdb module.
# Did you install mysqlclient?
# 解决办法
$ pip3 install pymysql
$ vim BindPod/__init__.py
import pymysql
pymysql.install_as_MySQLdb()
# 重新执行 python3 manage.py makemigrations生成表信息

# 生成基础数据
$ python3 manage.py migrate

创建初始的管理员账号

1
2
3
4
5
6
$ python3 manage.py createsuperuser
用户名 (leave blank to use 'root'): admin
电子邮件地址: admin@zxkw.com.cn
Password: # 密码
Password (again): # 确认密码
Superuser created successfully.

将bindpod服务注册到systemd托管

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ cat > /usr/lib/systemd/system/bindpod.service <<EOF
[Unit]
Description=bindpod
After=network.target

[Service]
User=root
Group=root
ExecStart=/usr/bin/python3 /data/bind-pod/manage.py runserver 0.0.0.0:8000
ExecReload=/bin/kill -SIGHUP $MAINPID
ExecStop=/bin/kill -SIGINT $MAINPID

[Install]
WantedBy=multi-user.target
EOF

# 启动服务
$ systemctl daemon-reload && systemctl start bindpod && systemctl status bindpod

2.2 部署bindpod前端

安装基础服务软件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
# 安装nginx和yarn
$ curl --silent --location https://dl.yarnpkg.com/rpm/yarn.repo | sudo tee /etc/yum.repos.d/yarn.repo
$ yum install -y nginx yarn
$ yarn -v && nginx -v
1.22.15
nginx version: nginx/1.20.1

# 安装node-npm
$ wget https://nodejs.org/download/release/v10.18.1/node-v10.18.1-linux-x64.tar.gz && tar xzvf node-v10.18.1-linux-x64.tar.gz && mv node-v10.18.1-linux-x64 /usr/local/node-v10.18.1 && chown root:root -R /usr/local/node-v10.18.1/

$ cat >> /etc/profile <<EOF
# NodeJs环境变量
export NODE_HOME=/usr/local/node-v10.18.1
export PATH=\$NODE_HOME/bin:\$PATH
EOF

$ node -v && npm -v
v10.18.1
6.13.4

克隆源代码到服务器本地/data目录下

1
2
$ cd /data
$ git clone https://github.com/xiaoxin1992/bindpod-web.git && cd bindpod-web

安装node依赖包

1
2
3
$ yarn install
$ echo $?
0

修改前端使用的后端接口地址并yarn打包

1
2
3
4
5
6
7
8
9
10
11
12
$ vim config.js
const config = {
api: "http://192.168.99.253:8000", # 后端的接口地址
timeout: 3000
}

export default config

$ yarn build

# 切换至构建后目录
$ cd dist/ && ls

将nginx默认页面删除,把构建后的bindpod前端页面复制到nginx根目录下

1
2
3
4
5
6
# 删除nginx默认页面
$ rm -rf /usr/share/nginx/html/*
$ cp -rf ./* /usr/share/nginx/html/

# 启动nginx服务
$ systemctl start nginx && systemctl enable nginx

通过浏览器访问http://192.168.99.253登录到前端页面,账号密码为部署后端时初始化设置的账号密码。

三、添加域名到bindpod

浏览器访问http://192.168.99.253登录到前端页面

域名管理–>添加域名–>输入域名及dns-master下域名对应的区域文件路径–>立即创建

注意:添加CNAME记录时解析地址要以’.’点结尾。