리눅스
우분투 24.04에 PowerDNS를 설치하고 도메인을 등록하는 방법
변군이글루
2025. 9. 29. 13:21
반응형
우분투 24.04에 PowerDNS를 설치하고 도메인을 등록하는 방법
테스트 환경
운영체제 정보
$ lsb_release -d
Description: Ubuntu 24.04.2 LTS
1. PowerDNS 설치
시스템 업데이트
sudo apt update
sqlite3 패키지 설치
sudo apt install -y sqlite3
sqlite3 --version
3.45.1 2024-01-30 16:01:20 e876e51a0ed5c5b3126f52e532044363a014bc594cfefa87ffb5b82257ccalt1 (64-bit)
PowerDNS Authoritative Server 설치
sudo apt install -y pdns-server pdns-backend-sqlite3
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
libboost-program-options1.83.0 libluajit-5.1-2 libluajit-5.1-common pdns-backend-bind
The following NEW packages will be installed:
libboost-program-options1.83.0 libluajit-5.1-2 libluajit-5.1-common pdns-backend-bind pdns-backend-sqlite3 pdns-server
0 upgraded, 6 newly installed, 0 to remove and 130 not upgraded.
Need to get 3,447 kB of archives.
After this operation, 16.7 MB of additional disk space will be used.
...
2. SQLite3 백엔드 설정
API Key 생성(openssl 사용)
openssl rand -hex 32
181643b65a08dc62fbbe461d8c1e9362be1f43a1ac246ada6a8613fb639c5b55
설정 파일 생성
sudo vim /etc/powerdns/pdns.conf
# 기본 설정
daemon=yes
guardian=yes
local-address=0.0.0.0
local-port=53
# SQLite3 백엔드 설정
launch=gsqlite3
gsqlite3-database=/var/lib/powerdns/pdns.sqlite3
# API 활성화 (선택사항)
api=yes
api-key=181643b65a08dc62fbbe461d8c1e9362be1f43a1ac246ada6a8613fb639c5b55
webserver=yes
webserver-address=0.0.0.0
webserver-port=8081
webserver-allow-from=127.0.0.1,192.168.0.0/24
3. 데이터베이스 초기화
데이터베이스 디렉토리 생성
sudo mkdir -p /var/lib/powerdns
sudo chown pdns:pdns /var/lib/powerdns
기존 데이터베이스 백업 및 삭제
더보기
---
데이터베이스 백업
sudo cp /var/lib/powerdns/pdns.sqlite3 /var/lib/powerdns/pdns.sqlite3.backup.$(date +%Y%m%d_%H%M%S)
기존 데이터베이스 삭제
sudo rm -f /var/lib/powerdns/pdns.sqlite3
---
SQLite3 데이터베이스 및 테이블 생성
sudo sqlite3 /var/lib/powerdns/pdns.sqlite3 <<'EOF'
-- PowerDNS 공식 SQLite3 스키마
CREATE TABLE domains (
id INTEGER PRIMARY KEY AUTOINCREMENT,
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,
options TEXT DEFAULT NULL,
catalog VARCHAR(255) DEFAULT NULL,
disabled BOOLEAN DEFAULT 0
);
CREATE TABLE records (
id INTEGER PRIMARY KEY AUTOINCREMENT,
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,
disabled BOOLEAN DEFAULT 0,
ordername VARCHAR(255),
auth BOOLEAN DEFAULT 1,
FOREIGN KEY(domain_id) REFERENCES domains(id) ON DELETE CASCADE ON UPDATE CASCADE
);
CREATE TABLE domainmetadata (
id INTEGER PRIMARY KEY AUTOINCREMENT,
domain_id INTEGER REFERENCES domains(id) ON DELETE CASCADE ON UPDATE CASCADE,
kind VARCHAR(32) COLLATE NOCASE,
content TEXT
);
CREATE TABLE cryptokeys (
id INTEGER PRIMARY KEY AUTOINCREMENT,
domain_id INTEGER REFERENCES domains(id) ON DELETE CASCADE ON UPDATE CASCADE,
flags INTEGER NOT NULL,
active BOOLEAN,
published BOOLEAN DEFAULT 1,
content TEXT
);
CREATE TABLE tsigkeys (
id INTEGER PRIMARY KEY AUTOINCREMENT,
name VARCHAR(255) COLLATE NOCASE,
algorithm VARCHAR(50) COLLATE NOCASE,
secret VARCHAR(255)
);
-- 인덱스 생성
CREATE UNIQUE INDEX name_index ON domains(name);
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 domainmetadata_idx ON domainmetadata(domain_id);
CREATE INDEX cryptokeys_idx ON cryptokeys(domain_id);
CREATE INDEX orderindex ON records(domain_id, ordername);
CREATE INDEX records_type_idx ON records(type);
CREATE INDEX records_name_idx ON records(name);
EOF
권한 설정
sudo chown pdns:pdns /var/lib/powerdns/pdns.sqlite3
sudo chmod 644 /var/lib/powerdns/pdns.sqlite3
4. PowerDNS 서비스 시작
서비스 시작 및 활성화
sudo systemctl enable --now pdns
sudo systemctl status pdns
5. 로그 확인
오류 확인
sudo journalctl -u pdns -n 10 --no-pager
실시간 로그 모니터링
sudo journalctl -u pdns -f
로그 파일 확인
sudo tail -f /var/log/syslog | grep pdns
데이터베이스 무결성 확인
sudo sqlite3 /var/lib/powerdns/pdns.sqlite3 "PRAGMA integrity_check;"
728x90
6. 도메인 및 레코드 등록
SQLite3로 도메인 및 레코드 추가
sudo sqlite3 /var/lib/powerdns/pdns.sqlite3
SQLite version 3.45.1 2024-01-30 16:01:20
Enter ".help" for usage hints.
sqlite>
SQLite 프롬프트에서 다음 SQL을 실행합니다.
- 도메인 추가
INSERT INTO domains (name, type) VALUES ('sangchul.kr', 'MASTER');
- SOA 레코드 추가(중요)
INSERT INTO records (domain_id, name, type, content, ttl, prio)
VALUES (1, 'sangchul.kr', 'SOA', 'ns1.sangchul.kr admin.sangchul.kr 2025092901 10800 3600 604800 3600', 3600, 0);
- NS 레코드 추가
INSERT INTO records (domain_id, name, type, content, ttl, prio)
VALUES (1, 'sangchul.kr', 'NS', 'ns1.sangchul.kr', 3600, 0);
- ns1 서버 A 레코드 추가
INSERT INTO records (domain_id, name, type, content, ttl, prio)
VALUES (1, 'ns1.sangchul.kr', 'A', '192.168.0.100', 3600, 0);
- pdns 서브도메인 A 레코드 추가(도메인 ID는 위에서 확인한 값으로 변경)
INSERT INTO records (domain_id, name, type, content, ttl, prio)
VALUES (1, 'pdns.sangchul.kr', 'A', '192.168.0.101', 3600, 0);
- www 서브도메인 추가
INSERT INTO records (domain_id, name, type, content, ttl, prio)
VALUES (1, 'www.sangchul.kr', 'A', '192.168.0.102', 3600, 0);
- 도메인 메타데이터 추가
INSERT INTO domainmetadata (domain_id, kind, content)
VALUES (1, 'SOA-EDIT-API', 'DEFAULT');
INSERT INTO domainmetadata (domain_id, kind, content)
VALUES (1, 'API-RECTIFY', '1');
- 모든 레코드 확인
SELECT id, name, type, content FROM records WHERE name LIKE '%sangchul.kr%';
- 또는
SELECT id, name, type, content FROM records WHERE domain_id = 1;
1|sangchul.kr|SOA|ns1.sangchul.kr admin.sangchul.kr 2025092901 10800 3600 604800 3600
2|sangchul.kr|NS|ns1.sangchul.kr
3|ns1.sangchul.kr|A|192.168.0.100
4|pdns.sangchul.kr|A|192.168.0.101
5|www.sangchul.kr|A|192.168.0.102
- 종료
.quit
7. 테스트
PowerDNS 재시작
sudo systemctl restart pdns
DNS 쿼리 테스트
dig @127.0.0.1 sangchul.kr SOA +short
ns1.sangchul.kr. admin.sangchul.kr. 2025092901 10800 3600 604800 3600
dig @127.0.0.1 pdns.sangchul.kr +short
192.168.0.101
또는
nslookup pdns.sangchul.kr 127.0.0.1
8. 데이터베이스 백업
sudo sqlite3 /var/lib/powerdns/pdns.sqlite3 ".backup /var/lib/powerdns/pdns_backup_$(date +%Y%m%d).sqlite3"
9. 체크리스트
echo "1. 서비스 상태: $(systemctl is-active pdns)"
echo "2. 포트 리스닝: $(sudo netstat -tulpn | grep :53 | wc -l)"
echo "3. 도메인 수: $(sudo sqlite3 /var/lib/powerdns/pdns.sqlite3 'SELECT COUNT(*) FROM domains;')"
echo "4. 레코드 수: $(sudo sqlite3 /var/lib/powerdns/pdns.sqlite3 'SELECT COUNT(*) FROM records;')"
echo "5. 메타데이터: $(sudo sqlite3 /var/lib/powerdns/pdns.sqlite3 'SELECT COUNT(*) FROM domainmetadata;')"
참고URL
- PowerDNS Docs : Installing PowerDNS
728x90
반응형