Установите PowerDNS и PowerDNS-Admin в Ubuntu 22.04|20.04|18.04 |
В этом руководстве мы рассмотрим установку авторитетного сервера имен PowerDNS и PowerDNS-Admin в Ubuntu 22.04|20.04|18.04 версий Linux. PowerDNS — это DNS-сервер, написанный на C++ и лицензированный по лицензии GPL. Он работает на большинстве Linux и всех других производных Unix. Существует два продукта серверов имен PowerDNS — авторитетный сервер и рекурсор. В большинстве конфигураций вы комбинируете их, но PowerDNS предлагает их отдельно с возможностью плавного сочетания как авторитетного, так и рекурсивного использования.
Установите PowerDNS в Ubuntu 22.04|20.04|18.04.
В этом разделе мы собираемся установить и настроить:
- Сервер базы данных MariaDB.
- Служба PowerDNS
Шаг 1. Установите и настройте базу данных MariaDB.
Нам необходимо установить сервер базы данных, который будет использоваться PowerDNS для хранения файлов зоны. Обратите внимание, что у вас также есть возможность использовать текстовые файлы, такие как BIND. Наш сервер базы данных — MariaDB.
Для установки MariaDB на Ubuntu Linux Server:
sudo apt update
sudo apt install mariadb-server -y
После установки и запуска сервера базы данных приступайте к созданию базы данных PowerDNS и учетной записи пользователя в MariaDB.
$ sudo mysql -u root
CREATE DATABASE powerdns;
Далее необходимо создать powerdns
пользователя базы данных и назначить привилегии:
GRANT ALL ON powerdns.* TO 'powerdns'@'localhost' IDENTIFIED BY 'Str0ngPasswOrd';
Сбросьте привилегии для обновления настроек пользователя:
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)
MariaDB [powerdns]> EXIT
Bye
Теперь у нас есть база данных и пустая таблица. Теперь PowerDNS сможет запускаться с ним.
Шаг 2. Установите PowerDNS.
Ubuntu поставляется с systemd-resolve, который необходимо отключить, поскольку он привязан к порту 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 unlink /etc/resolv.conf
Затем создайте новый файл resolv.conf .
echo "nameserver 8.8.8.8" | sudo tee /etc/resolv.conf
Обратите внимание, что вы можете установить PowerDNS из официального репозитория apt или из репозитория PowerDNS. Для установки из репозитория apt выполните:
sudo apt update
sudo apt install pdns-server pdns-backend-mysql
Добавьте официальный репозиторий PowerDNS для Ubuntu 22.04|20.04|18.04.
# Ubuntu 22.04
echo "deb [arch=amd64] http://repo.powerdns.com/ubuntu jammy-auth-master main" | sudo tee /etc/apt/sources.list.d/pdns.list
# Ubuntu 20.04
echo "deb [arch=amd64] http://repo.powerdns.com/ubuntu focal-auth-master main" | sudo tee /etc/apt/sources.list.d/pdns.list
# Ubuntu 18.04
echo "deb [arch=amd64] http://repo.powerdns.com/ubuntu bionic-auth-master main" | sudo tee /etc/apt/sources.list.d/pdns.list
Импортировать ключ GPG:
curl -fsSL https://repo.powerdns.com/CBC8B383-pub.asc | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/powerdns.gpg
Обновите список пакетов и установите пакет PowerDNS (pdns-server) и серверную часть MySQL (pdns-backend-mysql).
sudo apt update
sudo apt install pdns-server pdns-backend-mysql
На вопрос, нужно ли настраивать базу данных PowerDNS с помощью dbconfig-common, ответьте Нет.
Настройте PowerDNS для использования серверной части MySQL:
Вот моя конфигурация MySQL для PowerDNS:
$ sudo vim /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=Str0ngPasswOrd
gmysql-dnssec=yes
# gmysql-socket=
Перезапустите и включите службу pdns.
sudo systemctl restart pdns
sudo systemctl enable pdns
Теперь вы можете протестировать PowerDNS, чтобы убедиться, что служба находится в сети:
$ sudo apt install net-tools -y
$ sudo netstat -tap | grep pdns
tcp 0 0 0.0.0.0:domain 0.0.0.0:* LISTEN 6211/pdns_server
tcp6 0 0 [::]:domain [::]:* LISTEN 6211/pdns_server
Проверьте, правильно ли отвечает служба PowerDNS:
$ dig @127.0.0.1
; <<>> DiG 9.16.1-Ubuntu <<>> @127.0.0.1
; (1 server found)
;; global options: +cmd
;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: REFUSED, id: 14054
;; flags: qr rd; QUERY: 1, ANSWER: 0, AUTHORITY: 0, ADDITIONAL: 1
;; WARNING: recursion requested but not available
;; OPT PSEUDOSECTION:
; EDNS: version: 0, flags:; udp: 1232
;; QUESTION SECTION:
;. IN NS
;; Query time: 0 msec
;; SERVER: 127.0.0.1#53(127.0.0.1)
;; WHEN: Wed Apr 28 11:04:57 UTC 2021
;; MSG SIZE rcvd: 28
Установите PowerDNS-Admin в Ubuntu 22.04|20.04|18.04.
PowerDNS-Admin — это веб-интерфейс PowerDNS со следующими расширенными функциями:
- Управление несколькими доменами
- Шаблон домена
- Управление пользователями
- Управление доступом пользователей на основе домена
- Журналирование активности пользователей
- Аутентификация пользователя локальной базы данных/LDAP/Active Directory
- Поддержка аутентификации SAML
- Аутентификация Google OAuth
- Аутентификация Github OAuth
- Поддержка двухфакторной аутентификации (TOTP)
- Статистика Dashboard и сервиса pdns
- Поддержка протокола DynDNS 2
- Редактируйте PTR IPv6, используя адреса IPv6 напрямую (больше не нужно редактировать буквальные адреса!)
Установите пакет разработки Python 3.
sudo apt install python3-dev
Установите необходимые пакеты для сборки библиотек Python из файла require.txt.
sudo apt install -y libmysqlclient-dev libsasl2-dev libldap2-dev libssl-dev libxml2-dev libxslt1-dev libxmlsec1-dev libffi-dev pkg-config apt-transport-https virtualenv build-essential python3-venv
Установите Node.js
curl -sL https://deb.nodesource.com/setup_16.x | sudo bash -
sudo apt install -y nodejs
Установите Yarn для создания файлов ресурсов:
curl -fsSL https://dl.yarnpkg.com/debian/pubkey.gpg | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/yarn-keyring.gpg
echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list
sudo apt update
sudo apt install -y yarn
Извлеките исходный код и создайте virtualenv:
sudo su -
git clone https://github.com/ngoduykhanh/PowerDNS-Admin.git /opt/web/powerdns-admin
cd /opt/web/powerdns-admin
python3 -mvenv ./venv
Активируйте среду Python3 и установите библиотеки:
source ./venv/bin/activate
pip install --upgrade pip
pip install -r requirements.txt
Перед запуском PowerDNS-Admin нам необходимо настроить подключение к базе данных.
cp /opt/web/powerdns-admin/configs/development.py /opt/web/powerdns-admin/configs/production.py
vim /opt/web/powerdns-admin/configs/production.py
Это необходимая конфигурация:
- Информация о подключении к БД
- Конечная точка службы API PNDS и ключ API
- Используемый номер порта
- Привязать адрес
Закомментируйте строку SQLite SQLALCHEMY_DATABASE_URI
и раскомментируйте строку MySQL:
### DATABASE CONFIG
SQLA_DB_USER = 'powerdns'
SQLA_DB_PASSWORD = 'Str0ngPasswOrd'
SQLA_DB_HOST = '127.0.0.1'
SQLA_DB_NAME = 'powerdns'
SQLALCHEMY_TRACK_MODIFICATIONS = True
### DATABASE - MySQL
#SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'pdns.db')
SQLALCHEMY_DATABASE_URI = 'mysql://'+SQLA_DB_USER+':'+SQLA_DB_PASSWORD+'@'+SQLA_DB_HOST+'/'+SQLA_DB_NAME
См. скриншот ниже:
Как только ваша конфигурация будет готова. Создайте схему базы данных, выполнив команды:
(flask) $ export FLASK_APP=powerdnsadmin/__init__.py
(flask) $ export FLASK_CONF=../configs/production.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
INFO [alembic.runtime.migration] Running upgrade 787bdba9e147 -> 59729e468045, Add view column to setting table
INFO [alembic.runtime.migration] Running upgrade 59729e468045 -> 1274ed462010, Change setting.value data type
INFO [alembic.runtime.migration] Running upgrade 1274ed462010 -> 4a666113c7bb, Adding Operator Role
INFO [alembic.runtime.migration] Running upgrade 4a666113c7bb -> 31a4ed468b18, Remove all setting in the DB
INFO [alembic.runtime.migration] Running upgrade 31a4ed468b18 -> 654298797277, Upgrade DB Schema
INFO [alembic.runtime.migration] Running upgrade 654298797277 -> 0fb6d23a4863, Remove user avatar
INFO [alembic.runtime.migration] Running upgrade 0fb6d23a4863 -> 856bb94b7040, Add comment column in domain template record table
INFO [alembic.runtime.migration] Running upgrade 856bb94b7040 -> b0fea72a3f20, Update domain serial columns type
INFO [alembic.runtime.migration] Running upgrade b0fea72a3f20 -> 3f76448bb6de, Add user.confirmed column
INFO [alembic.runtime.migration] Running upgrade 3f76448bb6de -> 0d3d93f1c2e0, Add domain_id to history table
Исправление ошибки «Ошибка импорта: невозможно импортировать имя «json» из «itsdangerous» » — это отслеживается по проблемам Github.
# Only if you have error ImportError: cannot import name 'json' from 'itsdangerous'
$ pip uninstall itsdangerous
$ pip install itsdangerous==2.0.1
$ flask db upgrade
Затем запустите dbmigrate
:
(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 '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'
INFO [alembic.autogenerate.compare] Detected removed index 'namealgoindex' on 'tsigkeys'
INFO [alembic.autogenerate.compare] Detected removed table 'tsigkeys'
INFO [alembic.autogenerate.compare] Detected removed index 'domainidindex' on 'cryptokeys'
INFO [alembic.autogenerate.compare] Detected removed table 'cryptokeys'
INFO [alembic.autogenerate.compare] Detected removed table 'supermasters'
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 'nametype_index' on 'records'
INFO [alembic.autogenerate.compare] Detected removed table 'records'
INFO [alembic.autogenerate.compare] Detected added index 'ix_history_created_on' on '['created_on']'
Generating /opt/web/powerdns-admin/migrations/versions/57130833385e_init_db.py ... done
Создайте файлы ресурсов с помощью пряжи:
(flask)$ yarn install --pure-lockfile
yarn install v1.22.17
[1/4] Resolving packages...
[2/4] Fetching packages...
[3/4] Linking dependencies...
[4/4] Building fresh packages...
Done in 15.49s.
(flask)$ flask assets build
Building bundle: generated/login.js
[2022-02-21 22:45:55,106] [script.py:167] INFO - Building bundle: generated/login.js
Building bundle: generated/validation.js
[2022-02-21 22:45:55,267] [script.py:167] INFO - Building bundle: generated/validation.js
Building bundle: generated/login.css
[2022-02-21 22:45:55,270] [script.py:167] INFO - Building bundle: generated/login.css
Building bundle: generated/main.js
[2022-02-21 22:46:28,632] [script.py:167] INFO - Building bundle: generated/main.js
Building bundle: generated/main.css
[2022-02-21 22:46:29,536] [script.py:167] 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
Настройте службу systemd и Nginx
Мы собираемся управлять PowerDNS-Admin с помощью systemd.
Создайте файл сервисного модуля, как показано ниже:
$ sudo vim /etc/systemd/system/powerdns-admin.service
[Install]
WantedBy=multi-user.target
[Unit]
Description=PowerDNS-Admin
Requires=powerdns-admin.socket
After=network.target
[Service]
PIDFile=/run/powerdns-admin/pid
User=pdns
Group=pdns
WorkingDirectory=/opt/web/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 tee /etc/systemd/system/powerdns-admin.service.d/override.conf<<EOF
[Service]
Environment="FLASK_CONF=../configs/production.py"
EOF
Создать файл сокета
$ sudo vim /etc/systemd/system/powerdns-admin.socket
[Unit]
Description=PowerDNS-Admin socket
[Socket]
ListenStream=/run/powerdns-admin/socket
[Install]
WantedBy=sockets.target
Создать файл среды
$ sudo vim /etc/tmpfiles.d/powerdns-admin.conf
d /run/powerdns-admin 0755 pdns pdns -
Службу Powerdns-Admin и настройте ее запуск при загрузке:
sudo systemctl daemon-reload
sudo systemctl restart powerdns-admin.socket
sudo systemctl enable powerdns-admin.socket
Установите разрешения для
sudo chown -R pdns:pdns /run/powerdns-admin
sudo chown -R pdns:pdns /opt/web/powerdns-admin
Подтвердите, что статус — «работает»:
$ systemctl status powerdns-admin.socket
● powerdns-admin.socket - PowerDNS-Admin socket
Loaded: loaded (/etc/systemd/system/powerdns-admin.socket; enabled; vendor preset: enabled)
Active: active (listening) since Mon 2022-02-21 22:50:04 UTC; 5min ago
Triggers: ● powerdns-admin.service
Listen: /run/powerdns-admin/socket (Stream)
Tasks: 0 (limit: 4677)
Memory: 0B
CGroup: /system.slice/powerdns-admin.socket
Установите и настройте Nginx для Powerdns-Admin
Установите Nginx, используя:
sudo apt install nginx
Настроить Nginx
sudo vim /etc/nginx/conf.d/powerdns-admin.conf
Добавьте контент, как показано ниже:
server {
listen *:80;
server_name powerdns-admin.example.com;
index index.html index.htm index.php;
root /opt/web/powerdns-admin;
access_log /var/log/nginx/powerdns_admin_access.log combined;
error_log /var/log/nginx/powerdns_admin_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;
}
}
Проверьте синтаксис nginx, затем перезапустите службу nginx:
$ sudo nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
$ sudo systemctl restart nginx
Посетите веб-интерфейс PowerDNS-Admin.
http://powerdns-admin.example.com/
Нажмите кнопку Создать аккаунт и зарегистрируйте пользователя. Первый пользователь будет с ролью Администратора.
Когда вы входите в систему с созданным именем пользователя и паролем, вы должны получить интерфейс, как показано ниже:
Настройка API PowerDNS
Отредактируйте файл конфигурации PowerDNS и включите встроенный API:
$ sudo vim /etc/powerdns/pdns.conf
# Configure like below
webserver-port=8081
api=yes
api-key=f5ee4390-6542-48c9-a2a0-e5d0bd399490 #You can generate one from https://codepen.io/corenominal/pen/rxOmMJ
Перезапустите службу powerdns:
sudo systemctl restart powerdns-admin
Предоставьте информацию о соединении API PowerDNS, прежде чем PowerDNS-Admin сможет запросить ваши данные PowerDNS. Это делается в разделе Настройки > PDNS.
Наслаждайтесь администрированием PowerDNS с помощью PowerDNS-Admin на сервере Ubuntu 22.04|20.04|18.04.
Ссылка:
- Документация PowerDNS
- Страница администратора PowerDNS на Github
Похожие статьи:
Как установить и настроить Dnsmasq в Ubuntu
Как настроить ISPConfig DNS только на CentOS 7