Как установить PowerDNS и PowerDNS-Admin в Ubuntu 18.04 / Debian 9 с бэкэндом MariaDB

Как установить PowerDNS и PowerDNS-Admin в Ubuntu 18.04 / Debian 9 с бэкэндом MariaDB

 

В этом руководстве мы расскажем об установке PowerDNS Authoritative Name Server и PowerDNS-Admin в Ubuntu 18.04 и Debian 9 версий Linux. PowerDNS — это DNS-сервер, написанный на C ++ и лицензированный по лицензии GPL. Он работает на большинстве Linux и всех других производных Unix. На момент написания этой статьи последняя версия — версия 4.1.X.

Установите PowerDNS в Ubuntu 18.04 / Debian 9

В этом разделе мы собираемся установить и настроить:

  • Сервер базы данных MariaDB.
  • Сервис PowerDNS

Шаг 1: Установите и настройте сервер базы данных MariaDB

Нам нужно установить сервер базы данных, который будет использоваться PowerDNS для хранения файлов зон. Обратите внимание, что у вас также есть возможность использовать текстовые файлы, такие как BIND. Наш сервер баз данных — MariaDB.

Для установки MariaDB на Ubuntu 18.04, проверьте

Установите MariaDB 10.x на Ubuntu 18.04 и CentOS 7

Для Debian 9 / Debian используйте:

Как установить MariaDB 10.4 на Debian 9 / Debian 8

После того, как сервер базы данных установлен и запущен, перейдите к созданию базы данных и учетной записи пользователя PowerDNS в MariaDB.

$ mysql -u root -p
CREATE DATABASE powerdns;

Далее следует создать powerdns базу данных пользователя и назначить привилегии:

GRANT ALL ON powerdns.* TO 'powerdns'@'localhost' \
IDENTIFIED BY 'strongpassword';

Сбросьте привилегии для обновления пользовательских настроек:

FLUSH PRIVILEGES;

Переключитесь на powerdnsбазу данных для создания таблиц:

USE powerdns;

Создайте необходимые таблицы:

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

Вы можете подтвердить, что ваши таблицы созданы:

MariaDB [powerdns]> show tables;
+--------------------+
| Tables_in_powerdns |
+--------------------+
| comments           |
| cryptokeys         |
| domainmetadata     |
| domains            |
| records            |
| supermasters       |
| tsigkeys           |
+--------------------+
7 rows in set (0.000 sec)

Теперь у нас есть база данных и пустая таблица. PowerDNS теперь должен запускаться вместе с ним.

Шаг 2. Установите PowerDNS в Ubuntu 18.04 / Debian 9

Ubuntu 18.04 поставляется с systemd-resolv, который необходимо отключить, поскольку он привязывается к порту  53,  который конфликтует с портами PowerDNS.

Выполните следующие команды, чтобы отключить разрешенную службу:

sudo systemctl disable systemd-resolved
sudo systemctl stop systemd-resolved

Кроме того, удалите символьный файл resolv.conf

$ ls -lh /etc/resolv.conf 
lrwxrwxrwx 1 root root 39 Jul 24 15:50 /etc/resolv.conf -> ../run/systemd/resolve/stub-resolv.conf
$ sudo rm /etc/resolv.conf

Затем создайте новый файл resolv.conf .

sudo echo "nameserver 8.8.8.8" > /etc/resolv.conf

Обратите внимание, что вы можете установить PowerDNS из официального репозитория apt или из репозитория PowerDNS. Чтобы установить из репозитория apt, запустите:

sudo apt-get update 
sudo apt-get install pdns-server pdns-backend-mysql

Добавьте официальный репозиторий PowerDNS для Ubuntu 18.04.

$ cat /etc/apt/sources.list.d/pdns.list
deb [arch=amd64] http://repo.powerdns.com/ubuntu bionic-auth-41 main

Импортировать ключ GPG:

curl https://repo.powerdns.com/FD380FBB-pub.asc | sudo apt-key add -

