This commit is contained in:
2025-03-17 07:48:47 +05:00
parent a2cf9d2860
commit 04b8e941d1
7 changed files with 1317 additions and 457 deletions

649
PowerDNS_install.md Normal file
View File

@ -0,0 +1,649 @@
Документация по PowerDNS: https://doc.powerdns.com/authoritative/installation.html
****************************************************************************************************
## 2. Подключаемся к нужному серверу
```sh
ssh igor@192.168.200.85 -p 22
```
****************************************************************************************************
DynDNS на PowerDNS авторитативный сервер тот кто отвечает на те домены которые в его базе (рекурсивный присылает авторитативному запросы)
DNS на Ubuntu 24.04 согласно инстркции https://phoenixnap.com/kb/powerdns-ubuntu:
Можно было-бы использовать не 53 порт, но провайдер не даёт указывать порт при настройке DNS серверов (не знаю какие локальные проблемы могут возникнуть если задать не 53 порт)
Устанавливаем сам PowerDNS https://doc.powerdns.com/authoritative/installation.html
```sh
sudo apt-get update &&
sudo apt-get upgrade -y
```
```sh
sudo apt-get install pdns-server -y &&
sudo apt-get install pdns-backend-pgsql -y &&
sudo apt-get install pdns-backend-sqlite
```
----------------------------------------------------------------------------------------------------
Для использования SQLIte копируем схему из https://doc.powerdns.com/authoritative/backends/generic-sqlite3.html
```sh
sudo apt-get install pdns-backend-sqlite3 -y
```
```sh
sudo apt install sqlite3 -y
```
Create database:
```sh
sudo sqlite3 /var/lib/powerdns/pdns.sqlite3 ".databases" &&
sudo chown pdns:pdns /var/lib/powerdns/pdns.sqlite3
```
Create database structure
```sql
sudo sqlite3 /var/lib/powerdns/pdns.sqlite3 <<EOF
PRAGMA foreign_keys = 1;
CREATE TABLE domains (
id INTEGER PRIMARY KEY,
name VARCHAR(255) NOT NULL COLLATE NOCASE,
master VARCHAR(128) DEFAULT NULL,
last_check INTEGER DEFAULT NULL,
type VARCHAR(8) NOT NULL,
notified_serial INTEGER DEFAULT NULL,
account VARCHAR(40) DEFAULT NULL,
options VARCHAR(65535) DEFAULT NULL,
catalog VARCHAR(255) DEFAULT NULL
);
CREATE UNIQUE INDEX name_index ON domains(name);
CREATE INDEX catalog_idx ON domains(catalog);
CREATE TABLE records (
id INTEGER PRIMARY KEY,
domain_id INTEGER DEFAULT NULL,
name VARCHAR(255) DEFAULT NULL,
type VARCHAR(10) DEFAULT NULL,
content VARCHAR(65535) DEFAULT NULL,
ttl INTEGER DEFAULT NULL,
prio INTEGER DEFAULT NULL,
disabled BOOLEAN DEFAULT 0,
ordername VARCHAR(255),
auth BOOL DEFAULT 1,
FOREIGN KEY(domain_id) REFERENCES domains(id) ON DELETE CASCADE ON UPDATE CASCADE
);
CREATE INDEX records_lookup_idx ON records(name, type);
CREATE INDEX records_lookup_id_idx ON records(domain_id, name, type);
CREATE INDEX records_order_idx ON records(domain_id, ordername);
CREATE TABLE supermasters (
ip VARCHAR(64) NOT NULL,
nameserver VARCHAR(255) NOT NULL COLLATE NOCASE,
account VARCHAR(40) NOT NULL
);
CREATE UNIQUE INDEX ip_nameserver_pk ON supermasters(ip, nameserver);
CREATE TABLE comments (
id INTEGER PRIMARY KEY,
domain_id INTEGER NOT NULL,
name VARCHAR(255) NOT NULL,
type VARCHAR(10) NOT NULL,
modified_at INT NOT NULL,
account VARCHAR(40) DEFAULT NULL,
comment VARCHAR(65535) NOT NULL,
FOREIGN KEY(domain_id) REFERENCES domains(id) ON DELETE CASCADE ON UPDATE CASCADE
);
CREATE INDEX comments_idx ON comments(domain_id, name, type);
CREATE INDEX comments_order_idx ON comments (domain_id, modified_at);
CREATE TABLE domainmetadata (
id INTEGER PRIMARY KEY,
domain_id INT NOT NULL,
kind VARCHAR(32) COLLATE NOCASE,
content TEXT,
FOREIGN KEY(domain_id) REFERENCES domains(id) ON DELETE CASCADE ON UPDATE CASCADE
);
CREATE INDEX domainmetaidindex ON domainmetadata(domain_id);
CREATE TABLE cryptokeys (
id INTEGER PRIMARY KEY,
domain_id INT NOT NULL,
flags INT NOT NULL,
active BOOL,
published BOOL DEFAULT 1,
content TEXT,
FOREIGN KEY(domain_id) REFERENCES domains(id) ON DELETE CASCADE ON UPDATE CASCADE
);
CREATE INDEX domainidindex ON cryptokeys(domain_id);
CREATE TABLE tsigkeys (
id INTEGER PRIMARY KEY,
name VARCHAR(255) COLLATE NOCASE,
algorithm VARCHAR(50) COLLATE NOCASE,
secret VARCHAR(255)
);
CREATE UNIQUE INDEX namealgoindex ON tsigkeys(name, algorithm);
EOF
```
Configure database connection from PowerDNS to SQLIte
```sh
sudo tee /etc/powerdns/pdns.d/pdns.local.sqlite.conf <<EOF
launch=gsqlite3
gsqlite3-database=/var/lib/powerdns/pdns.sqlite3
EOF
```
Set access level to file
```sh
sudo chown pdns: /etc/powerdns/pdns.d/pdns.local.sqlite.conf &&
sudo chmod 640 /etc/powerdns/pdns.d/pdns.local.sqlite.conf
```
In PowerDNS configured to auto read config from dir /etc/powerdns/pdns.d/
----------------------------------------------------------------------------------------------------
Подключаюсь к базе и создаю схему базу со схемой из: https://doc.powerdns.com/authoritative/backends/generic-postgresql.html
Настраиваю соединение с базой данных в:
```sh
sudo tee /etc/powerdns/pdns.d/pdns.local.gpgsql.conf <<EOF
launch+=gpgsql
# gmysql parameters
gpgsql-host=127.0.0.1
gpgsql-port=5432
gpgsql-dbname=powerdns
gpgsql-user=powerdns
gpgsql-password=y7HMHi0ATxx1VC3UU5WG
gpgsql-dnssec=no
EOF
```
Set access level to file:
```sh
sudo chown pdns: /etc/powerdns/pdns.d/pdns.local.gpgsql.conf &&
sudo chmod 640 /etc/powerdns/pdns.d/pdns.local.gpgsql.conf
```
----------------------------------------------------------------------------------------------------
На всякий случай делаю резервные копии исходных файлов настрое:
```sh
cd /etc/powerdns &&
sudo cp named.conf named.conf.bak &&
sudo cp pdns.conf pdns.conf.bak
```
Наспройку файла pdns.conf авторитетный сервер, есть такой пример который следует изучить: https://raw.githubusercontent.com/trinv/PowerDNS/a56b9122f4a2de9c1f789009f09b9831f74d8bf1/pdns.template.master.conf (естественно без 1й табуляции):
```sh
sudo mcedit /etc/powerdns/pdns.conf
```
Write new settings rr
```sh
cd /etc/powerdns/ &&
sudo tee pdns.conf > /dev/null <<EOF
allow-axfr-ips=127.0.0.1 #slave server ip
also-notify=127.0.0.1 #slave server ip
include-dir=/etc/powerdns/pdns.d
launch=
local-address=192.168.200.85,127.0.0.1
local-port=5300
log-dns-details=on
log-dns-queries=yes
log-timestamp=yes
loglevel=4
webserver=yes
webserver-address=192.168.200.85
webserver-allow-from=::/0, 0.0.0.0/0
webserver-port=8081
master=yes
slave=no
# Также активирую API
api=yes
api-key=40c89f2a-e2f3-4ff8-a245-3547111f6677
EOF
```
Проверяю соединение к базе перезапустив PowerDNS:
```sh
sudo systemctl stop pdns &&
sudo pdns_server --daemon=no --guardian=no --loglevel=9
```
Пытаемся открыть WEB интерфейс
```sh
start http://192.168.200.85:8081
```
Если всё норм выполняем:
```sh
sudo systemctl restart pdns &&
sudo systemctl enable pdns &&
sudo systemctl status pdns
```
Проверяем что порт 5300 открыт для DNS:
```sh
sudo ss -alnp4 | grep pdns
```
Если что-то не получается то проверяем кто слушает на порту 53
```sh
sudo apt-get install net-tools -y &&
sudo netstat -tulnp | grep :5300
```
Создаём зону и добавляем запись
```sh
sudo pdnsutil create-zone test ns1.test &&
sudo pdnsutil add-record test ccalm A 192.168.200.184
```
Проверим список зон
```sh
sudo pdnsutil list-all-zones &&
sudo pdnsutil list-zone test
```
Проверяем отвечалет ли:
```sh
dig @127.0.0.1 -p 5300 ccalm.test A
```
## ********** Настройка рекурсивного DNS от PowerDNS Recursor 4.9.3 порту 53 будет обрабатывать запросы с локальной машины **********
Документация: https://doc.powerdns.com/recursor/index.html
Документация: https://docs.powerdns.com/recursor/indexTOC.html
Чтобы работал резольвер от PowerDNS а не тот который от ubuntu на 53 порту нужно:
```sh
sudo apt-get install pdns-recursor -y
```
Скачиваем список корневых серверов DNS (желательно обновлять раз в несколько месяцев)
```sh
sudo wget -O /usr/share/dns/root.hints https://www.internic.net/domain/named.cache &&
sudo chown pdns:pdns /usr/share/dns/root.hints
```
```sh
sudo mkdir -p /var/run/pdns-recursor &&
sudo chown pdns:pdns /var/run/pdns-recursor &&
sudo chmod 755 /var/run/pdns-recursor
```
```sh
sudo mcedit /etc/powerdns/recursor.conf
```
Чтобы все запросы с . уходили на публичные DNS Google:
```conf
#dnssec=off #чтобы не проверял то что записано в forward-zones через корневые серверы
local-address=192.168.200.85,127.0.0.1
#forward-zones=local=127.0.0.1:5300 # Отправлять .local в авторитативный
#forward-zones+=.=8.8.8.8;8.8.4.4 # Все остальное в интернет
forward-zones=test=127.0.0.1:5300
#forward-zones-recurse=+test=127.0.0.1:5300
```
Либо если оставить настройку "nssec=process" то нужно прописать в /etc/powerdns/recursor.lua добавить комкнду addNTA, если не добавить то forward-zones не будет отрабатывать. Также можно сделать чтобы dirt.kz не выходил с наружи и с резу перенаправлялся на нужный IP с временем жизни минута 30 секунд.
```lua
addNTA("test", "Local test zone")
```
Пробуем запустить без сервиса чтобы посмотреть что выведит в лог
```sh
sudo pdns_recursor --daemon=no --loglevel=9
```
Чтобы запросы переходили на pdns-recursor
Затем перезагружаем:
```sh
sudo systemctl restart pdns-recursor &&
sudo systemctl status pdns-recursor
```
Проверяем что порт 53 открыт для DNS:
```sh
sudo ss -alnp4 | grep pdns
```
Если что-то не получается то проверяем кто слушает на порту 53
```sh
sudo apt-get install net-tools -y &&
sudo netstat -tulnp | grep :53
```
Проверяем что преобразование DNS нормально работает:
```sh
dig @192.168.200.85 google.com
```
если уже настроил PowerDNS сервер то можно попробовать отправить:
```sh
sudo rec_control wipe-cache test &&
sudo rec_control wipe-cache ccalm.test &&
dig @192.168.200.85 -p 53 ccalm.test
```
```sh
dig @127.0.0.1 -p 53 ccalm.test A
```
```sh
dig +trace @192.168.200.85 -p 53 ccalm.test
```
Проверяем логи
```sh
sudo journalctl -u pdns-recursor --since "10 min ago"
```
Или так чтобы найти ошибки:
```sh
sudo journalctl -u pdns-recursor --no-pager | grep -i failed
```
```sh
journalctl -u pdns-recursor --no-pager | tail -n 50
```
----------------------------------------------------------------------------------------------------
## ********** По идее отключать не нужно так как systemd-resolved использует другой IP: 127.0.0.54:53 (Отключаю systemd-resolved иначе он будет конфликтовать с PowerDNS) **********
Редактирую /etc/netplan/ для того чтобы прописать поднятый DNS сервер на 127.0.0.1 (не знаю сработает ли так как отключу systemd-resolved)
```sh
sudo mcedit /etc/netplan/50-cloud-init.yaml
```
И прописываю в него:
```conf
nameserver 127.0.0.1
```
After configuration modification update settings:
```sh
sudo netplan apply
```
Смотрим что сгенерировалось автоматически в resolv.conf после модификации файла
```sh
cat /etc/resolv.conf
```
Проверяем что интернет не перестал работать:
```sh
ping changelogs.ubuntu.com
```
Может быть что команда выше пытается по IP6 работать тогда попробовать по
```sh
ping -4 changelogs.ubuntu.com
```
Либо так:
```sh
ping6 changelogs.ubuntu.com
```
Взглянем на текущие DNS сервера, у меня такое выдало: DNS Servers: 195.210.46.195 195.210.46.132 на команду ниже:
```sh
resolvectl status
```
Отредактировал файл /etc/systemd/resolved.conf заменив nameservers на 8.8.8.8 и 8.8.4.4
```sh
sudo mcedit /etc/systemd/resolved.conf
```
Проверяем структуру файла:
```sh
sudo yamllint /etc/netplan/50-cloud-init.yaml
```
Применяем настройки:
```sh
sudo netplan apply
```
Проверяем что настройки изменились:
```sh
resolvectl status
```
Изменил /etc/systemd/resolved.conf настроив так:
```conf
[Resolve]
DNS=8.8.8.8 8.8.4.4
FallbackDNS=1.1.1.1 1.0.0.1
```
Потом перезагрузил:
```sh
sudo systemctl restart systemd-resolved
```
Проверяем что заняло порт 53 командой:
```sh
sudo lsof -i :53
```
Выдало:
```text
COMMAND PID USER FD TYPE DEVICE SIZE/OFF NODE NAME
systemd-r 670 systemd-resolve 13u IPv4 20070 0t0 UDP localhost:domain
systemd-r 670 systemd-resolve 14u IPv4 20071 0t0 TCP localhost:domain (LISTEN)
```
Останавливаем systemd-resolved (поисковик IP по домену по умолчанию от Ubuntu)
```sh
sudo systemctl stop systemd-resolved &&
sudo systemctl disable systemd-resolved
```
----------------------------------------------------------------------------------------------------
## ********** Устанавливаю PowerAdmin (желательно в докере устанавливать) **********
Устанавливаю PowerAdmin согласно: https://phoenixnap.com/kb/powerdns-ubuntu#ftoc-heading-6
```sh
sudo apt install libpq-dev -y &&
sudo apt install python3-dev -y &&
sudo apt install python3-flask -y &&
sudo apt install python3-pip -y
```
```sh
sudo 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 &&
sudo apt install -y nodejs &&
sudo apt install -y yarn
```
устанавливаем другие зависимости:
```sh
sudo apt install npm -y &&
sudo apt remove yarn -y &&
curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | sudo apt-key add - &&
echo "deb https://dl.yarnpkg.com/debian/ stable main" | sudo tee /etc/apt/sources.list.d/yarn.list &&
sudo apt update &&
sudo apt install yarn -y &&
yarn --version &&
sudo yarn install --pure-lockfile
```
Create user for run PowerDNS Admin
```sh
sudo useradd -m -s /bin/bash powerdns-admin
```
Clone the PowerDNS Admin Git repository to /opt/web/powerdns-admin
```sh
cd ~
sudo git clone https://github.com/PowerDNS-Admin/PowerDNS-Admin.git /opt/web/powerdns-admin &&
sudo chown -R powerdns-admin:powerdns-admin /opt/web/powerdns-admin &&
cd /opt/web/powerdns-admin
```
Настраиваем переменные окружения:
```sh
sudo -u powerdns-admin -s &&
cd /opt/web/powerdns-admin
```
Устанавливаем перенеммые окружения и необходимые скрипты
```sh
python3 -mvenv ./venv &&
source ./venv/bin/activate &&
pip install --upgrade pip &&
pip install -r requirements.txt
```
Создаю базу данных
```sh
mkdir /opt/web/powerdns-admin/data &&
sqlite3 /opt/web/powerdns-admin/data/pdnsa.sqlite3 ".databases"
```
Cекретный ключ можно сгенерировать при помощи такой команды:
```sh
python3 -c "import secrets; print(secrets.token_hex(16))"
```
Такой сгенерил для 192.168.200.85: 1c100fb414b8116725a04015fbaf907e
Конфигугрируем PowerDNS Admin.
Для начала копирую пример конфигураци, потом открываю его в редакторе:
```sh
cp /opt/web/powerdns-admin/configs/development.py /opt/web/powerdns-admin/configs/production.py
```
```sh
mcedit /opt/web/powerdns-admin/configs/production.py
```
И редактируем следующие строки:
```conf
#import urllib.parse
SECRET_KEY = 'e951e5a1f4b94151b360f47edf596dd0'
SQLA_DB_PASSWORD = 'changeme'
```
Также настраиваю подключение к базе данных (сам строку составил):
```conf
SQLALCHEMY_DATABASE_URI = 'postgresql://powerdns:y7HMHi0ATxx1VC3UU5WG@127.0.0.1/powerdnsadmin'
```
Либо к новой базе данных:
```conf
SQLALCHEMY_DATABASE_URI = 'sqlite:////opt/web/powerdns-admin/data/pdnsa.sqlite3'
```
Остальное коментирую:
```conf
#SQLA_DB_USER = 'powerdns'
#SQLA_DB_PASSWORD = 'y7HMHi0ATxx1VC3UU5WG'
#SQLA_DB_HOST = '127.0.0.1'
#SQLA_DB_NAME = 'powerdnsadmin'
#SQLALCHEMY_DATABASE_URI = 'postgres://{}:{}@{}/{}'.format(
# urllib.parse.quote_plus(SQLA_DB_USER),
# urllib.parse.quote_plus(SQLA_DB_PASSWORD),
# SQLA_DB_HOST,
# SQLA_DB_NAME
#)
#SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'pdns.db')
```
Экспортируем переменную:
```sh
cd /opt/web/powerdns-admin &&
export FLASK_CONF=../configs/production.py &&
export FLASK_APP=powerdnsadmin/__init__.py
```
```sh
pip install --upgrade pip setuptools wheel &&
pip install setuptools &&
pip install flask-mail
```
Upgrade the database schema:
```sh
export PYTHONWARNINGS="ignore" &&
flask db upgrade
```
Если выдаёт ошибки то правим исзодный код:
```sh
mcedit /opt/web/powerdns-admin/powerdnsadmin/lib/utils.py
```
И заменяем экранирование
```python
# строку
from distutils.version import StrictVersion
# На строки
from packaging.version import Version as StrictVersion
from setuptools._distutils.util import strtobool
```
```sh
deactivate
```
```sh
sudo su - powerdns-admin
```
```sh
cd /opt/web/powerdns-admin &&
flask assets build
```
Можно запускать (нужно задать переменные окружения которые выше):
```sh
cd /opt/web/powerdns-admin &&
source venv/bin/activate &&
./run.py
```
Проще запустить с использованием SQLite по инструкции из: https://github.com/PowerDNS-Admin/PowerDNS-Admin/blob/master/docs/wiki/install/Running-PowerDNS-Admin-on-Ubuntu-or-Debian.md
Теперь можно открыть
```sh
open http://192.168.200.85:9191/login
```
Для создания административного пользователя нажимаем "Create an account" пример https://orcacore.com/set-up-powerdns-ubuntu-22-04/
Создал с именем igor и ппаролем !Ii123456
!!! Проверь что PowerDNS API включён в /etc/powerdns/pdns.conf !!!
----------------------------------------------------------------------------------------------------
Настраиваем запус на постоянную работу через Gunicorn и systemd
```sh
cd /opt/web/powerdns-admin &&
source venv/bin/activate &&
pip install gunicorn
```
```sh
exit
```
Создаю файл службы:
```sh
sudo tee /etc/systemd/system/powerdns-admin.service > /dev/null <<EOF
[Unit]
Description=PowerDNS-Admin Service
After=network.target
[Service]
User=powerdns-admin
Group=powerdns-admin
WorkingDirectory=/opt/web/powerdns-admin
Environment="FLASK_CONF=../configs/production.py"
Environment="FLASK_APP=powerdnsadmin/__init__.py"
ExecStart=/opt/web/powerdns-admin/venv/bin/gunicorn --workers 2 --bind 192.168.200.85:9191 "powerdnsadmin:create_app()"
Restart=always
RestartSec=5s
[Install]
WantedBy=multi-user.target
EOF
```
```sh
sudo systemctl enable powerdns-admin.service &&
sudo systemctl start powerdns-admin.service
```
```sh
sudo systemctl status powerdns-admin.service
```
```sh
sudo journalctl -u powerdns-admin.service
```
```sh
start http://192.168.200.85:9191/login
```