본문 바로가기
서버인프라

Power DNS 설치

by techwold ted 2022. 11. 8.

이번에 Power DNS 설치에 대해 설명해 보려 합니다.

우선 Power DNS란? https://doc.powerdns.com/authoritative/index.html 잘 설명 되어 있습니다. 참고 하시기 바랍니다.

우선 pdns 는 db 기반으로 돌아 갑니다. 엔진은 c++로 개발 되었습니다. 

예전에 내부 dns로 사용했었는데 이번에 새로운 프로젝트를 시작하면서 다시 한번 설치 할 기회가 생겨 다음 내용을 작성하려 합니다.

 

마리아 DB버전은 10.6 버전을 사용하려 하며 설치 OS는 Ubuntu 20.04 "focal" 입니다.

왜 10.6 버전을 사용하는 지는 https://babo-it.tistory.com/49 해당 글을 참고하시기 바랍니다.

MadiaDB 설치

key를 가져오고 레포지토리 추가

apt-get install apt-transport-https curl
curl -o /etc/apt/trusted.gpg.d/mariadb_release_signing_key.asc 'https://mariadb.org/mariadb_release_signing_key.asc'
sh -c "echo 'deb https://mirrors.xtom.jp/mariadb/repo/10.6/ubuntu focal main' >>/etc/apt/sources.list"

MariaDB 10.6 설치

sudo apt-get update
sudo apt-get install mariadb-server

 

Create db

sudo mysql
create database pdns;

 

create table

CREATE TABLE domains (
  id                    INT AUTO_INCREMENT,
  name                  VARCHAR(255) NOT NULL,
  master                VARCHAR(128) DEFAULT NULL,
  last_check            INT DEFAULT NULL,
  type                  VARCHAR(8) NOT NULL,
  notified_serial       INT UNSIGNED DEFAULT NULL,
  account               VARCHAR(40) CHARACTER SET 'utf8' DEFAULT NULL,
  options               VARCHAR(64000) DEFAULT NULL,
  catalog               VARCHAR(255) DEFAULT NULL,
  PRIMARY KEY (id)
) Engine=InnoDB CHARACTER SET 'latin1';

CREATE UNIQUE INDEX name_index ON domains(name);
CREATE INDEX catalog_idx ON domains(catalog);


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);
mysql -uroot pdns < pdns.sql

외래키 설정

use pdns;
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;

 

Power DNS 설치

PowerDNS로 dns 확인을 위해 자체 dns 서비스를 중지 시켜 줍니다.

systemctl disable --now systemd-resolved

 

NameServer 변경

vi /etc/resolv.conf
nameserver 8.8.8.8    # 기존 내용 수정

Pdns 설치 및 데이터베이스 백엔드 패키지 설치

PowerDNS Authoritative Server - version 4.7.X (stable)

https://repo.powerdns.com/

 

PowerDNS repositories

To use these repositories, the packages need to be "pinned" in APT. Instructions are below. Packages are available for the following Ubuntu releases: Ubuntu 22.04 "Jammy Jellyfish" The following repositories are available: PowerDNS Authoritative Server - m

repo.powerdns.com

위 버전으로 설치 하려 한다.

/etc/apt/sources.list.d/pdns.list

vi /etc/apt/sources.list

#마지막 줄에 아래 라인을 추가해주다.
deb [arch=amd64] http://repo.powerdns.com/ubuntu focal-auth-47 main

그리고

vi /etc/apt/preferences.d/pdns

Package: pdns-*
Pin: origin repo.powerdns.com
Pin-Priority: 600
curl https://repo.powerdns.com/FD380FBB-pub.asc | sudo apt-key add - 
apt update
apt-get install pdns-server pdns-backend-mysql

설치 하고 나면 아래와 같이 포트 53이 생성된것을 확인 하실 수 있습니다.

위에서 dns서비스를 중지 시켰는데 pdns로 생성된 것을 확인 할 수 있습니다.

