使用PowerDNS实现内网DNS解析_powerdns-admin-CSDN博客
https://www.cnblogs.com/guangdelw/p/17348982.html
一、概念介绍
PowerDNS是一个域名解析服务,官网提供了三个组件:Authoritative、Recursor、dnsdist,分别用来作为权威服务器、域名递归解析、dns服务负载均衡来提供dns服务,每个服务独立存在,可按需部署。PowerDNS域名区域数据不再使用bind格式文件存储,而直接使用后端连接MySQL数据库,所有记录都存储在数据库中。
- Authoritative:作为权威服务器使用,仅提供域名解析服务,数据来源于配置文件指定的后端,若后端不存在或者宕机解析不可用,没有递归作用。它也支持普通bind区域解析文件,同时也支持数据库解析记录,包括但不限于 MySQL、PostgreSQL、SQLite3、Microsoft SQL Server、LDAP、纯文本文件和许多其他通过 ODBC 的 SQL 数据库。 数据库的主从复制(replication)也是支持的。
- Recursor:被人称为缓存服务器,用于进行域名的递归解析, 用于递归查询服务。
- dnsdist:也被称为- DNS分发器或- DNS负载均衡器,用于进行DNS服务负载均衡。它本身并不提供解析服务,而是将DNS流量路由到指定服务器,为用户提供最佳解析性能,同时也可实现应用流量分摊。
- PowerDNS-Admin: PowerDNS-Admin提供一套解决方案,支持Web UI调用API管理域名CUDR;支持域名权限控制和子域委托;支持SAML / LDAP / Active Directory 用户认证等等。PowerDNS-Admin也需要单独一个实例数据库,存储PowerDNS-Admin相关数据,如用户名和密码以及PowerDNS-Admin相关的格式数据。
二、部署环境
公司内部安装powerdns实现局域网服务dns解析,避免通过ip访问。
系统: CentOS 7.9
mysql版本: 5.7.33
pdns版本: 4.4.1
pdns-recursor版本: 4.4.2
PowerDNS-admin版本: 0.2.3
DNS服务器主机: 10.x.x.109
测试服务器ip: 10.y.y.195
2.1 安装mysql
docker network create mysql
mkdir /data/mysql/data -p使用docker方式安装mysql,docker-compose.yml如下所示:
---
version: '3.7'
services:
  mysql:
    hostname: mysql
    container_name: mysql
    restart: always
    image: mysql:5.7.33
    ports:
      - 3306:3306
    command: [
      '--default-authentication-plugin=mysql_native_password',
      '--max_connections=5000',
      '--expire_logs_days=5',
      '--character-set-server=utf8mb4',
      '--collation-server=utf8mb4_unicode_ci',
      '--slow_query_log=on',
      '--long_query_time=2',
      '--slow_query_log_file=/var/lib/mysql/slow_query.log'
    ]
    environment:
      MYSQL_DATABASE: powerdns
      MYSQL_ROOT_PASSWORD: XpWxxxxx0WmE
      MYSQL_USER: normal
      MYSQL_PASSWORD: 2GVoxxxxxtUsI5y
    volumes:
      - /data/mysql/data:/var/lib/mysql
      - /usr/share/zoneinfo/Asia/Shanghai:/etc/localtime:ro
      - ./my.cnf:/etc/mysql/my.cnf
    networks:
      - mysql
networks:
  mysql:
    #external: true
    driver: bridge
mysql配置my.cnf如下:
[mysqld]
pid-file        = /var/run/mysqld/mysqld.pid
socket          = /var/run/mysqld/mysqld.sock
datadir         = /var/lib/mysql
secure-file-priv= NULL
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0
sql_mode=STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_ENGINE_SUBSTITUTION
slow_query_log = on
long_query_time = 2
slow_query_log_file = /var/lib/mysql/slow_query.log
log_queries_not_using_indexes = ON
max_connections = 4000
skip-name-resolve
#lower_case_table_names = 1
# Custom config should go here
!includedir /etc/mysql/conf.d/
2.3 安装pdns及pdns连接mysql插件
2.3.1 pdns安装
yum install epel-release yum-plugin-priorities
# 安装4.4版本pdns
curl -o /etc/yum.repos.d/powerdns-auth-44.repo https://repo.powerdns.com/repo-files/centos-auth-44.repo 
yum makecache fast
# 这里以mysql作为后端存储服务,所以这里安装的是pdns-backend-mysql
yum install pdns.x86_64 pdns-backend-mysql.x86_64 -y
# ================== 安装4.6版本,参考 ================= #
curl -o /etc/yum.repos.d/powerdns-auth-46.repo https://repo.powerdns.com/repo-files/el-auth-46.repo 
# 参考
# 其它版本列表:
https://repo.powerdns.com/repo-files/
# eg:
https://repo.powerdns.com/repo-files/centos-auth-45.repo2.3.2 pdns.conf配置
 
  vi /etc/pdns/pdns.conf