Обновите список пакетов и установите пакет PowerDNS ( pdns-сервер ) и серверную часть MySQL ( pdns-backend-mysql ).

sudo apt-get update
sudo apt-get install pdns-server pdns-backend-mysql

Для Debian 9 установите пакеты из репозитория apt, не добавляя новый репозиторий:

sudo apt-get update
sudo apt-get install pdns-server pdns-backend-mysql

На вопрос, нужно ли настроить базу данных PowerDNS с помощью  dbconfig-common,  ответьте «  Нет»

Настройте PowerDNS для использования бэкэнда MySQL:

Вот моя конфигурация MySQL для PowerDNS:

# cat /etc/powerdns/pdns.d/pdns.local.gmysql.conf 
# MySQL Configuration
# Launch gmysql backend
launch+=gmysql
# gmysql parameters
gmysql-host=localhost
gmysql-port=3306
gmysql-dbname=powerdns
gmysql-user=powerdns
gmysql-password=strongpassword
gmysql-dnssec=yes
# gmysql-socket=

Перезапустите службу pdns

sudo systemctl restart pdns

Теперь вы можете протестировать PowerDNS, чтобы убедиться, что сервис находится в сети:

# netstat -tap | grep pdns

tcp        0      0 0.0.0.0:domain          0.0.0.0:*               LISTEN      31719/pdns_server   
tcp6       0      0 [::]:domain             [::]:*                  LISTEN      31719/pdns_server   

Проверьте, правильно ли отвечает служба PowerDNS:

# dig @127.0.0.1

; <<>> DiG 9.11.3-1ubuntu1.1-Ubuntu <<>> @127.0.0.1
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: REFUSED, id: 65465
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available

;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1680
;; QUESTION SECTION:
;.				IN	NS

;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Fri Aug 10 15:57:10 UTC 2018
;; MSG SIZE  rcvd: 28

Установка PowerDNS-Admin на Ubuntu 18.04 / Debian 9

PowerDNS-Admin — это веб-интерфейс PowerDNS со следующими расширенными функциями:

  • Управление несколькими доменами
  • Шаблон домена
  • Управление пользователями
  • Управление доступом пользователей на основе домена
  • Регистрация активности пользователя
  • Аутентификация пользователя локальной БД / LDAP / Active Directory
  • Поддержка аутентификации SAML
  • Google OAuth-аутентификация
  • Github OAuth-аутентификация
  • Поддержка двухфакторной аутентификации (TOTP)
  • Статистика службы Dashboard и pdns
  • Поддержка протокола DynDNS 2
  • Редактируйте IPv6 PTR, используя адреса IPv6 напрямую (больше не нужно редактировать буквальные адреса!)

Установка пакет разработки Python 3

sudo apt-get install python3-dev

Установите необходимые пакеты для сборки библиотек Python из файла needs.txt

sudo apt-get install -y libmysqlclient-dev python-mysqldb libsasl2-dev libffi-dev \
libldap2-dev libssl-dev libxml2-dev libxslt1-dev libxmlsec1-dev pkg-config

Установите пряжу для создания файлов активов:

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

Извлеките исходный код и создайте virtualenv:

git clone https://github.com/ngoduykhanh/PowerDNS-Admin.git /opt/web/powerdns-admin
cd /opt/web/powerdns-admin
virtualenv -p python3 flask

Вывод:

Already using interpreter /usr/bin/python3
Using base prefix '/usr'
New python executable in /opt/web/powerdns-admin/flask/bin/python3
Also creating executable in /opt/web/powerdns-admin/flask/bin/python
Installing setuptools, pkg_resources, pip, wheel...done.

Активируйте среду Python3 и установите библиотеки:

. ./flask/bin/activate
pip install -r requirements.txt

Создать и настроить базу данных:

$ mysql -u root -p
CREATE DATABASE powerdnsadmin;
GRANT ALL PRIVILEGES ON powerdnsadmin.* TO 'pdnsadminuser'@'%' \
IDENTIFIED BY 'strongpassword';
FLUSH PRIVILEGES;
quit