pdns 프로세스가 올라 온 것을 확인 할 수 있습니다.

그리고 systemctl로 시작과 정지를 시킬 수 있습니다.

sudo systemctl stop pdns
sudo systemctl start pdns

Power DNS 구성

pdns 설정 파일을 조금 수정해 줄 것입니다.

sudo vi /etc/powerdns/pdns.conf

launch=gmysql

# launch 아래 내용을 추가합니다.
# gmysql parameters
gmysql-host=localhost
gmysql-port=3306
gmysql-dbname=pdns
gmysql-user=pdns
gmysql-password=B26323355897C3D085497B558FEE7A83
gmysql-dnssec=yes

pdns 재시작

sudo systemctl restart pdns

PowerDNS Admin 설치

apt install python3-dev

1. 종속성 패키지 설치

apt install -y git libmysqlclient-dev libsasl2-dev libldap2-dev libssl-dev libxml2-dev libxslt1-dev libxmlsec1-dev libffi-dev pkg-config apt-transport-https python3-venv build-essential curl

2. Node.js 설치 (Version 14)

curl -sL https://deb.nodesource.com/setup_14.x | sudo bash -
sudo apt-get install -y nodejs

3. yarn 공개키 apt 추가

sudo curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add -

4. apt source list에 yarn list 추가

 echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list

5. 소스 목록 업데이트

sudo apt update

6. yarn 설치

sudo apt install yarn

7. 복제된 git 레포지토리로 이동

git clone https://github.com/PowerDNS-Admin/PowerDNS-Admin.git /opt/web/powerdns-admin
cd /opt/web/powerdns-admin/

8. python 가상환경 설정

python3 -mvenv ./venv

9. 가상환경 진입

source ./venv/bin/activate

10. pip 최신 버전 install

sudo ./venv/bin/pip install --upgrade pip

11.  requirements.txt 파일 패키지 리스트 설치

sudo ./venv/bin/pip install -r requirements.txt

PowerDNS 관리자 구성 및 실행

production.py를 production.py 로 복사

sudo cp /opt/web/powerdns-admin/configs/development.py /opt/web/powerdns-admin/configs/production.py

production.py파일을 열어줍니다.

sudo vi production.py

아래 줄을 편집해 줍니다.

SECRET_KEY 생성을 아래에서 나온 값으로 넣어줍니다.

python3 -c "import os; print(os.urandom(16))"
import urllib.parse # 해당 주석 해제
basedir = os.path.abspath(os.path.dirname(__file__))

### BASIC APP CONFIG
SALT = '$2b$12$yLUMTIfl21FKJQpTkRQXCu'
#SECRET_KEY = 'e951e5a1f4b94151b360f47edf596dd2'
SECRET_KEY = b'\x1ccWG\x03\x03\xcf\xad\xff1\xdad\x0c\xe9>1'

# 해당 라인 추가 하위 sqlite 라인 주석처리
SQLALCHEMY_DATABASE_URI = 'mysql://'+SQLA_DB_USER+':'+SQLA_DB_PASSWORD+'@'+SQLA_DB_HOST+'/'+SQLA_DB_NAME
#SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'pdns.db')

프로덕트 변수 설정

export FLASK_CONF=../configs/production.py
export FLASK_APP=powerdnsadmin/__init__.py

데이터베이스 스키마 업데이트

flask db upgrade

yarn 패키지 종속설치

yarn install --pure-lockfile

flask 빌드

flask assets build

빌드가 완료 되었다면 run 시켜줘야 합니다

./run.py

(venv) root@power-dns:/opt/web/powerdns-admin# ./run.py
 * Serving Flask app "powerdnsadmin" (lazy loading)
 * Environment: production
   WARNING: This is a development server. Do not use it in a production deployment.
   Use a production WSGI server instead.
 * Debug mode: on
[2022-11-10 03:03:46,452] [_internal.py:225] WARNING -  * Running on all addresses.
   WARNING: This is a development server. Do not use it in a production deployment.