#设置数据库相关的
launch=gmysql
gmysql-host=10.0.0.10
gmysql-port=3306
gmysql-dbname=powerdns
#管理数据库的相关用户和密码
gmysql-user=powerdns
gmysql-password=powerdns
#访问权限
allow-axfr-ips=0.0.0.0/0,::1
allow-dnsupdate-from=0.0.0.0/0,::1
allow-notify-from=0.0.0.0/0,::/0
allow-unsigned-notify=yes
also-notify=10.0.0.10
#daemon 启动
daemon=yes
disable-axfr=no
guardian=no
#是否master
master=yes
#是否slave
slave=no
#启动权限
setgid=pdns
setuid=pdns
#打印日志
log-dns-details=yes
log-dns-queries=no
loglevel=6
log-timestamp=yes
logging-facility=0
#开启api
api=yes
api-key=Qno9k64Vkkkyfz1LtC3klk
#启动webserver 监控
webserver=yes
webserver-address=0.0.0.0
webserver-allow-from=0.0.0.0/0
webserver-port=8081
#监听的地址端口
local-address=0.0.0.0, ::
local-port=54
#记录query 日志
query-logging=yes
# ============================ use ============================== #
vi /etc/pdns/pdns.conf
#设置数据库相关的
launch=gmysql
gmysql-host=192.168.31.153
gmysql-port=3306
gmysql-dbname=powerdns
#管理数据库的相关用户和密码
gmysql-user=root
gmysql-password=XpWxxxxx0WmE
#访问权限
allow-axfr-ips=0.0.0.0/0,::1
allow-dnsupdate-from=0.0.0.0/0,::1
allow-notify-from=0.0.0.0/0,::/0
allow-unsigned-notify=yes
also-notify=10.0.0.10
#daemon 启动
daemon=yes
disable-axfr=no
guardian=no
#是否master
master=yes
#是否slave
slave=no
#启动权限
setgid=pdns
setuid=pdns
#打印日志
log-dns-details=yes
log-dns-queries=no
loglevel=6
log-timestamp=yes
logging-facility=0
#开启api
api=yes
api-key=Qno9k64Vkkkyfz1LtC3klk
#启动webserver 监控
webserver=yes
webserver-address=0.0.0.0
webserver-allow-from=0.0.0.0/0
webserver-port=8081
#监听的地址端口
local-address=0.0.0.0, ::
local-port=54
#记录query 日志
query-logging=yes
2.3.3 初始化数据库:
mysql -h10.x.x.109 -uroot -pXpWxxxxx0WmE -e "use powerdns; source /usr/share/doc/pdns-backend-mysql-4.4.1/schema.mysql.sql;"
# use
$. ll /usr/share/doc/pdns-backend-mysql-4.4.3/schema.mysql.sql
$. docker cp /usr/share/doc/pdns-backend-mysql-4.4.3/schema.mysql.sql mysql:/opt
$. docker exec -it mysql bash
$. mysql -h127.0.0.1 -uroot -pXpWxxxxx0WmE -e "use powerdns; source /opt/schema.mysql.sql;"2.3.4 启动pdns服务:
# 会启动 8081, 5300端口
systemctl start pdns 
systemctl restart pdns 
systemctl enable pdns
systemctl stop pdns
systemctl status pdns 
journalctl -xefu pdns 2.4 部署pdns-recursor递归服务
配置yum源
curl -o /etc/yum.repos.d/powerdns-rec-44.repo https://repo.powerdns.com/repo-files/centos-rec-44.repo 
 
