使用POWERDNS自建DNS

经历了国内DNS商的不靠谱以及对免费用户的限制后,决定搭建自己的DNS服务器。经过一番了解,最后选择了Powerdns,主要看中它的易用性,功能全,还有原生支持WEB和REST,在配置中启用WEB API后,可直接通过HTTP协议进行DNS数据管理。为此,特意用symfony框架写了一个Bundle(pdns-symfony),以便通过网页即可管理域名记录。Powerdns可运行在所有的LINUX版本上,也支持MacOS, 系统版本不同,从发行版的源中安装的默认版本也可能不一样,例如ubuntu 16安装的是4.0版本。但推荐使用 4.0以上的版本。

下面介绍安装和配置的步骤。

sudo apt-get install pdns-server pdns-backend-sqlite pdns-backend-mysql

执行以上命令即可在ubuntu上安装好powerdns

开始配置Powerdns

cat >/etc/powerdns/pdns.conf <<'EOF'
config-dir=/etc/powerdns
daemon=yes
disable-axfr=yes
guardian=yes
local-address=0.0.0.0
local-port=53
#module-dir=/usr/lib/powerdns
setgid=pdns
setuid=pdns
slave=no
master=yes
socket-dir=/var/run
version-string=powerdns
include-dir=/etc/powerdns/pdns.d
socket-dir=/var/run
version-string=powerdns
include-dir=/usr/local/etc/powerdns/pdns.d
api=yes
api-key=myapikey123
webserver=yes
EOF

配置sqlite和创建数据库


[ -d /etc/powerdns/pdns.d ] || mkdir -p /etc/powerdns/pdns.d

chown -R pdns:pdns /etc/powerdns/

cat >/etc/powerdns/pdns.d/pdns.local.gsqlite3.conf <<'EOF'
launch=gsqlite3
# Database location
gsqlite3-database=/etc/powerdns/pdns.sqlite
EOF

导入数据库结构

sqlite3 /etc/powerdns/pdns.sqlite <<'EOF'
PRAGMA foreign_keys = 1;

CREATE TABLE domains (
  id                    INTEGER PRIMARY KEY,
  name                  VARCHAR(255) NOT NULL COLLATE NOCASE,
  master                VARCHAR(128) DEFAULT NULL,
  last_check            INTEGER DEFAULT NULL,
  type                  VARCHAR(6) NOT NULL,
  notified_serial       INTEGER DEFAULT NULL,
  account               VARCHAR(40) DEFAULT NULL
);

CREATE UNIQUE INDEX name_index ON domains(name);

CREATE TABLE records (
  id                    INTEGER PRIMARY KEY,
  domain_id             INTEGER DEFAULT NULL,
  name                  VARCHAR(255) DEFAULT NULL,
  type                  VARCHAR(10) DEFAULT NULL,
  content               VARCHAR(65535) DEFAULT NULL,
  ttl                   INTEGER DEFAULT NULL,
  prio                  INTEGER DEFAULT NULL,
  change_date           INTEGER DEFAULT NULL,
  disabled              BOOLEAN DEFAULT 0,
  ordername             VARCHAR(255),
  auth                  BOOL DEFAULT 1,
  FOREIGN KEY(domain_id) REFERENCES domains(id) ON DELETE CASCADE ON UPDATE CASCADE
);

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

CREATE TABLE supermasters (
  ip                    VARCHAR(64) NOT NULL,
  nameserver            VARCHAR(255) NOT NULL COLLATE NOCASE,
  account               VARCHAR(40) NOT NULL
);

CREATE UNIQUE INDEX ip_nameserver_pk ON supermasters(ip, nameserver);

CREATE TABLE comments (
  id                    INTEGER PRIMARY KEY,
  domain_id             INTEGER NOT NULL,
  name                  VARCHAR(255) NOT NULL,
  type                  VARCHAR(10) NOT NULL,
  modified_at           INT NOT NULL,
  account               VARCHAR(40) DEFAULT NULL,
  comment               VARCHAR(65535) NOT NULL,
  FOREIGN KEY(domain_id) REFERENCES domains(id) ON DELETE CASCADE ON UPDATE CASCADE
);

CREATE INDEX comments_domain_id_index ON comments (domain_id);
CREATE INDEX comments_nametype_index ON comments (name, type);
CREATE INDEX comments_order_idx ON comments (domain_id, modified_at);

CREATE TABLE domainmetadata (
id                     INTEGER PRIMARY KEY,
domain_id              INT NOT NULL,
kind                   VARCHAR(32) COLLATE NOCASE,
content                TEXT,
FOREIGN KEY(domain_id) REFERENCES domains(id) ON DELETE CASCADE ON UPDATE CASCADE
);

CREATE INDEX domainmetaidindex ON domainmetadata(domain_id);

CREATE TABLE cryptokeys (
id                     INTEGER PRIMARY KEY,
domain_id              INT NOT NULL,
flags                  INT NOT NULL,
active                 BOOL,
content                TEXT,
FOREIGN KEY(domain_id) REFERENCES domains(id) ON DELETE CASCADE ON UPDATE CASCADE
);

CREATE INDEX domainidindex ON cryptokeys(domain_id);

CREATE TABLE tsigkeys (
id                     INTEGER PRIMARY KEY,
name                   VARCHAR(255) COLLATE NOCASE,
algorithm              VARCHAR(50) COLLATE NOCASE,
secret                 VARCHAR(255)
);

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

启动powerdns

pdns_server --daemon=no
如果没有什么错误,就表示powerdns的配置完成。

接下来需要安装web管理端,可到https://github.com/shiningw/pdns-symfony查看具体安装步骤

Tags: 

添加新评论

评论内容
提交该页面即表示您接受Mollon的隐私政策