이번에 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)
위 버전으로 설치 하려 한다.
/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/
이렇게 설치 하면 몇가지 문제가 생길 것이다.
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 |
댓글