Kiến Thức Linux

Hướng dẫn cài đặt PowerDNS trên Ubuntu

PowerDNS

Điều kiện tiên quyết

  • Truy cập vào thiết bị đầu cuối.
  • Truy cập vào người dùng root.
  • Một trình soạn thảo văn bản, chẳng hạn như nano .
  • Trình duyệt web để truy cập PowerDNS Admin.

Tại sao nên sử dụng PowerDNS?

PowerDNS cung cấp hai giải pháp máy chủ tên:

  • Máy chủ có thẩm quyền , sử dụng cơ sở dữ liệu để giải quyết các truy vấn về tên miền.
  • Recursor , có chức năng tham khảo các máy chủ có thẩm quyền khác để giải quyết các truy vấn .

Các máy chủ tên khác tự động kết hợp hai chức năng. PowerDNS cung cấp chúng riêng biệt và cho phép kết hợp hai giải pháp một cách liền mạch để thiết lập theo mô-đun.

Ngoài ra, PowerDNS là mã nguồn mở, hoạt động tốt với cả khối lượng truy vấn nhỏ và lớn, đồng thời cung cấp nhiều giải pháp cho nền tảng.

Cài đặt PowerDNS trên Ubuntu 18.04, 20.04 và 22.04

Thực hiện theo các bước dưới đây để cài đặt và cấu hình PowerDNS với máy chủ MariaDB làm cơ sở dữ liệu phụ trợ . Ngoài ra, các bước hướng dẫn người dùng thiết lập giao diện web và API của PowerDNS Admin.

Bước 1: Cài đặt và cấu hình máy chủ MariaDB

Để cài đặt và cấu hình MariaDB , hãy thực hiện như sau:

1. Cập nhật và nâng cấp các gói hệ thống:

sudo apt update && sudo apt upgrade

2. Cài đặt máy chủ và máy khách MariaDB bằng:

sudo apt install mariadb-server mariadb-client

Lưu ý: Các máy chủ cơ sở dữ liệu khác có thể bao gồm PostgreSQL, MySQL và các cơ sở dữ liệu quan hệ khác.

Chờ quá trình cài đặt hoàn tất trước khi tiếp tục.

3. Kết nối với MariaDB bằng:

sudo mysql

Thiết bị đầu cuối kết nối với phiên cơ sở dữ liệu.

4. Tạo cơ sở dữ liệu cho máy chủ tên PowerDNS:

create database pda;

Lưu ý: Nếu sử dụng tên cơ sở dữ liệu khác, hãy thay đổi tất cả các lệnh tiếp theo cho phù hợp.

5. Cấp tất cả các quyền cho pdangười dùng và cung cấp mật khẩu người dùng:

grant all privileges on pda.* TO 'pda'@'localhost' identified by 'YOUR_PASSWORD_HERE';
flush privileges;

6. Kết nối với cơ sở dữ liệu:

use pda;
sử dụng đầu ra pda mysql

7. Sử dụng các truy vấn SQL sau để tạo bảng cho cơ sở dữ liệu pda :

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

CREATE UNIQUE INDEX name_index ON domains(name);


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,
  change_date           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,
  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);

8. Xác nhận các bảng đã được tạo bằng:

show tables;
MariaDB hiển thị bảng đầu ra cơ sở dữ liệu pda

Đầu ra liệt kê các bảng có sẵn.

9. Thoát khỏi kết nối cơ sở dữ liệu:

exit;
thoát khỏi cơ sở dữ liệu terminal trở về

Lệnh này trả phiên làm việc về thiết bị đầu cuối.

Bước 2: Cài đặt PowerDNS

Để cài đặt PowerDNS trên Ubuntu, hãy thực hiện như sau:

1. Chuyển sang người dùng root:

sudo su -
sudo su - đầu ra của thiết bị đầu cuối

Phiên thiết bị đầu cuối chuyển sang người dùng root.

Lưu ý: Tìm hiểu về sự khác biệt giữa sudo và su .

2. systemd-resolved Dịch vụ cung cấp giải pháp phân giải tên cho các ứng dụng cục bộ. PowerDNS sử dụng dịch vụ riêng của mình để phân giải tên.

Vô hiệu hóa systemd-resolved dịch vụ bằng cách:

systemctl disable --now systemd-resolved
systemctl vô hiệu hóa đầu ra terminal systemd-resolved

Đầu ra xác nhận việc xóa dịch vụ.

3. Xóa tệp cấu hình dịch vụ hệ thống bằng:

rm -rf /etc/resolv.conf

4. Tạo tệp resolv.conf mới :

echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf
tập tin resolv.conf mới máy chủ tên google

Việc thêm máy chủ tên Google sẽ đảm bảo phân giải DNS.

5. Cài đặt máy chủ PowerDNS và các gói cơ sở dữ liệu phụ trợ bằng:

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

Chờ quá trình cài đặt hoàn tất trước khi tiếp tục.

Bước 3: Cấu hình PowerDNS

Cấu hình tệp PowerDNS cục bộ để kết nối với cơ sở dữ liệu:

1. Mở file cấu hình để chỉnh sửa:

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

