智能DNS部署文档(基于powerDNS)

1.安装libmaxminddb

wget https://github.com/maxmind/libmaxminddb/archive/refs/tags/1.6.0.tar.gz
./configure
make -j4
make check
make install 
echo /usr/local/lib  >> /etc/ld.so.conf.d/local.conf
ldconfig

下载GeoLite2免费地址库

https://dev.maxmind.com/geoip/geolite2-free-geolocation-data?lang=en
这里使用GeoLite2-City
文档文件夹内已附有数据库,无需重新下载。GeoLite2免费地址库支持在线更新,需要到官网注册账号申请免费license

2.安装Pdns Authoritative Server(权威服务器)

这里需要预先安装好mysql

wget https://downloads.powerdns.com/releases/pdns-4.6.0.tar.bz2
tar xvf pdns-4.6.0.tar.bz2 
cd pdns-4.6.0

开启mysql和geoip后端、并指定mysql目录、开启lua-record

./configure --prefix=/usr/local/powerdns --with-modules="bind gmysql geoip" --with-mysql=/usr/local/mysql --enable-verbose-logging --enable-lua-records
make -j4 && make install

遇到错误

configure: error: cannot find Boost headers version >= 1.42.0
解决
yum install boost-devel -y
错误
configure: error: Could not find yaml-cpp
解决
yum install yaml-cpp yaml-cpp-devel -y

创建powerdns数据库、数据表

mysql -uroot -p

create database pdns;
use pdns;

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 UNSIGNED DEFAULT NULL,
  account               VARCHAR(40) CHARACTER SET 'utf8' DEFAULT NULL,
  PRIMARY KEY (id)
) Engine=InnoDB CHARACTER SET 'latin1';

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,
  disabled              TINYINT(1) DEFAULT 0,
  ordername             VARCHAR(255) BINARY DEFAULT NULL,
  auth                  TINYINT(1) DEFAULT 1,
  PRIMARY KEY (id)
) Engine=InnoDB CHARACTER SET 'latin1';

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


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


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) CHARACTER SET 'utf8' DEFAULT NULL,
  comment               TEXT CHARACTER SET 'utf8' NOT NULL,
  PRIMARY KEY (id)
) Engine=InnoDB CHARACTER SET 'latin1';

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 CHARACTER SET 'latin1';

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,
  published             BOOL DEFAULT 1,
  content               TEXT,
  PRIMARY KEY(id)
) Engine=InnoDB CHARACTER SET 'latin1';

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 CHARACTER SET 'latin1';

CREATE UNIQUE INDEX namealgoindex ON tsigkeys(name, algorithm);

ALTER TABLE records ADD CONSTRAINT `records_domain_id_ibfk` FOREIGN KEY (`domain_id`) REFERENCES `domains` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE comments ADD CONSTRAINT `comments_domain_id_ibfk` FOREIGN KEY (`domain_id`) REFERENCES `domains` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE domainmetadata ADD CONSTRAINT `domainmetadata_domain_id_ibfk` FOREIGN KEY (`domain_id`) REFERENCES `domains` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;
ALTER TABLE cryptokeys ADD CONSTRAINT `cryptokeys_domain_id_ibfk` FOREIGN KEY (`domain_id`) REFERENCES `domains` (`id`) ON DELETE CASCADE ON UPDATE CASCADE;

修改pdns.conf

local-address=0.0.0.0
local-port=5300   
launch=gmysql,geoip   #开启mysql、gepip后端
gmysql-host=localhost
gmysql-port=3306
gmysql-user=root
gmysql-password=123456
gmysql-dbname=pdns
write-pid=yes
daemon=yes
api=yes   #开启api
api-key=自定义 #配置api访问密钥
webserver=yes
webserver-address=0.0.0.0
webserver-allow-from=0.0.0.0/0   #api允许访问来源
webserver-port=8081   #api访问端口
config-dir=/usr/local/powerdns/etc    #指定pdns配置文件目录
enable-lua-records=shared    #开启lua-record
geoip-database-files=/usr/local/powerdns/etc/GeoLite2-City.mmdb   #指定geoip数据库

启动pdns

/usr/local/powerdns/sbin/pdns_server

posted @ 2022-05-12 14:31  Myifb  阅读(416)  评论(0)    收藏  举报