# Conflicts:
#	DNS/PowerDNS_install.md
This commit is contained in:
2025-05-15 21:20:52 +05:00
16 changed files with 1214 additions and 1103 deletions

597
DNS/PowerDNS_install.md Normal file
View File

@ -0,0 +1,597 @@
Документация по PowerDNS: https://doc.powerdns.com/authoritative/installation.html
****************************************************************************************************
## 2. Подключаемся к нужному серверу
```sh
ssh igor@192.168.200.85 -p 22
```
Connect to CCALM Georgia infrastructure:
```sh
ssh igor@88.218.94.134 -p 2200
```
****************************************************************************************************
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
```
Install PowerDNS server
```sh
sudo apt-get install pdns-server -y
```
На всякий случай делаю резервные копии исходных файлов настрое:
```sh
cd /etc/powerdns &&
sudo cp named.conf named.conf.bak &&
sudo cp pdns.conf pdns.conf.bak
```
----------------------------------------------------------------------------------------------------
Как настроить MariaDB базу для использования в PowerDNS смотри:
[Установка PowerDNS с MariaDB](./PowerDNS_install_MarinaDB.md)
----------------------------------------------------------------------------------------------------
Как настроить SQLite3 базу для использования в PowerDNS смотри:
[Установка PowerDNS с MariaDB](./PowerDNS_install_SQIite3.md)
----------------------------------------------------------------------------------------------------
Как настроить PostgreSQL базу для использования в PowerDNS смотри:
[Установка PowerDNS с MariaDB](./PowerDNS_install_PostgreSQL.md)
----------------------------------------------------------------------------------------------------
Наспройку файла 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
also-notify=127.0.0.1
include-dir=/etc/powerdns/pdns.d
launch=
local-address=88.218.94.134,127.0.0.1
local-port=53
log-dns-details=on
log-dns-queries=yes
log-timestamp=yes
loglevel=4
webserver=yes
webserver-address=127.0.0.1
webserver-allow-from=::/0, 0.0.0.0/0
webserver-port=8091
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://88.218.94.134: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 :53
```
Создаём зону и добавляем запись
```sh
sudo pdnsutil create-zone test ns1.test &&
sudo pdnsutil add-record test ccalm A 192.168.200.184
```
Добавляем зону и две записи
```sh
sudo pdnsutil create-zone geovizor.top &&
sudo pdnsutil replace-rrset geovizor.top @ SOA "ns1.geovizor.top admin.geovizor.top $(date +%Y%m%d)01 10800 3600 604800 3600" &&
sudo pdnsutil add-record geovizor.top ns1 A 88.218.94.134 &&
sudo pdnsutil add-record geovizor.top ns2 A 88.218.94.134 &&
sudo pdnsutil add-record geovizor.top @ A 88.218.94.134 &&
sudo pdnsutil add-record geovizor.top * A 88.218.94.134 &&
sudo pdnsutil add-record geovizor.top @ CAA 3600 "0 issue \"letsencrypt.org\"" &&
sudo pdnsutil add-record geovizor.top @ TXT 3600 "\"v=spf1 ip4:88.218.94.134 -all\"" &&
sudo pdnsutil add-record geovizor.top @ MX 3600 "10 mail.geovizor.top." &&
sudo pdnsutil add-record geovizor.top mail A 3600 88.218.94.134 &&
sudo pdnsutil add-record geovizor.top powerdns A 3600 88.218.94.134
```
```sh
sudo pdnsutil create-zone locust.ge &&
sudo pdnsutil replace-rrset locust.ge @ SOA "ns1.geovizor.top admin.locust.ge $(date +%Y%m%d)01 10800 3600 604800 3600" &&
sudo pdnsutil add-record locust.ge @ A 88.218.94.134 &&
sudo pdnsutil add-record locust.ge * A 88.218.94.134 &&
sudo pdnsutil add-record locust.ge @ CAA 3600 "0 issue \"letsencrypt.org\"" &&
sudo pdnsutil add-record locust.ge @ TXT 3600 "\"v=spf1 ip4:88.218.94.134 -all\"" &&
sudo pdnsutil add-record locust.ge @ MX 3600 "10 mail.locust.ge." &&
sudo pdnsutil add-record locust.ge mail A 3600 88.218.94.134
sudo pdnsutil add-record locust.ge @ NS 3600 ns1.geovizor.top
sudo pdnsutil add-record locust.ge @ NS 3600 ns2.geovizor.top
```
For deleting record please run command:
```sh
pdnsutil delete-rrset locust.ge locust.ge.locust.ge NS
```
Выше задал такие настройки как
```conf
Refresh = 10800 (3 часа)
Retry = 3600 (1 час)
Expire = 604800 (1 неделя)
Minimum = 3600 (1 час)
```
Проверим список зон
```sh
sudo pdnsutil list-all-zones &&
sudo pdnsutil list-zone geovizor.top
```
Проверяем отвечалет ли:
```sh
dig @127.0.0.1 -p 5300 ccalm.test A
```
```sh
dig @127.0.0.1 -p 53 geovizor.top A
```
```sh
dig @88.218.94.134 -p 53 geovizor.top A
```
```sh
dig @88.218.94.134 -p 53 powerdns.geovizor.top A
```
### Теперь можно настроить HTTPS для взаимодействия через API с сервером для динамического задания IP адресов
```sh
API_KEY="40c89f2a-e2f3-4ff8-a245-3547111f6677"
SERVER="156.244.31.209"
ZONE="geovizor.top"
curl -X PATCH \
-H "X-API-Key: $API_KEY" \
-H "Content-Type: application/json" \
"http://$SERVER:8081/api/v1/servers/localhost/zones/$ZONE" \
-d '{
"rrsets": [
{
"name": "*.geovizor.top.",
"type": "A",
"ttl": 3600,
"changetype": "REPLACE",
"records": [
{
"content": "5.251.54.197",
"disabled": false
}
]
}
]
}'
```
## ********** Настройка рекурсивного 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
```