Перед запуском PowerDNS-Admin убедитесь, что у вас есть config.py . Давайте создадим один из шаблона:

cp config_template.py config.py

Отредактируйте файл в

vim config.py

Это требуемый конфиг:

  • Информация о подключении к БД
  • Конечная точка службы PNDS API и ключ API
  • Номер порта используется
  • Адрес привязки

Закомментируйте SQLite SQLALCHEMY_DATABASE_URIстроку и удалите комментарий из MySQL:

# DATABASE CONFIG
#You'll need MySQL-python
SQLA_DB_USER = 'powerdns'
SQLA_DB_PASSWORD = 'strongpassword'
SQLA_DB_HOST = 'localhost'
SQLA_DB_NAME = 'powerdns'

#MySQL
SQLALCHEMY_DATABASE_URI = 'mysql://'+SQLA_DB_USER+':'\
+SQLA_DB_PASSWORD+'@'+SQLA_DB_HOST+'/'+SQLA_DB_NAME
#SQLite
#SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'pdns.db')

Смотрите скриншот ниже:

Как только вы ваш config.py готов. Создайте схему базы данных, выполнив команды:

(flask) $ export FLASK_APP=app/__init__.py
(flask)$ flask db upgrade
INFO [alembic.runtime.migration] Context impl MySQLImpl.
INFO [alembic.runtime.migration] Will assume non-transactional DDL.
INFO [alembic.runtime.migration] Running upgrade -> 787bdba9e147, Init DB

Затем запустите db migrate:

(flask)$ flask db migrate -m "Init DB"
INFO [alembic.runtime.migration] Context impl MySQLImpl.
INFO [alembic.runtime.migration] Will assume non-transactional DDL.
INFO [alembic.autogenerate.compare] Detected removed index 'domainidindex' on 'cryptokeys'
INFO [alembic.autogenerate.compare] Detected removed table 'cryptokeys'
INFO [alembic.autogenerate.compare] Detected removed index 'namealgoindex' on 'tsigkeys'
INFO [alembic.autogenerate.compare] Detected removed table 'tsigkeys'
INFO [alembic.autogenerate.compare] Detected removed table 'supermasters'
INFO [alembic.autogenerate.compare] Detected removed index 'nametype_index' on 'records'
INFO [alembic.autogenerate.compare] Detected removed table 'records'
INFO [alembic.autogenerate.compare] Detected removed index 'domainmetadata_idx' on 'domainmetadata'
INFO [alembic.autogenerate.compare] Detected removed table 'domainmetadata'
INFO [alembic.autogenerate.compare] Detected removed index 'name_index' on 'domains'
INFO [alembic.autogenerate.compare] Detected removed table 'domains'
INFO [alembic.autogenerate.compare] Detected removed index 'comments_name_type_idx' on 'comments'
INFO [alembic.autogenerate.compare] Detected removed index 'comments_order_idx' on 'comments'
INFO [alembic.autogenerate.compare] Detected removed table 'comments'
Generating /opt/web/powerdns-
admin/migrations/versions/42ca771ac430_init_db.py ... done

Создайте файлы активов с помощью пряжи:

(flask)$ yarn install --pure-lockfile
yarn install v1.9.4
[1/4] Resolving packages...
[2/4] Fetching packages...
[3/4] Linking dependencies...
[4/4] Building fresh packages...
Done in 14.59s.

(flask)$ flask assets build
Building bundle: generated/login.js
[INFO] Building bundle: generated/login.js
Building bundle: generated/login.css
[INFO] Building bundle: generated/login.css
Building bundle: generated/main.js
[INFO] Building bundle: generated/main.js
Building bundle: generated/main.css
[INFO] Building bundle: generated/main.css

Проверьте, что ваш PowerDNS-Admin работает нормально:

(flask)$ ./run.py
[INFO] * Running on http://127.0.0.1:9191/ (Press CTRL+C to quit)
[INFO] * Restarting with stat
[WARNING] * Debugger is active!
[INFO] * Debugger PIN: 466-405-858