[2022-11-10 03:03:46,452] [_internal.py:225] INFO -  * Running on http://10.0.1.101:9191/ (Press CTRL+C to quit)

 

PowerDNS ADMIN 실행 서비스 생성

sudo vi /etc/systemd/system/powerdns-admin.service
[Unit]
Description=PowerDNS-Admin
Requires=powerdns-admin.socket
After=network.target

[Service]
User=root
Group=root
PIDFile=/run/powerdns-admin/pid
WorkingDirectory=/opt/web/powerdns-admin
ExecStartPre=/bin/bash -c '$$(mkdir -p /run/powerdns-admin/)'
ExecStart=/opt/web/powerdns-admin/venv/bin/gunicorn --pid /run/powerdns-admin/pid --bind unix:/run/powerdns-admin/socket 'powerdnsadmin:create_app()'
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

유닛파일 생성

sudo systemctl edit --force powerdns-admin.service
[Service]
Environment="FLASK_CONF=../configs/production.py"

소켓파일 생성

sudo vi /etc/systemd/system/powerdns-admin.socket
[Unit]
Description=PowerDNS-Admin socket
[Socket]
ListenStream=/run/powerdns-admin/socket
[Install]
WantedBy=sockets.target

환경파일 생성

sudo vi /etc/tmpfiles.d/powerdns-admin.conf
d /run/powerdns-admin 0755 pdns pdns -

데몬 리로드

sudo systemctl daemon-reload

서비스와 소켓서버 시작을 시켜줍니다..

sudo systemctl start powerdns-admin.service powerdns-admin.socket

서비스와 소켓버서 활성화를 시켜줍니다.

sudo systemctl enable powerdns-admin.service powerdns-admin.socket

서비스 상태 확인

power-dns:/etc/systemd/system$ sudo systemctl status powerdns-admin.service powerdns-admin.socket
● powerdns-admin.service - PowerDNS-Admin
     Loaded: loaded (/etc/systemd/system/powerdns-admin.service; enabled; vendor preset: enabled)
    Drop-In: /etc/systemd/system/powerdns-admin.service.d
             └─override.conf
     Active: active (running) since Thu 2022-11-10 04:34:47 UTC; 9min ago
TriggeredBy: ● powerdns-admin.socket
   Main PID: 59652 (gunicorn)
      Tasks: 2 (limit: 9441)
     Memory: 64.2M
     CGroup: /system.slice/powerdns-admin.service
             ├─59652 /opt/web/powerdns-admin/venv/bin/python3 /opt/web/powerdns-admin/venv/bin/gunicorn --pid /run/powerdns-admin/pid --bind unix>
             └─59669 /opt/web/powerdns-admin/venv/bin/python3 /opt/web/powerdns-admin/venv/bin/gunicorn --pid /run/powerdns-admin/pid --bind unix>

Nov 10 04:34:47 power-dns systemd[1]: Starting PowerDNS-Admin...
Nov 10 04:34:47 power-dns systemd[1]: Started PowerDNS-Admin.
Nov 10 04:34:48 power-dns gunicorn[59652]: [2022-11-10 04:34:48 +0000] [59652] [INFO] Starting gunicorn 20.0.4
Nov 10 04:34:48 power-dns gunicorn[59652]: [2022-11-10 04:34:48 +0000] [59652] [INFO] Listening at: unix:/run/powerdns-admin/socket (59652)
Nov 10 04:34:48 power-dns gunicorn[59652]: [2022-11-10 04:34:48 +0000] [59652] [INFO] Using worker: sync
Nov 10 04:34:48 power-dns gunicorn[59669]: [2022-11-10 04:34:48 +0000] [59669] [INFO] Booting worker with pid: 59669