2. Thêm thông tin sau vào tệp:

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

# gmysql parameters
gmysql-host=127.0.0.1
gmysql-port=3306
gmysql-dbname=pda
gmysql-user=pda
gmysql-password=YOUR_PASSWORD_HERE
gmysql-dnssec=yes
# gmysql-socket=
nội dung tệp pdns.local.gmysql.conf

Đổi tên cơ sở dữ liệu, người dùng và mật khẩu với các tham số chính xác nếu sử dụng các tham số khác nhau. Lưu và đóng tệp.

3. Thay đổi quyền của tệp:

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

4. Dừng dịch vụ pdns :

systemctl stop pdns

5. Kiểm tra kết nối tới cơ sở dữ liệu:

pdns_server --daemon=no --guardian=no --loglevel=9
kiểm tra kết nối cơ sở dữ liệu pdns_server

Đầu ra hiển thị kết nối thành công. Nhấn CTRL + C để thoát khỏi bài kiểm tra.

6. Bắt đầu dịch vụ:

systemctl start pdns

7. Kiểm tra kết nối bằng lệnh ss :

ss -alnp4 | grep pdns
cổng lắng nghe ss pdns 53

Kiểm tra cổng TCP / UDP53 đã mở và ở trạng thái LISTENUCONNchưa.

Bước 4: Cài đặt PowerDNS Admin Dependencies

PowerDNS Admin giúp quản lý PowerDNS thông qua giao diện web. Để cài đặt bảng điều khiển cục bộ, hãy thực hiện như sau:

1. Cài đặt gói phát triển Python:

apt install python3-dev

2. Cài đặt các phần phụ thuộc:

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

3. Tải thiết lập Node.js:

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

4. Cài đặt Node.js bằng:

apt install -y nodejs

5. Tiếp theo, cài đặt trình quản lý gói Yarn. Lấy khóa công khai Yarn và thêm nó vào apt :

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

Yarn giúp xây dựng các tệp tài sản.

6. Thêm Yarn vào danh sách nguồn:

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

7. Cập nhật danh sách nguồn apt:

apt update -y

8. Cài đặt Yarn bằng:

apt install yarn -y

9. Sao chép kho lưu trữ PowerDNS Admin Git tới /opt/web/powerdns-admin :

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

Nếu sử dụng thư mục khác, hãy hoán đổi thư mục đích trong lệnh và trong tất cả các lần xuất hiện tiếp theo.

10. Điều hướng đến thư mục Git đã sao chép:

cd /opt/web/powerdns-admin

11. Tạo môi trường ảo Python:

python3 -mvenv ./venv

12. Kích hoạt môi trường ảo bằng:

source ./venv/bin/activate
python venv kích hoạt

13. Nâng cấp pip lên phiên bản mới nhất:

pip install --upgrade pip

Trình quản lý gói pip giúp cài đặt các yêu cầu Python bổ sung.

14. Cài đặt các yêu cầu từ tệp requirements.txt :

pip install -r requirements.txt

Sau khi cài đặt tất cả các yêu cầu, PowerDNS Admin yêu cầu cấu hình bổ sung trước khi chạy.

Bước 5: Cấu hình và chạy PowerDNS Admin

Để cấu hình và khởi động PowerDNS Admin trên phiên bản cục bộ, hãy thực hiện như sau:

1. Sử dụng lệnh cp để sao chép tệp Python development.py mẫu vào production.py :

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

2. Mở tệp production.py để chỉnh sửa:

nano /opt/web/powerdns-admin/configs/production.py

3. Chỉnh sửa các dòng sau:

#import urllib.parse

SECRET_KEY = 'e951e5a1f4b94151b360f47edf596dd2'

SQLA_DB_PASSWORD = 'changeme'

4. Bỏ chú thích cho lệnh nhập thư viện, cung cấp khóa bí mật được tạo ngẫu nhiên và cung cấp mật khẩu cơ sở dữ liệu chính xác.

import urllib.parse

SECRET_KEY = 'x19xc7xd8xa7$xb6P*xc6xb8xa1Ex90Px12x95'

SQLA_DB_PASSWORD = 'YOUR_PASSWORD_HERE'
production.py powerdns admin config nội dung

Lưu ý: Tạo khóa ngẫu nhiên bằng Python:

python3 -c "import os; print(os.urandom(16))"

Sao chép và dán đầu ra vào SECRET_KEYgiá trị.

Lưu và đóng tệp.

5. Xuất biến cấu hình ứng dụng sản xuất:

export FLASK_CONF=../configs/production.py

6. Xuất biến ứng dụng flask:

export FLASK_APP=powerdnsadmin/__init__.py

7. Nâng cấp lược đồ cơ sở dữ liệu:

flask db upgrade

8. Cài đặt các phụ thuộc của dự án:

yarn install --pure-lockfile

9. Xây dựng nội dung ứng dụng Flask:

flask assets build

Chờ quá trình xây dựng hoàn tất.

10. Chạy ứng dụng với:

./run.py

Để ứng dụng chạy.

11. Ứng dụng hiện đang chạy trên localhost trên cổng 9191. Truy cập địa chỉ sau:

http://localhost:9191
trang đăng nhập quản trị powerdns cục bộ

Màn hình đăng nhập cho PowerDNS Admin hiển thị. Hiện tại, không có người dùng nào và người dùng đầu tiên bạn đăng ký sẽ là tài khoản quản trị viên.

12. Trong terminal, thoát khỏi môi trường ảo và đăng xuất khỏi người dùng root bằng lệnh:

exit

Thiết bị đầu cuối trở về trạng thái bình thường.

Bước 6: Tạo dịch vụ quản trị PowerDNS

Cấu hình PowerDNS Admin để chạy khi khởi động:

1. Tạo tệp dịch vụ systemd cho PowerDNS Admin:

sudo nano /etc/systemd/system/powerdns-admin.service

2. Thêm các nội dung sau:

[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
nội dung tập tin powerdns-admin.service

3. Tạo một tập tin đơn vị:

sudo systemctl edit --force powerdns-admin.service

4. Thêm nội dung sau:

[Service]
Environment="FLASK_CONF=../configs/production.py"
powerdns-admin.service.d ghi đè nội dung

5. Tạo một tệp socket :

sudo nano /etc/systemd/system/powerdns-admin.socket

6. Nhập thông tin sau:

[Unit]
Description=PowerDNS-Admin socket

[Socket]
ListenStream=/run/powerdns-admin/socket

[Install]
WantedBy=sockets.target
nội dung powerdns-admin.socket

7. Tạo một tập tin môi trường:

sudo nano /etc/tmpfiles.d/powerdns-admin.conf

8. Thêm thông tin sau:

d /run/powerdns-admin 0755 pdns pdns -

9. Tải lại daemon:

sudo systemctl daemon-reload

10. Khởi động và kích hoạt dịch vụ và ổ cắm:

sudo systemctl start powerdns-admin.service powerdns-admin.socket
sudo systemctl enable powerdns-admin.service powerdns-admin.socket
bật dịch vụ powerdns-admin và đầu ra thiết bị đầu cuối ổ cắm

11. Kiểm tra trạng thái bằng:

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

Các dịch vụ hiển thị đang chạy mà không có bất kỳ lỗi nào.

Bước 7: Cài đặt và cấu hình Nginx

Để cấu hình PowerDNS Admin chạy trên Nginx, hãy thực hiện như sau:

1. Cài đặt Nginx bằng:

sudo apt install nginx -y

2. Chỉnh sửa tệp cấu hình Nginx:

sudo nano /etc/nginx/conf.d/pdns-admin.conf

3. Thêm thông tin sau:

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;
  }

}

Nếu sử dụng tên máy chủ khác, hãy đổi localhostsang địa chỉ máy chủ của bạn.

4. Xác nhận tệp không có lỗi cú pháp:

nginx -t

5. Thay đổi quyền sở hữu powerdns-adminthành www-data:

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

6. Khởi động lại dịch vụ Nginx:

sudo systemctl restart nginx

7. Truy cập trang quản trị PowerDNS thông qua trình duyệt :

localhost

Nếu liên kết đến một địa chỉ khác, hãy sử dụng địa chỉ được cung cấp trong tệp cấu hình Nginx.

Bước 8: Cấu hình PowerDNS API

Để cấu hình PowerDNS API, hãy thực hiện như sau:

1. Đăng nhập vào PowerDNS Admin qua trình duyệt. Nếu chạy lần đầu tiên, trước tiên hãy tạo người dùng mới. Người dùng đầu tiên tự động là quản trị viên.

2. Mở tab Khóa API ở menu bên trái.

Khóa API của menu trang quản trị PowerDNS

3. Nhấp vào nút Thêm khóa+ .

thêm API key UI PowerDNS Admin

4. Trường Vai trò mặc định là người dùng Quản trị viên . Thêm mô tả tùy chọn cho khóa.

5. Nhấp vào Tạo khóa để tạo khóa API.

tạo khóa API PowerDNS Admin UI

6. Một cửa sổ bật lên in ra khóa. Sao chép khóa và nhấn Xác nhận để tiếp tục.

api key tạo ra powerdns admin ui

7. Điều hướng đến trang Bảng điều khiển .

8. Nhập tên miền và khóa API. Lưu thay đổi.

Giao diện cài đặt API PowerDNS pdns

9. Bật API trong cấu hình PowerDNS. Mở tệp cấu hình trong terminal:

nano /etc/powerdns/pdns.conf

10. Bỏ chú thích và thay đổi các dòng sau:

api=yes
api-key=yoursecretekey
webserver=yes

11. Lưu các thay đổi và đóng nano. API đã được thiết lập và sẵn sàng sử dụng.

Phần kết luận

Sau khi thực hiện theo các bước trong hướng dẫn này, bạn đã thiết lập PowerDNS, giao diện web quản trị PowerDNS trên Nginx và kết nối PowerDNS API.

Tiếp theo, hãy tìm hiểu về các loại bản ghi DNS khác nhau hoặc các biện pháp bảo mật DNS tốt nhất .

Add Comment

Click here to post a comment