Настройте системный сервис и Nginx

Мы собираемся управлять PowerDNS-Admin с помощью systemd. Создайте файл сервисной единицы, как показано ниже:

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

[Service]
User=root
Group=root
WorkingDirectory=/opt/web/powerdns-admin
ExecStart=/opt/web/powerdns-admin/flask/bin/gunicorn --workers 2 --bind unix:/opt/web/powerdns-admin/powerdns-admin.sock app:app

[Install]
WantedBy=multi-user.target

Запустите службу Powerdns-Admin и настройте ее на загрузку:

sudo systemctl daemon-reload
sudo systemctl start powerdns-admin
sudo systemctl enable powerdns-admin

Убедитесь, что статус работает:

# systemctl status powerdns-admin
● powerdns-admin.service - PowerDNS-Admin
   Loaded: loaded (/etc/systemd/system/powerdns-admin.service; enabled; vendor preset: enabled)
   Active: active (running) since Fri 2018-08-10 16:45:16 UTC; 22s ago
 Main PID: 10405 (gunicorn)
    Tasks: 3 (limit: 1152)
   CGroup: /system.slice/powerdns-admin.service
           ├─10405 /opt/web/powerdns-admin/flask/bin/python3 /opt/web/powerdns-admin/flask/bin/gunicorn --workers 2 --bind unix:/opt/web/powerdns-admi
           ├─10427 /opt/web/powerdns-admin/flask/bin/python3 /opt/web/powerdns-admin/flask/bin/gunicorn --workers 2 --bind unix:/opt/web/powerdns-admi
           └─10428 /opt/web/powerdns-admin/flask/bin/python3 /opt/web/powerdns-admin/flask/bin/gunicorn --workers 2 --bind unix:/opt/web/powerdns-admi

Aug 10 16:45:16 ubuntu-01 systemd[1]: Started PowerDNS-Admin.
Aug 10 16:45:17 ubuntu-01 gunicorn[10405]: [2018-08-10 16:45:17 +0000] [10405] [INFO] Starting gunicorn 19.7.1
Aug 10 16:45:17 ubuntu-01 gunicorn[10405]: [2018-08-10 16:45:17 +0000] [10405] [INFO] Listening at: unix:/opt/web/powerdns-admin/powerdns-admin.sock (
Aug 10 16:45:17 ubuntu-01 gunicorn[10405]: [2018-08-10 16:45:17 +0000] [10405] [INFO] Using worker: sync
Aug 10 16:45:17 ubuntu-01 gunicorn[10405]: [2018-08-10 16:45:17 +0000] [10427] [INFO] Booting worker with pid: 10427
Aug 10 16:45:17 ubuntu-01 gunicorn[10405]: [2018-08-10 16:45:17 +0000] [10428] [INFO] Booting worker with pid: 10428

Установите и настройте Nginx для Powerdns-Admin

Установите Nginx, используя:

sudo apt-get install nginx

Настроить Nginx

sudo vim /etc/nginx/conf.d/powerdns-admin.conf

Добавить контент, как показано ниже:

server {
  listen *:80;
  server_name               powerdns-admin.example.com www.powerdns-admin.example.com;

  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/app;

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

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

  location / {
    proxy_pass            http://unix:/opt/web/powerdns-admin/powerdns-admin.sock;
    proxy_read_timeout    120;
    proxy_connect_timeout 120;
    proxy_redirect        off;
  }
}

Проверьте синтаксис nginx и перезапустите службу nginx:

# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

# systemctl restart nginx

Посетите веб-интерфейс PowerDNS-Admin.

http://powerdns-admin.example.com/

Нажмите кнопку «Создать учетную запись»  и зарегистрируйте пользователя. Первый пользователь будет в роли администратора .

Когда вы входите с созданным именем пользователя и паролем, вы должны получить интерфейс, как показано ниже:

 

Наслаждайтесь администрированием PowerDNS с PowerDNS-Admin на сервере Ubuntu 18.04 / Debian 9.

Один комментарий

Комментарии закрыты.