前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Centos搭建powerdns权威dns服务器——安装篇

Centos搭建powerdns权威dns服务器——安装篇

作者头像
山深有杏
发布2024-01-30 14:33:10
1.3K0
发布2024-01-30 14:33:10
举报
文章被收录于专栏:CTF新手教程

由于工作原因,需要给客户搭建权威DNS服务器,在此记录一下。

0x00 什么是DNS服务器

DNS

DNS(Domain Name Service) 域名解析服务,就是将域名和 ip 之间做相应的转换,利用 TCP 和 UDP 的53端口。

DNS系统作用:
  • 正向解析:根据域名查找对应的ip地址
  • 反向解析:根据ip地址查找对应的域名
DNS服务器的分类:
  • 主要名称服务器:存放该区域中相关设置的DNS服务器,其存放的是区域文件的正本数据
  • 辅助名称服务器:从其他服务器中复制数据,数据为副本无法修改
  • 主控名称服务器:提供趋于数据复制的DNS服务器
  • 缓存域名服务器:通过像根或其他服务器查询获得域名到ip的解析关系,将查询结果缓存到本地,提高重复查找速度
域名空间结构
  • 根域(.)
  • 顶级域(顶级域包括组织域和国家/地区顶级域 (net、edu、com、gov、mail、org、cn、uk…. )
    • –组织顶级域 (net、edu、com、gov、mail、org….)
    • –国家/地区顶级域(cn、uk…)
  • 二级域名(baidu、taobao…)
  • 三级域名(www、mail…)
DNS解析过程

客户机访问域名,先查看自己主机的DNS缓存(有时间限制),如果主机DNS缓存有,则直接访问对应ip。

如果主机DNS缓存没有,则查看本地 hosts文件。

如果 hosts 文件没有,则将该请求发送给主机指定的域名服务器。域名服务器收到请求后,先查询本地的缓存,如果有该纪录项,则域名服务器就直接把查询的结果返回。如果指定的域名服务器的缓存中没有该记录,则进行以下迭代查询。

迭代查询

本地域名服务器向根域名服务器查询,根域名服务器告诉它下一步到哪里去查询,然后它在根据结果逐层向下查询,直到得到最终结果。每次它都是以DNS客户机的身份去各个服务器查询,即迭代查询是本地服务器进行的操作。

具体流程描述:

  1. 用户主机A先向本地域名服务器B递归查询abc.exmaple.com
  2. B首先尝试使用本地DNS记录查询abc.exmaple.com,若本地不存在abc.example.com的相关记录,则B以DNS客户机的身份发起迭代查询abc.example.com
  3. B向一个根域名服务器C查询abc.example.com
  4. 根域名服务器C告诉B下一步到.com顶级域名服务器D去查询,并告知D的IP地址1.2.3.4
  5. B向.com顶级域名服务器D进行查询
  6. D告诉本地域名服务器B,下一步请到.example.com权限服务器E去查询,并告知E的IP地址2.3.4.5
  7. B向.example.com权限服务器E进行查询
  8. E告诉本地域名服务器B所查询域名abc.example.com的主机是否存在,并告知其IP地址3.4.5.6
  9. 本地域名服务器B向用户主机A反馈所查询的域名abc.exmaple.com对用的IP地址为3.4.5.6

所以,优先级: 本地DNS缓存 > hosts文件 > DNS服务器

windows中hosts文件存放路径: C:\Windows\System32\drivers\etc\hosts

Linux中hosts文件存放路径: /etc/hosts

各种解析记录

类型

说明

A

主机记录,记录域名对应的ip

PTR

反向地址解析记录,记录ip对应的域名

CNAME

别名记录

MX

邮箱交换记录

NS

服务器记录

SOA

权威记录

TXT

为记录说明

SRV

列出了正在提供特定服务的服务器

AAAA

ipv6地址记录

0x01 Centos安装powerdns+powerdns-admin

PowerDNS文档

1 安装Centos

我这里使用的是CentOS-7-x86_64-Minimal-2003

在官网下载好安装包后直接安装即可,不做过多赘述。

2 关闭防火墙和 selinux
代码语言:javascript
复制
$ setenforce 0
$ sed -i 's/SELINUX=enforcing/SELINUX=disabled/g' /etc/selinux/config
$ systemctl stop firewalld.service && systemctl disable firewalld.service
$ firewall-cmd --state
3 安装 MariaDB
代码语言:javascript
复制
$ yum install -y epel-release yum-plugin-priorities
$ yum install -y mariadb-server mariadb
$ systemctl enable mariadb.service
$ systemctl start mariadb.service
4 设置密码
代码语言:javascript
复制
$ mysql_secure_installation
#回车
y          #设置root密码
#root密码,
#重复root密码,
y          #删除匿名登入
n          #禁用root远程登入
y          #删除test库
y           #刷新权限
5 设置字符集
代码语言:javascript
复制
$ vim /etc/my.cnf
代码语言:javascript
复制
[mysqld]
init_connect='SET collation_connection = utf8_unicode_ci'
init_connect='SET NAMES utf8'
character-set-server=utf8
collation-server=utf8_unicode_ci
skip-character-set-client-handshake
vim /etc/my.cnf.d/client.cnf

[client]
default-character-set=utf8
vim /etc/my.cnf.d/mysql-clients.cnf

[mysql]
default-character-set=utf8
6 重启 MariaDB
代码语言:javascript
复制
$ systemctl restart mariadb.service

再次登录 MariaDB,查看字符集,发现已是 utf8 了。

代码语言:javascript
复制
$ mysql -uroot -p
MariaDB[(none)]> show variables like "%character%";show variables like "%collation%";
MariaDB[(none)]> exit
7 安装 PowerDNS
代码语言:javascript
复制
$ yum install -y pdns pdns-backend-mysql

PowerDNS 的配置文件位于 /etc/pdns/pdns.conf

8 新建数据库
代码语言:javascript
复制
$ mysql -uroot -p
MariaDB[(none)]> CREATE DATABASE powerdns;
MariaDB[(none)]> GRANT ALL ON powerdns.* TO 'powerdns'@'localhost' IDENTIFIED BY 'powerdns';
MariaDB[(none)]> FLUSH PRIVILEGES;
9 创建数据表
代码语言:javascript
复制
MariaDB[(none)]> use powerdns;
代码语言:javascript
复制
CREATE TABLE domains (
  id                    INT AUTO_INCREMENT,
  name                  VARCHAR(255) NOT NULL,
  master                VARCHAR(128) DEFAULT NULL,
  last_check            INT DEFAULT NULL,
  type                  VARCHAR(6) NOT NULL,
  notified_serial       INT DEFAULT NULL,
  account               VARCHAR(40) DEFAULT NULL,
  PRIMARY KEY (id)
) Engine=InnoDB;

CREATE UNIQUE INDEX name_index ON domains(name);

CREATE TABLE records (
  id                    BIGINT AUTO_INCREMENT,
  domain_id             INT DEFAULT NULL,
  name                  VARCHAR(255) DEFAULT NULL,
  type                  VARCHAR(10) DEFAULT NULL,
  content               VARCHAR(64000) DEFAULT NULL,
  ttl                   INT DEFAULT NULL,
  prio                  INT DEFAULT NULL,
  change_date           INT DEFAULT NULL,
  disabled              TINYINT(1) DEFAULT 0,
  ordername             VARCHAR(255) BINARY DEFAULT NULL,
  auth                  TINYINT(1) DEFAULT 1,
  PRIMARY KEY (id)
) Engine=InnoDB;

CREATE INDEX nametype_index ON records(name,type);
CREATE INDEX domain_id ON records(domain_id);
CREATE INDEX recordorder ON records (domain_id, ordername);

CREATE TABLE supermasters (
  ip                    VARCHAR(64) NOT NULL,
  nameserver            VARCHAR(255) NOT NULL,
  account               VARCHAR(40) NOT NULL,
  PRIMARY KEY (ip, nameserver)
) Engine=InnoDB;

CREATE TABLE comments (
  id                    INT AUTO_INCREMENT,
  domain_id             INT NOT NULL,
  name                  VARCHAR(255) NOT NULL,
  type                  VARCHAR(10) NOT NULL,
  modified_at           INT NOT NULL,
  account               VARCHAR(40) NOT NULL,
  comment               VARCHAR(64000) NOT NULL,
  PRIMARY KEY (id)
) Engine=InnoDB;

CREATE INDEX comments_domain_id_idx ON comments (domain_id);
CREATE INDEX comments_name_type_idx ON comments (name, type);
CREATE INDEX comments_order_idx ON comments (domain_id, modified_at);

CREATE TABLE domainmetadata (
  id                    INT AUTO_INCREMENT,
  domain_id             INT NOT NULL,
  kind                  VARCHAR(32),
  content               TEXT,
  PRIMARY KEY (id)
) Engine=InnoDB;

CREATE INDEX domainmetadata_idx ON domainmetadata (domain_id, kind);

CREATE TABLE cryptokeys (
  id                    INT AUTO_INCREMENT,
  domain_id             INT NOT NULL,
  flags                 INT NOT NULL,
  active                BOOL,
  content               TEXT,
  PRIMARY KEY(id)
) Engine=InnoDB;

CREATE INDEX domainidindex ON cryptokeys(domain_id);

CREATE TABLE tsigkeys (
  id                    INT AUTO_INCREMENT,
  name                  VARCHAR(255),
  algorithm             VARCHAR(50),
  secret                VARCHAR(255),
  PRIMARY KEY (id)
) Engine=InnoDB;

CREATE UNIQUE INDEX namealgoindex ON tsigkeys(name, algorithm);
代码语言:javascript
复制
MariaDB[powerdns]> flush privileges;
MariaDB[powerdns]> show databases;
MariaDB[powerdns]> show tables;
MariaDB[powerdns]> exit
10 配置PowerDNS
代码语言:javascript
复制
$ cp /etc/pdns/pdns.conf /etc/pdns/pdns.conf.bak
$ vim /etc/pdns/pdns.conf
代码语言:javascript
复制
# backend 
launch=gmysql
gmysql-host=localhost
gmysql-port=3306
gmysql-dbname=powerdns
gmysql-user=powerdns
gmysql-password=powerdns

# pdns API
webserver=yes
webserver-address=0.0.0.0
webserver-allow-from=0.0.0.0/0
webserver-port=8081
api=yes
api-key=wmqpdns
api-logfile=/var/log/pdns-api.log
11 设置开机启动
代码语言:javascript
复制
$ systemctl enable pdns.service
$ systemctl start pdns.service
$ systemctl status pdns.service

查看8081、53两个端口

代码语言:javascript
复制
$ netstat -tulnp|grep pdns_server
代码语言:javascript
复制
tcp 0 0 0.0.0.0:8081 0.0.0.0:* LISTEN 9712/pdns_server 
tcp 0 0 0.0.0.0:53 0.0.0.0:* LISTEN 9712/pdns_server 
tcp6 0 0 :::53 :::* LISTEN 9712/pdns_server 
udp 0 0 0.0.0.0:53 0.0.0.0:* 9712/pdns_server 
udp6 0 0 :::53 :::* 9712/pdns_server
12 安装python3.6 + pip
代码语言:javascript
复制
$ yum install -y epel-release
$ yum install -y https://repo.ius.io/ius-release-el7.rpm
$ yum install -y python36u python36u-devel python36u-pip
$ pip3.6 install -U pip
$ pip install -U virtualenv
$ rm -f /usr/bin/python3 && ln -s /usr/bin/python3.6 /usr/bin/python3
13 安装构建python库所需包
代码语言:javascript
复制
$ yum install -y gcc mariadb-devel openldap-devel xmlsec1-devel xmlsec1-openssl libtool-ltdl-devel
14 安装 Nodejs 10
代码语言:javascript
复制
$ curl -sL https://rpm.nodesource.com/setup_10.x | bash -
$ curl -sL https://dl.yarnpkg.com/rpm/yarn.repo -o /etc/yum.repos.d/yarn.repo
$ yum install -y yarn
15 创建python3 virtualenv环境
代码语言:javascript
复制
$ yum install -y git
$ git clone https://github.com/ngoduykhanh/PowerDNS-Admin.git /opt/web/powerdns-admin
$ cd /opt/web/powerdns-admin
$ virtualenv -p python3 flask

激活 python3 环境并安装python库(后续操作都是基于python3 环境下操作)

代码语言:javascript
复制
$ source ./flask/bin/activate
(flask)$ pip install python-dotenv
(flask)$ pip install -r requirements.txt

下载的包临时存放在 /root/.cache/pip/wheels 目录下。

16 创建数据库
代码语言:javascript
复制
(flask)$ mysql -u root -p
MariaDB[(none)]> CREATE DATABASE powerdnsadmin CHARACTER SET utf8 COLLATE utf8_general_ci;
MariaDB[(none)]> GRANT ALL PRIVILEGES ON powerdnsadmin.* TO 'pdnsadminuser'@'%' IDENTIFIED BY 'p4ssw0rd';
MariaDB[(none)]> FLUSH PRIVILEGES;
MariaDB[(none)]> exit
17 配置 config.py
代码语言:javascript
复制
(flask)$ vim ./powerdnsadmin/default_config.py
代码语言:javascript
复制
#地址改成0.0.0.0
BIND_ADDRESS = '0.0.0.0'
# 配置数据库连接信息,库/用户/密码是之前手动创建的,不是pdns数据库
SQLA_DB_USER = 'pdnsadminuser'
SQLA_DB_PASSWORD = 'p4ssw0rd'
SQLA_DB_HOST = 'localhost'
SQLA_DB_NAME = 'powerdnsadmin'
# 开启MySQL
# DATABASE - MySQL
SQLALCHEMY_DATABASE_URI = 'mysql://'+SQLA_DB_USER+':'+SQLA_DB_PASSWORD+'@'+SQLA_DB_HOST+':'+str(SQLA_DB_PORT)+'/'+SQLA_DB_NAME
# 注释sqlite
# DATABASE - SQLite
# SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'pdns.db')
18 创建表并创建资产文件
代码语言:javascript
复制
(flask)$ export FLASK_APP=./powerdnsadmin/__init__.py
(flask)$ flask db upgrade

创建资产文件

代码语言:javascript
复制
(flask)$ yarn install --pure-lockfile
(flask)$ flask assets build
19 启动
代码语言:javascript
复制
(flask)$ ./run.py

访问PowerDNS-Admin Web界面:http://IP:9191

1、先注册用户,第一个用户将处于管理员角色。

2、第一次登录时,将被重定向到设置页面以配置PDNS API信息。

代码语言:javascript
复制
PDNS API URL:http://IP:8081
PDNS API KEY:wmqpdns
20 配置systemd服务

使用systemd管理PowerDNS-Admin

代码语言:javascript
复制
$ vim /root/pdns.sh
代码语言:javascript
复制
#!/bin/bash
# THIS FILE IS ADDED FOR COMPATIBILITY PURPOSES
#
# It is highly advisable to create own systemd services or udev rules
# to run scripts during boot instead of using this file.
#
# In contrast to previous versions due to parallel execution during boot
# this script will NOT be run after all other services.
#
# Please note that you must run 'chmod +x /etc/rc.d/rc.local' to ensure
# that this script will be executed during boot.

source /opt/web/powerdns-admin/flask/bin/activate; nohup /opt/web/powerdns-admin/run.py &
代码语言:javascript
复制
$ vim /usr/lib/systemd/system/powerdns-admin.service
代码语言:javascript
复制
[Unit]
Description=Pdns-admin Service
After=mariadb.service

[Service]
Type=forking
ExecStart=/root/pdns.sh
KillMode=process

[Install]
WantedBy=multi-user.target

启动Powerdns-Admin服务并将其设置为在启动时启动:

代码语言:javascript
复制
$ systemctl daemon-reload
$ systemctl start powerdns-admin.service
$ systemctl enable powerdns-admin.service

可以运行systemctl status powerdns-admin.service命令确认状态是否正在运行,没问题的话会返回相关的成功信息。

代码语言:javascript
复制
$ systemctl status powerdns-admin.service

0x02 参考链接

PowerDNS+PowerAdmin

Linux中搭建DNS服务器

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 0x00 什么是DNS服务器
    • DNS
      • DNS系统作用:
        • DNS服务器的分类:
          • 域名空间结构
            • DNS解析过程
              • 迭代查询
                • 各种解析记录
                • 0x01 Centos安装powerdns+powerdns-admin
                  • 1 安装Centos
                    • 2 关闭防火墙和 selinux
                      • 3 安装 MariaDB
                        • 4 设置密码
                          • 5 设置字符集
                            • 6 重启 MariaDB
                              • 7 安装 PowerDNS
                                • 8 新建数据库
                                  • 9 创建数据表
                                    • 10 配置PowerDNS
                                      • 11 设置开机启动
                                        • 12 安装python3.6 + pip
                                          • 13 安装构建python库所需包
                                            • 14 安装 Nodejs 10
                                              • 15 创建python3 virtualenv环境
                                                • 16 创建数据库
                                                  • 17 配置 config.py
                                                    • 18 创建表并创建资产文件
                                                      • 19 启动
                                                        • 20 配置systemd服务
                                                        • 0x02 参考链接
                                                        相关产品与服务
                                                        云数据库 MariaDB
                                                        腾讯云数据库 MariaDB(TencentDB for MariaDB) 让您轻松在云端部署、使用 MariaDB 数据库。MariaDB 是在 MySQL 版权被 Oracle 收购后,由 MySQL 创始人 Monty 创立,其版权授予了“MariaDB基金会(非营利性组织)”以保证 MariaDB 永远开源,良好的开源策略,是企业级应用的最优选择,主流开源社区系统/软件的数据库系统,均已默认配置 MariaDB。
                                                        领券
                                                        问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档