Files
Ubuntu_docs/DNS/PowerDNS_install.md
2025-08-25 07:41:03 +05:00

679 lines
23 KiB
Markdown
Raw Permalink Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

Документация по PowerDNS: https://doc.powerdns.com/authoritative/installation.html
****************************************************************************************************
## 2. Подключаемся к нужному серверу
```sh
ssh root@bigfoottrade.kz -p 2222
```
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
Для установки версии поновее PowerDNS 4.8.5:
```sh
sudo apt install curl gnupg lsb-release &&
curl https://repo.powerdns.com/FD380FBB-pub.asc | sudo gpg --dearmor -o /etc/apt/trusted.gpg.d/pdns.gpg &&
echo "deb [signed-by=/etc/apt/trusted.gpg.d/pdns.gpg] http://repo.powerdns.com/ubuntu $(lsb_release -cs)-auth-48 main" | sudo tee /etc/apt/sources.list.d/pdns.list
```
```sh
sudo apt-get update &&
sudo apt-get upgrade -y
```
Install PowerDNS server
```sh
sudo apt-get install pdns-server -y &&
sudo apt-get install pdns-backend-bind
```
----------------------------------------------------------------------------------------------------
Как настроить MariaDB базу для использования в PowerDNS смотри:
[Установка PowerDNS с MariaDB](./PowerDNS_install_MarinaDB.md)
----------------------------------------------------------------------------------------------------
Как настроить SQLite3 базу для использования в PowerDNS смотри:
[Установка PowerDNS с SQIite3](./PowerDNS_install_SQIite3.md)
----------------------------------------------------------------------------------------------------
Как настроить PostgreSQL базу для использования в PowerDNS смотри:
[Установка PowerDNS с PostgreSQL](./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
```
```sh
sudo mkdir /var/run/pdns &&
sudo chown pdns:pdns /var/run/pdns &&
sudo chmod 750 /var/run/pdns
```
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=bind
local-address=77.240.38.108,127.0.0.1
local-port=53
log-dns-details=on
log-dns-queries=yes
log-timestamp=yes
loglevel=4
webserver=yes
webserver-address=0.0.0.0
webserver-allow-from=::/0, 0.0.0.0/0
webserver-port=8070
master=yes
slave=no
# Также активирую API
api=yes
api-key=40c89f2a-e2f3-4ff8-a245-3547111f6677
EOF
```
```sh
sudo chown pdns:pdns /etc/powerdns/pdns.conf &&
sudo chmod 640 /etc/powerdns/pdns.conf
```
Также пробуем запустить под pdns:
```sh
sudo rm -f /var/run/pdns.controlsocket &&
sudo -u pdns /usr/sbin/pdns_server --config-dir=/etc/powerdns
```
Проверяю соединение к базе перезапустив PowerDNS:
```sh
sudo systemctl stop pdns &&
sudo pdns_server --daemon=no --guardian=no --loglevel=9
```
Пытаемся открыть WEB интерфейс
```sh
start http://77.240.38.108:8070
```
Если всё норм выполняем:
```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 mesh.kz &&
sudo pdnsutil replace-rrset mesh.kz @ SOA "ns1.mesh.kz admin.mesh.kz $(date +%Y%m%d)01 10800 3600 604800 3600" &&
sudo pdnsutil add-record mesh.kz @ A 5.251.150.30 &&
sudo pdnsutil add-record mesh.kz "*" A 5.251.150.30 &&
sudo pdnsutil add-record mesh.kz @ CAA 3600 "0 issue \"letsencrypt.org\"" &&
sudo pdnsutil add-record mesh.kz @ TXT 3600 "\"v=spf1 ip4:77.240.38.108 -all\"" &&
sudo pdnsutil add-record mesh.kz @ MX 3600 "10 mail.mesh.kz." &&
sudo pdnsutil add-record mesh.kz mail A 3600 77.240.38.108
sudo pdnsutil add-record mesh.kz @ NS 3600 ns1.mesh.kz
sudo pdnsutil add-record mesh.kz @ NS 3600 ns2.mesh.kz
```
```sh
sudo pdnsutil create-zone dirt.kz &&
sudo pdnsutil replace-rrset dirt.kz @ SOA "ns1.dirt.kz admin.dirt.kz $(date +%Y%m%d)01 10800 3600 604800 3600" &&
sudo pdnsutil add-record dirt.kz @ A 5.251.150.30 &&
sudo pdnsutil add-record dirt.kz "*" A 5.251.150.30 &&
sudo pdnsutil add-record dirt.kz @ CAA 3600 "0 issue \"letsencrypt.org\"" &&
sudo pdnsutil add-record dirt.kz @ TXT 3600 "\"v=spf1 ip4:77.240.38.108 -all\"" &&
sudo pdnsutil add-record dirt.kz @ MX 3600 "10 mail.dirt.kz." &&
sudo pdnsutil add-record dirt.kz mail A 3600 77.240.38.108 &&
sudo pdnsutil add-record dirt.kz @ NS 3600 ns1.dirt.kz &&
sudo pdnsutil add-record dirt.kz @ NS 3600 ns2.dirt.kz &&
sudo pdnsutil add-record dirt.kz ns1 A 77.240.38.108 &&
sudo pdnsutil add-record dirt.kz ns2 A 77.240.38.108
```
```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 @ A 5.251.150.30 &&
sudo pdnsutil add-record geovizor.top "*" A 5.251.150.30 &&
sudo pdnsutil add-record geovizor.top @ CAA 3600 "0 issue \"letsencrypt.org\"" &&
sudo pdnsutil add-record geovizor.top @ TXT 3600 "\"v=spf1 ip4:77.240.38.108 -all\"" &&
sudo pdnsutil add-record geovizor.top @ MX 3600 "10 mail.geovizor.top." &&
sudo pdnsutil add-record geovizor.top mail A 3600 77.240.38.108 &&
sudo pdnsutil add-record geovizor.top @ NS 3600 ns1.geovizor.top &&
sudo pdnsutil add-record geovizor.top @ NS 3600 ns2.geovizor.top &&
sudo pdnsutil add-record geovizor.top ns1 A 77.240.38.108 &&
sudo pdnsutil add-record geovizor.top ns2 A 77.240.38.108
```
```sh
sudo pdnsutil create-zone locust.kz &&
sudo pdnsutil replace-rrset locust.kz @ SOA "ns1.locust.kz admin.locust.kz $(date +%Y%m%d)01 10800 3600 604800 3600" &&
sudo pdnsutil add-record locust.kz @ A 5.251.150.30 &&
sudo pdnsutil add-record locust.kz "*" A 5.251.150.30 &&
sudo pdnsutil add-record locust.kz @ CAA 3600 "0 issue \"letsencrypt.org\"" &&
sudo pdnsutil add-record locust.kz @ TXT 3600 "\"v=spf1 ip4:77.240.38.108 -all\"" &&
sudo pdnsutil add-record locust.kz @ MX 3600 "10 mail.locust.kz." &&
sudo pdnsutil add-record locust.kz mail A 3600 77.240.38.108
sudo pdnsutil add-record locust.kz @ NS 3600 ns1.locust.kz
sudo pdnsutil add-record locust.kz @ NS 3600 ns2.locust.kz
```
```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
sudo pdnsutil delete-rrset locust.ge locust.ge.locust.ge NS
sudo pdnsutil delete-rrset geovizor.top gotify A
```
Выше задал такие настройки как
```conf
Refresh = 10800 (3 часа)
Retry = 3600 (1 час)
Expire = 604800 (1 неделя)
Minimum = 3600 (1 час)
```
Проверим список зон
```sh
sudo pdnsutil list-all-zones &&
sudo pdnsutil list-zone mesh.kz
```
Проверяем отвечалет ли:
```sh
dig @127.0.0.1 -p 53 mesh.kz A
```
dig @77.240.38.108 -p 53 mesh.kz 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
new_ip_address=
FILE=/etc/ddns/mesh.txt
if test -f "$FILE"; then
new_ip_address=`cat $FILE`
rm $FILE
fi
len=${#new_ip_address}
if [ $len -gt 3 ]
then
echo "New IP address = $new_ip_address"
else
echo "Not find IP address"
exit
fi
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 **********
Редактирую /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
```