Cài đặt PowerDNS và PowerDNS Admin trên Ubuntu 20.04

DNS là gì? DNS Server là gì? #

DNS là viết tắt của cụm từ Domain Name System, mang ý nghĩa đầy đủ là hệ thống phân giải tên miền. Hiểu một cách ngắn gọn nhất, DNS cơ bản là một hệ thống chuyển đổi các tên miền website mà chúng ta đang sử dụng, ở dạng www.tel4vn.edu.vn sang một địa chỉ IP dạng số tương ứng với tên miền đó và ngược lại.

DNS Server là Server vận hành các công cụ hỗ trợ phân giải tên miền. DNS Server sẽ lập một cuốn danh bạ (hay bản đồ) cho một địa chỉ IP và gán nó cho tên miền tương ứng với mục đích tiện cho việc tìm kiếm trong hệ thống mạng. DNS Server sẽ tìm tên miền trong cuốn danh bạ đó để xem là địa chỉ IP nào tương ứng khi người dùng truy cập vào tên miền. Từ đây sẽ đưa bạn đến với thiết bị có IP đó.

dns-server-client

Giới thiệu PowerDNS và PowerDNS Admin #

PowerDNS là một công cụ mã nguồn mở giúp bạn xây dựng một DNS Server. Ngoài ra, PowerDNS Admin là công cụ giúp quản lý PowerDNS thông qua trình duyệt web. Do đó, bạn có thể dễ dàng tạo và quản lý các DNS Record mà không cần thao tác câu lệnh. Trong bài viết hôm nay, mình sẽ hướng dẫn bạn cách cài PowerDNS và PowerDNS Admin trên Ubuntu 20.04.

Chuẩn bị môi trường #

  • Server chạy Ubuntu 20.04
  • Một domain trỏ tới địa chỉ IP của Server
  • Người dùng root

Cài đặt và cấu hình MariaDB Server #

Trước tiên, bạn cần cài đặt MariaDB Server cho PowerDNS. Để cài đặt, thực hiện import repository như bên dưới:

apt-get install software-properties-common gnupg2 -y

Thêm Maria signing key:

apt-key adv --fetch-keys 'https://mariadb.org/mariadb_release_signing_key.asc'

Sau đó cài đặt MariaDB Server:

apt-get install mariadb-server -y

Sau khi cài đặt xong, bạn hãy mở MySQL lên:

mysql

Thực hiện các câu lệnh SQL sau để tạo database và gán cho user mới:

MariaDB [(none)]> create database pdns;
MariaDB [(none)]> grant all on pdns.* to pdnsadmin@localhost identified by 'password';
MariaDB [(none)]> flush privileges;
MariaDB [(none)]> exit;

Cài đặt PowerDNS #

Trước hết, cần tắt dịch vụ phân dải tên miền mặc định của hệ thống:

systemctl disable --now systemd-resolved

Sau đó xoá file resolv.conf  và tạo mới:

rm -rf /etc/resolv.conf
echo "nameserver 8.8.8.8" > /etc/resolv.conf

Cuối cùng là cài đặt PowerDNS:

apt-get install pdns-server pdns-backend-mysql -y

Cấu hình PowerDNS #

Đầu tiên, bạn cần phải import database schema vào database:

mysql -u pdnsadmin -p pdns < /usr/share/pdns-backend-mysql/schema/schema.mysql.sql

Tiếp theo là điền thông tin kết nối tới database vào file cấu hình:

vi /etc/powerdns/pdns.d/pdns.local.gmysql.conf

Thay đổi theo cấu hình sau:

# MySQL Configuration
#
# Launch gmysql backend
launch+=gmysql

# gmysql parameters
gmysql-host=127.0.0.1
gmysql-port=3306
gmysql-dbname=pdns
gmysql-user=pdnsadmin
gmysql-password=password
gmysql-dnssec=yes
# gmysql-socket=

Lưu lại thay đổi và thực hiện chỉnh quyền của file như bên dưới:

chmod 640 /etc/powerdns/pdns.d/pdns.local.gmysql.conf

Tiếp theo cần tạm dừng dịch vụ và kiểm tra:

systemctl stop pdns
pdns_server --daemon=no --guardian=no --loglevel=9

Nếu thông tin cấu hình kết nối database của bạn đúng thì sẽ có thông báo như bên dưới:

Nov 02 10:43:47 gmysql Connection successful. Connected to database 'pdns' on '127.0.0.1'.
Nov 02 10:43:47 gmysql Connection successful. Connected to database 'pdns' on '127.0.0.1'.
Nov 02 10:43:47 gmysql Connection successful. Connected to database 'pdns' on '127.0.0.1'.
Nov 02 10:43:47 Done launching threads, ready to distribute questions

Bật lại dịch vụ:

systemctl start pdns

Lúc này, PowerDNS sẽ lắng nghe trên port 53. Bạn có thể kiểm tra với câu lệnh dưới:

ss -alnp4 | grep pdns

Thì màn hình sẽ hiện ra tương tự như sau:

udp     UNCONN   0        0                0.0.0.0:53             0.0.0.0:*      users:(("pdns_server",pid=33140,fd=5))                                         
tcp     LISTEN   0        128              0.0.0.0:53             0.0.0.0:*      users:(("pdns_server",pid=33140,fd=7))

Cài đặt PowerDNS Admin #

Để cài đặt PowerAdmin, trước hết bạn cần cài đặt các gói cần thiết:

apt-get install nginx python3-dev libsasl2-dev libldap2-dev libssl-dev libxml2-dev libxslt1-dev libxmlsec1-dev libffi-dev pkg-config apt-transport-https virtualenv build-essential libmariadb-dev git python3-flask -y

Tiếp tục thực hiện thêm Node.js repository như bên dưới:

curl -sL https://deb.nodesource.com/setup_14.x | bash -

Sau đó cài đặt Node.js:

apt-get install nodejs -y

Tiếp theo thêm Yarn repository:

curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -
echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list

Sau đó cài đặt Yarn:

apt-get update -y
apt-get install yarn -y

Như vậy các gói cần thiết đã được cài đặt xong, tiếp theo bạn cần tải xuống từ git:

git clone https://github.com/ngoduykhanh/PowerDNS-Admin.git /var/www/html/pdns

Sau đó thực hiện cài đặt như sau:

cd /var/www/html/pdns/
virtualenv -p python3 flask
source ./flask/bin/activate
pip install -r requirements.txt
deactivate

Sau bước trên, bạn cấu hình kết nối tới database như sau:

vi /var/www/html/pdns/powerdnsadmin/default_config.py

Thay đổi theo cấu hình bên dưới:

SALT = 'yoursecretekey'
SECRET_KEY = 'yoursecretekey'
BIND_ADDRESS = '0.0.0.0'
PORT = 9191
HSTS_ENABLED = False
OFFLINE_MODE = False

SQLA_DB_USER = 'pdnsadmin'
SQLA_DB_PASSWORD = 'password'
SQLA_DB_HOST = '127.0.0.1'
SQLA_DB_NAME = 'pdns'
SQLALCHEMY_TRACK_MODIFICATIONS = True

Lưu lại thay đổi và thực hiện tiếp như sau:

cd /var/www/html/pdns/
source ./flask/bin/activate

Tiếp tục cập nhật dữ liệu vào database:

export FLASK_APP=powerdnsadmin/__init__.py
flask db upgrade
yarn install --pure-lockfile
flask assets build

Sau khi cập nhật xong thì deactive môi trường ảo của Python:

deactivate

Tiếp tục bạn cần kích hoạt API:

vi /etc/powerdns/pdns.conf

Thay đổi cấu hình như sau:

api=yes
api-key=yoursecretekey

Lưu lại thay đổi và khởi động lại dịch vụ:

systemctl restart pdns

Cấu hình Nginx cho PowerDNS Admin #

Tạo mới một file cấu hình cho PowerDNS Admin như sau:

vi /etc/nginx/conf.d/pdns-admin.conf

Thêm đoạn cấu hình:

server {
  listen *:80;
  server_name               pdnsadmin.example.com;

  index                     index.html index.htm index.php;
  root                      /var/www/html/pdns;
  access_log                /var/log/nginx/pdnsadmin_access.log combined;
  error_log                 /var/log/nginx/pdnsadmin_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 /var/www/html/pdns/powerdnsadmin;

    location ~*  \.(jpg|jpeg|png|gif)$ {
      expires 365d;
    }

    location ~* ^.+.(css|js)$ {
      expires 7d;
    }
  }

  location / {
    proxy_pass            http://unix:/run/pdnsadmin/socket;
    proxy_read_timeout    120;
    proxy_connect_timeout 120;
    proxy_redirect        off;
  }

}

Lưu lại thay đổi rồi kiểm tra cú pháp của Nginx với:

nginx -t

Sau khi chắc chắn file cấu hình đã đúng, thực hiện thay đổi quyền của file:

chown -R www-data:www-data /var/www/html/pdns

Cuối cùng là khởi động lại Nginx:

systemctl restart nginx

Tạo dịch vụ cho PowerDNS Admin #

Để có thể bật PowerDNS Admin mỗi khi hệ thống khởi động, bạn cần tạo file dịch vụ với Systemd như sau:

vi /etc/systemd/system/pdnsadmin.service

Thêm đoạn cấu hình sau:

[Unit]
Description=PowerDNS-Admin
Requires=pdnsadmin.socket
After=network.target

