使用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.repo
2.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: true
2.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。