● powerdns-admin.socket - PowerDNS-Admin socket
     Loaded: loaded (/etc/systemd/system/powerdns-admin.socket; enabled; vendor preset: enabled)
     Active: active (running) since Thu 2022-11-10 04:34:47 UTC; 9min ago
   Triggers: ● powerdns-admin.service
     Listen: /run/powerdns-admin/socket (Stream)
     CGroup: /system.slice/powerdns-admin.socket

Nov 10 04:34:47 power-dns systemd[1]: Listening on PowerDNS-Admin socket.

 

NGINX 설치

sudo apt install nginx -y

 

NGINX CONFIG 추가

sudo vi /etc/nginx/conf.d/pdns-admin.conf
server {
  listen *:80;
  server_name               localhost;
  index                     index.html index.htm index.php;
  root                      /opt/web/powerdns-admin;
  access_log                /var/log/nginx/powerdns-admin.local.access.log combined;
  error_log                 /var/log/nginx/powerdns-admin.local.error.log;
  client_max_body_size              10m;
  client_body_buffer_size           128k;
  proxy_redirect                    off;
  proxy_connect_timeout             90;
  proxy_send_timeout                90;
  proxy_read_timeout                90;
  proxy_buffers                     32 4k;
  proxy_buffer_size                 8k;
  proxy_set_header                  Host $host;
  proxy_set_header                  X-Real-IP $remote_addr;
  proxy_set_header                  X-Forwarded-For $proxy_add_x_forwarded_for;
  proxy_headers_hash_bucket_size    64;
  location ~ ^/static/  {
    include  /etc/nginx/mime.types;
    root /opt/web/powerdns-admin/powerdnsadmin;
    location ~*  \.(jpg|jpeg|png|gif)$ {
      expires 365d;
    }
    location ~* ^.+.(css|js)$ {
      expires 7d;
    }
  }
  location / {
    proxy_pass            http://unix:/run/powerdns-admin/socket;
    proxy_read_timeout    120;
    proxy_connect_timeout 120;
    proxy_redirect        off;
  }
}

소스 소유권 변경

sudo chown -R www-data:www-data /opt/web/powerdns-admin

Nginx 재시작

sudo systemctl restart nginx

PowerDNS API 구성

관리자 페이지에 접속합니다

 

하단 API Keys 로 들어가서 Add Key를 해주면 api key 값이 하나가 나온다.

해당 값은 api-key 에 추가 시켜주고 admin.service powerdns-admin.socket 을 재시작한다.

api=yes
api-key=bkV2dElSbGNESjdBVkcz
webserver=yes
systemctl restart powerdns-admin.service powerdns-admin.socket

이후 DashBoard의 PDNS API URL과 PDNS API KEY를 추가시켜준다.

PDNS API URL : http://10.0.1.101:8081

PDNS API KEY : bkV2dElSbGNESjdBVkcz

 

 

이렇게 하면 설치는 마무리 되게 된다.

 

해당자료는 https://phoenixnap.com/kb/powerdns-ubuntu#ftoc-heading-9 을 참고하여 재작성 됨을 알립니다.

 

참고자료 : https://repo.powerdns.com/

 

PowerDNS repositories

To use these repositories, the packages need to be "pinned" in APT. Instructions are below. Packages are available for the following Ubuntu releases: Ubuntu 22.04 "Jammy Jellyfish" The following repositories are available: PowerDNS Authoritative Server - m

repo.powerdns.com

 

이렇게 설치 하면 몇가지 문제가 생길 것이다.

1. windows에서는 외부로 나가는 dns가 안될 것이고

2. mac 에서는 recursor 문제가 나올것이다.

 

다음편에서 위 해당 문제 해결을 할 것이다.

'서버인프라' 카테고리의 다른 글

PowerDNS Recursor & Dnsdist  (2) 2022.11.23
LVM(Logical Volume Manager) 사용하기  (2) 2022.11.17
[Ncloud] [compute][Server] Professional OverView  (0) 2022.11.16
Rocket Chat 설치  (0) 2022.11.14
GitLab 설치  (0) 2022.11.11

댓글