사용자가 naver에 접속하기 위해 www.naver.com을 주소창에 입력하였을 시 그림과 같은 순서로 IP 주소를 반환한다.
오픈 소스로 운영에 금전적 부담이 없음
Mysql/MariaDB에 도메인에 관련된 데이터를 저장하기 때문에 쿼리를 작성할 수 있는 사람이면 쉽게 DNS 서버를 다룰 수 있음
쿼리를 사용할 수 있기 때문에 관리하는 도메인이 많을 때 유용함
원하면 웹을 통해 쉽게 도메인을 관리할 수 있어 더욱 편의성이 좋음
앞서 말했듯이 PowerDNS는 Mysql/MariaDB에 도메인 관련 데이터들을 저장하기 때문에 우리는 MariaDB를 설치한다.
sudo vi /etc/yum.repos.d/mariaDB.repo
로 파일 생성 및 아래의 내용을 입력한 후 저장한다.
# MariaDB 10.7 RedHat repository list
[mariadb]
name = MariaDB
baseurl = http://yum.mariadb.org/10.7/rhel8-amd64
module_hotfixes=1
gpgkey=https://yum.mariadb.org/RPM-GPG-KEY-MariaDB
gpgcheck=1
mariaDB.repo 파일이 생성 된 걸 확인할 수 있다,
확인해보면 아래와 같이 작성한 내용이 잘 들어가 있다.
sudo yum install pdns pdns-backend-mysql MariaDB-server -y
위의 명령어로 pdns와 mariadb를 설치한다.
sudo systemctl enable --now mariadb.service mariadb 실행 및 서버 시작 시 mariadb가 자동으로 켜지게끔 설정
sudo systemctl status mariadb.service 상태 확인
sudo mariadb-secure-installation 초기 설정
mysql -uroot -p 로그인 잘 되는지 확인
pdns DB 생성, pdns 계정 생성(pw는 본인이 사용할 pw를 적는다)
create database pdns;
GRANT ALL ON pdns.* TO 'pdns'@'localhost' IDENTIFIED BY '1234';
FLUSH PRIVILEGES;
pdns DB에 사용할 table 생성
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 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);
sudo vi /etc/pdns/pdns.conf
launch 관련 설정줄에 아래 내용 추가
launch=gmysql
gmysql-host=localhost
gmysql-user=pdns
gmysql-password=1234
gmysql-dbname=pdns
gmysql-dnssec=yessql-dbname=pdns
gmysql-dnssec=yes
DNS는 기본적으로 53번 포트를 사용함
sudo firewall-cmd --permanent --add-port=53/udp
sudo firewall-cmd --permanent --add-port=53/tcp
sudo firewall-cmd --reload
sudo firewall-cmd --list-port
sudo systemctl start pdns
sudo systemctl status pdns
오류 없이 잘 실행되어야 함
mariadb에 접속하여 도메인을 생성한다.
INSERT INTO `domains` (`id`, `name`, `master`, `last_check`, `type`, `notified_serial`, `account`) VALUES (1, 'test.com', '', 0, 'NATIVE', 0, '');
INSERT INTO `records` (`domain_id`, `name`, `type`, `content`, `ttl`, `prio`, `change_date`, `disabled`, `ordername`, `auth`) VALUES (1, 'test.com', 'SOA', 'localhost hostmaster@vegas-solution.com 1', 86400, NULL, NULL, 0, '', 1);
INSERT INTO `records` (`domain_id`, `name`, `type`, `content`, `ttl`, `prio`, `change_date`, `disabled`, `ordername`, `auth`) VALUES (1, 'test.com', 'NS', 'ns1.test.com', 86400, NULL, NULL, 0, '', 1);
INSERT INTO `records` (`domain_id`, `name`, `type`, `content`, `ttl`, `prio`, `change_date`, `disabled`, `ordername`, `auth`) VALUES (1, 'test.com', 'NS', '111.111.111.111', 60, NULL, NULL, 0, '', 0);
INSERT INTO `records` (`domain_id`, `name`, `type`, `content`, `ttl`, `prio`, `change_date`, `disabled`, `ordername`, `auth`) VALUES (1, 'my.test.com', 'A', '192.168.100.100', 10, NULL, NULL, 0, '', 1);