본문 바로가기

리눅스

우분투 24.04에 PowerDNS를 설치하고 도메인을 등록하는 방법

반응형

우분투 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 cp /etc/powerdns/pdns.conf /etc/powerdns/pdns.conf_$(date +%Y%m%d_%H%M%S)

설정 파일 생성

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_$(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"
$ ls -l | grep backup
-rw-r--r-- 1 root root 65536 Sep 29 21:18 pdns_backup_20250929.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
반응형