yum makecache fast -y安装pdns-recursor
yum install pdns-recursor -y
systemctl enable pdns-recursor
systemctl status pdns-recursor修改pdns-recursor.conf配置
vi /etc/pdns-recursor/recursor.conf
#允许访问的地址
allow-from=0.0.0.0/0
#开启日志
disable-syslog=yes
#关闭dnssec 转发有用
dnssec=off
#forward-zones是只转发,不递归 少用
#forward-zones=hexug.com=127.0.0.1:54
# 除forward-zones外其他所有的请求发至forward-zones-recurse字段内容
#forward-zones-file=/etc/pdns-recursor/zones
# 除forward-zones外其他所有的请求发至223.5.5.5, 180.76.76.76, 114.114.114.114
# forward-zones-recurse=.=223.5.5.5, .=180.76.76.76, .=114.114.114.114  
#forward-zones-recurse是找不到就递归,找的到就转发,用逗号分隔  这里是将pdns中定义的域名,转发到pdns服务的54端口上
forward-zones-recurse=hexug.com=127.0.0.1:54,abc.com=127.0.0.1:54,.=114.114.114.114
#绑定在所有端口商
local-address=0.0.0.0
local-port=53
log-common-errors=yes
security-poll-suffix=
setgid=pdns-recursor
setuid=pdns-recursor
# ============================== use ==============================
vi /etc/pdns-recursor/recursor.conf
#允许访问的地址
allow-from=0.0.0.0/0
#开启日志
disable-syslog=yes
#关闭dnssec 转发有用
dnssec=off
#forward-zones是只转发,不递归 少用
#forward-zones=hexug.com=127.0.0.1:54
# 除forward-zones外其他所有的请求发至forward-zones-recurse字段内容
#forward-zones-file=/etc/pdns-recursor/zones
# 除forward-zones外其他所有的请求发至223.5.5.5, 180.76.76.76, 114.114.114.114
# forward-zones-recurse=.=223.5.5.5, .=180.76.76.76, .=114.114.114.114           
#forward-zones-recurse是找不到就递归,找的到就转发,用逗号分隔  这里是将pdns中定义的域名,转发到pdns服务的54端口上
forward-zones-recurse=tpp1212.com=127.0.0.1:54,abc.com=127.0.0.1:54,.=114.114.114.114
#绑定在所有端口商
local-address=0.0.0.0
local-port=53
log-common-errors=yes
security-poll-suffix=
setgid=pdns-recursor
setuid=pdns-recursor/etc/pdns-recursor/zones内容示例:
ppp123.com=127.0.0.1:54
ttt123.com=127.0.0.1:54启动pdns-recursor服务
systemctl start pdns-recursor 
systemctl enable pdns-recursor --now
systemctl restart pdns-recursor 
systemctl status pdns-recursor 
journalctl -xefu pdns-recursor 2.5 安装powerdns-admin
docker network create pdns
mkdir /data/pdnsadmin/data -p 
chmod 777 /data/pdnsadmin/data -R
# 创建docker-compose.yml
mkdir /root/pdns-admin -p
cd /root/pdns-admin
vi docker-compose.yml
docker-compose up
# 其它命令参考
docker-compose up -d
docker-compose down
$. docker-compose logs -f --tail=100 -t spring-cloud-dataflow安装PowerDNS管理后台服务powerdns-admin,docker-compose.yml如下
---
version: '3.7'
services:
  powerdnsadmin:
    hostname: pdnsadmin
    container_name: pdnsadmin
    image: ngoduykhanh/powerdns-admin:0.3.0
    restart: always
    ports:
      - 9191:80
    networks:
      - pdns
    volumes:
      - /data/pdnsadmin/data:/data
    logging:
      driver: json-file
      options:
        max-file: '3'
        max-size: '10m'
networks:
  pdns:
    driver: bridge
    external: true2.6 配置 powerdns-admin
配置Server
http:{ip}:9191
打开Web界面,到登录界面,PowerDNS没有管理员用户,登录之前需要首先注册第一个用户,就是管理员用户。

打开Setting,点击Server,配置API信息:
# 查看 api key:
cat /etc/pdns/pdns.conf
到此就完成基本配置,完善了之前PowerDNS-Admin的搭建,也简化了之前的搭建步骤,从DNS的递归到权威以及第三方Web界面管理权威服务器实现DNS记录CUDR。
添加Domain
$. pdnsutil -h
# list-all-zones [master|slave|native] -- List all zone names
$. pdnsutil list-all-zones
rpp.com
rpp2.com
rpp3.com
pdnsutil list-zone tpp1212.com
# check-zone ZONE      -- Check a zone for correctness
$. pdnsutil check-zone tpp1212.com
dig +short www.tpp1212.com
# check-all-zones [exit-on-error] -- Check all zones for correctness. Set exit-on-error to exit immediately after finding an error in a zone.
$. pdnsutil check-all-zones
# clear-zone ZONE -- Clear all records of a zone, but keep everything else
$. pdnsutil clear-zone tpp1212.com
pdnsutil test-schema tpp1212.com
pdnsutil show-zone tpp1212.com
pdnsutil edit-zone tpp1212.com
pdnsutil delete-zone tpp1212.com
# ========================== 参考 ============================ #
pdnsutil generate-zone-key zsk rsasha256 2048
pdnsutil add-zone-key tpp1212.com zsk active published rsasha256
添加A记录
第一步:

第二步:

添加记录结果查看:

- 修改测试客户端10.y.y.195的dns ip为10.x.x.109并解析上一步添加的A记录

解析A记录
# pdns服务解析记录测试
dig +short www.tpp1212.com @127.0.0.1 -p54
dig www.tpp1212.com @127.0.0.1 -p54
dig lpf.tpp1212.com @127.0.0.1 -p54
dig +short lpf.dev.tpp1212.com @127.0.0.1 -p54
# pdns-recursor服务解析记录测试
dig +short www.tpp1212.com @127.0.0.1 -p53
dig www.tpp1212.com @127.0.0.1 -p53
dig lpf.tpp1212.com @127.0.0.1 -p53
dig +short lpf.dev.tpp1212.com @127.0.0.1 -p53
===========================================================================
# 使用示例:
    ………………………………………………………………
    # 查询域名对应的IP地址
    dig dns.rpp.comm A
    dig dns.rpp.comm A
    dig test.dev.mydomain.com A
    ………………………………………………………………
    # 查询指定域名的MX记录
    dig example.com MX
    ………………………………………………………………
    # 查询域名的TXT记录
    dig example.com TXT
    ………………………………………………………………
    # 反向查询,根据IP地址查找对应的域名
    dig -x 8.8.8.8
解析baidu.com,通过内网递归查询到外部域名
 
   
  
至此内网单机版dns服务器部署完毕,可以正常解析域名。
备注:
高可用dns服务可通过后端mysql实现主从实现,配置两个pdns。



