[Service]
PIDFile=/run/pdnsadmin/pid
User=pdns
Group=pdns
WorkingDirectory=/var/www/html/pdns
ExecStart=/var/www/html/pdns/flask/bin/gunicorn --pid /run/pdnsadmin/pid --bind unix:/run/pdnsadmin/socket 'powerdnsadmin:create_app()'
ExecReload=/bin/kill -s HUP $MAINPID
ExecStop=/bin/kill -s TERM $MAINPID
PrivateTmp=true

[Install]
WantedBy=multi-user.target

Lưu lại file và tiếp tục tạo file socket:

vi /etc/systemd/system/pdnsadmin.socket

Với đoạn cấu hình sau:

[Unit]
Description=PowerDNS-Admin socket

[Socket]
ListenStream=/run/pdnsadmin/socket

[Install]
WantedBy=sockets.target

Lưu lại thay đổi của file và tạo các file và thư mục cần thiết như sau:

echo "d /run/pdnsadmin 0755 pdns pdns -" >> /etc/tmpfiles.d/pdnsadmin.conf
mkdir /run/pdnsadmin/
chown -R pdns: /run/pdnsadmin/
chown -R pdns: /var/www/html/pdns/powerdnsadmin/

Làm mới systemd để lấy dach sách các dịch vụ:

systemctl daemon-reload

Kích hoạt dịch vụ vừa tạo:

systemctl enable --now pdnsadmin.service pdnsadmin.socket

Từ đó bạn có thể kiểm tra trạng thái với systemd:

systemctl status pdnsadmin.service pdnsadmin.socket

Nếu dịch vụ đã chạy, bạn sẽ có thông báo màn hình như sau:

? pdnsadmin.service - PowerDNS-Admin
     Loaded: loaded (/etc/systemd/system/pdnsadmin.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2020-11-02 10:54:19 UTC; 5s ago
TriggeredBy: ? pdnsadmin.socket
   Main PID: 38881 (gunicorn)
      Tasks: 2 (limit: 2353)
     Memory: 62.5M
     CGroup: /system.slice/pdnsadmin.service
             ??38881 /var/www/html/pdns/flask/bin/python /var/www/html/pdns/flask/bin/gunicorn --pid /run/pdnsadmin/pid --bind unix:/run/pdnsa>
             ??38898 /var/www/html/pdns/flask/bin/python /var/www/html/pdns/flask/bin/gunicorn --pid /run/pdnsadmin/pid --bind unix:/run/pdnsa>

Nov 02 10:54:19 pdnsadmin.example.com systemd[1]: Started PowerDNS-Admin.
Nov 02 10:54:19 pdnsadmin.example.com gunicorn[38881]: [2020-11-02 10:54:19 +0000] [38881] [INFO] Starting gunicorn 20.0.4
Nov 02 10:54:19 pdnsadmin.example.com gunicorn[38881]: [2020-11-02 10:54:19 +0000] [38881] [INFO] Listening at: unix:/run/pdnsadmin/socket (38881)
Nov 02 10:54:19 pdnsadmin.example.com gunicorn[38881]: [2020-11-02 10:54:19 +0000] [38881] [INFO] Using worker: sync
Nov 02 10:54:19 pdnsadmin.example.com gunicorn[38898]: [2020-11-02 10:54:19 +0000] [38898] [INFO] Booting worker with pid: 38898

? pdnsadmin.socket - PowerDNS-Admin socket
     Loaded: loaded (/etc/systemd/system/pdnsadmin.socket; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2020-11-02 10:54:19 UTC; 5s ago
   Triggers: ? pdnsadmin.service
     Listen: /run/pdnsadmin/socket (Stream)
     CGroup: /system.slice/pdnsadmin.socket

Nov 02 10:54:19 pdnsadmin.example.com systemd[1]: Listening on PowerDNS-Admin socket.

Cuối cùng, bạn có thể truy cập với đường dẫn là domain đã trỏ tới địa chỉ IP từ đầu:

powerdns-admin-gui

Kết luận #

Thông qua bài viết này, bạn đã có thể cài đặt PowerDNS và PowerDNS Admin trên Ubuntu 20.04. Nếu có bất kì lỗi nào trong quá trình cài đặt, bạn hãy bình luận bên dưới để mình hỗ trợ nhé.

Nguồn bài viết: https://www.howtoforge.com

Mình là Tùng, hiện đang là DevOps tại Công Ty CP EcoIT. Với kinh nghiệm có được từ trong công việc, mình muốn chia sẻ cho bạn đọc cùng biết và cùng nhau học thêm nhiều điều mới trong lĩnh vực DevOps.

Powered by BetterDocs

Để lại bình luận

Email của bạn sẽ không được hiển thị công khai. Các trường bắt buộc được đánh dấu *