Files
Ubuntu_docs/DNS/PowerDNS_install.md

23 KiB
Raw Blame History

Документация по PowerDNS: https://doc.powerdns.com/authoritative/installation.html


2. Подключаемся к нужному серверу

ssh root@bigfoottrade.kz -p 2222

Connect to CCALM Georgia infrastructure:

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:

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
	sudo apt-get update &&
	sudo apt-get upgrade -y

Install PowerDNS server

	sudo apt-get install pdns-server -y &&
	sudo apt-get install pdns-backend-bind

Как настроить MariaDB базу для использования в PowerDNS смотри: Установка PowerDNS с MariaDB

Как настроить SQLite3 базу для использования в PowerDNS смотри: Установка PowerDNS с SQIite3

Как настроить PostgreSQL базу для использования в PowerDNS смотри: Установка PowerDNS с PostgreSQL

Наспройку файла pdns.conf авторитетный сервер, есть такой пример который следует изучить: https://raw.githubusercontent.com/trinv/PowerDNS/a56b9122f4a2de9c1f789009f09b9831f74d8bf1/pdns.template.master.conf (естественно без 1й табуляции):

  sudo mcedit /etc/powerdns/pdns.conf
sudo mkdir /var/run/pdns &&
sudo chown pdns:pdns /var/run/pdns &&
sudo chmod 750 /var/run/pdns

Write new settings rr

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
  sudo chown pdns:pdns /etc/powerdns/pdns.conf &&
  sudo chmod 640 /etc/powerdns/pdns.conf

Также пробуем запустить под pdns:

sudo rm -f /var/run/pdns.controlsocket &&
sudo -u pdns /usr/sbin/pdns_server --config-dir=/etc/powerdns

Проверяю соединение к базе перезапустив PowerDNS:

	sudo systemctl stop pdns &&
	sudo pdns_server --daemon=no --guardian=no --loglevel=9

Пытаемся открыть WEB интерфейс

start http://77.240.38.108:8070

Если всё норм выполняем:

	sudo systemctl restart pdns &&
	sudo systemctl enable pdns &&
	sudo systemctl status pdns

Проверяем что порт 5300 открыт для DNS:

	sudo ss -alnp4 | grep pdns

Если что-то не получается то проверяем кто слушает на порту 53

	sudo apt-get install net-tools -y &&
	sudo netstat -tulnp | grep :53

Создаём зону и добавляем запись

sudo pdnsutil create-zone test ns1.test &&
sudo pdnsutil add-record test ccalm A 192.168.200.184

Добавляем зону и записи

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
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
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
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
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:

sudo pdnsutil delete-rrset locust.ge locust.ge.locust.ge NS
sudo pdnsutil delete-rrset geovizor.top gotify A

Выше задал такие настройки как

Refresh    = 10800 (3 часа)  
Retry      = 3600 (1 час)  
Expire     = 604800 (1 неделя)  
Minimum    = 3600 (1 час)

Проверим список зон

sudo pdnsutil list-all-zones &&
sudo pdnsutil list-zone geovizor.top

Проверяем отвечалет ли:

dig @127.0.0.1 -p 53 mesh.kz A

dig @77.240.38.108 -p 53 mesh.kz A

dig @127.0.0.1 -p 53 geovizor.top A
dig @88.218.94.134 -p 53 geovizor.top A
dig @88.218.94.134 -p 53 powerdns.geovizor.top A

Теперь можно настроить HTTPS для взаимодействия через API с сервером для динамического задания IP адресов

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 порту нужно:

	sudo apt-get install pdns-recursor -y

Скачиваем список корневых серверов DNS (желательно обновлять раз в несколько месяцев)

  sudo wget -O /usr/share/dns/root.hints https://www.internic.net/domain/named.cache &&
  sudo chown pdns:pdns /usr/share/dns/root.hints
  sudo mkdir -p /var/run/pdns-recursor &&
  sudo chown pdns:pdns /var/run/pdns-recursor &&
  sudo chmod 755 /var/run/pdns-recursor
	sudo mcedit /etc/powerdns/recursor.conf

Чтобы все запросы с . уходили на публичные DNS Google:

#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 секунд.

addNTA("test", "Local test zone") 

Пробуем запустить без сервиса чтобы посмотреть что выведит в лог

sudo pdns_recursor --daemon=no --loglevel=9

Чтобы запросы переходили на pdns-recursor Затем перезагружаем:

	sudo systemctl restart pdns-recursor &&
	sudo systemctl status pdns-recursor

Проверяем что порт 53 открыт для DNS:

	sudo ss -alnp4 | grep pdns

Если что-то не получается то проверяем кто слушает на порту 53

	sudo apt-get install net-tools -y &&
	sudo netstat -tulnp | grep :53

Проверяем что преобразование DNS нормально работает:

	dig @192.168.200.85 google.com

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

	sudo rec_control wipe-cache test &&
	sudo rec_control wipe-cache ccalm.test &&
	dig @192.168.200.85 -p 53 ccalm.test
  dig @127.0.0.1 -p 53 ccalm.test A
  dig +trace @192.168.200.85 -p 53 ccalm.test

Проверяем логи

  sudo journalctl -u pdns-recursor --since "10 min ago"

Или так чтобы найти ошибки:

sudo journalctl -u pdns-recursor --no-pager | grep -i failed
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)

sudo mcedit /etc/netplan/50-cloud-init.yaml

И прописываю в него:

	nameserver 127.0.0.1

After configuration modification update settings:

	sudo netplan apply

Смотрим что сгенерировалось автоматически в resolv.conf после модификации файла

	cat /etc/resolv.conf

Проверяем что интернет не перестал работать:

	ping changelogs.ubuntu.com

Может быть что команда выше пытается по IP6 работать тогда попробовать по

	ping -4 changelogs.ubuntu.com

Либо так:

	ping6 changelogs.ubuntu.com

Взглянем на текущие DNS сервера, у меня такое выдало: DNS Servers: 195.210.46.195 195.210.46.132 на команду ниже:

	resolvectl status

Отредактировал файл /etc/systemd/resolved.conf заменив nameservers на 8.8.8.8 и 8.8.4.4

sudo mcedit /etc/systemd/resolved.conf

Проверяем структуру файла:

sudo yamllint /etc/netplan/50-cloud-init.yaml

Применяем настройки:

	sudo netplan apply

Проверяем что настройки изменились:

	resolvectl status

Изменил /etc/systemd/resolved.conf настроив так:

	[Resolve]
	DNS=8.8.8.8 8.8.4.4
	FallbackDNS=1.1.1.1 1.0.0.1

Потом перезагрузил:

	sudo systemctl restart systemd-resolved

Проверяем что заняло порт 53 командой:

	sudo lsof -i :53

Выдало:

	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)

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

********** Устанавливаю PowerAdmin (желательно в докере устанавливать) **********

Устанавливаю PowerAdmin согласно: https://phoenixnap.com/kb/powerdns-ubuntu#ftoc-heading-6

	sudo apt install libpq-dev -y &&
	sudo apt install python3-dev -y &&
	sudo apt install python3-flask -y &&
	sudo apt install python3-pip -y
	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

устанавливаем другие зависимости:

	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

  sudo useradd -m -s /bin/bash powerdns-admin

Clone the PowerDNS Admin Git repository to /opt/web/powerdns-admin

	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

Настраиваем переменные окружения:

	sudo -u powerdns-admin -s &&
	cd /opt/web/powerdns-admin

Устанавливаем перенеммые окружения и необходимые скрипты

	python3 -mvenv ./venv &&
	source ./venv/bin/activate &&
	pip install --upgrade pip &&
	pip install -r requirements.txt

Создаю базу данных

  mkdir /opt/web/powerdns-admin/data &&
  sqlite3 /opt/web/powerdns-admin/data/pdnsa.sqlite3 ".databases"

Cекретный ключ можно сгенерировать при помощи такой команды:

  python3 -c "import secrets; print(secrets.token_hex(16))"

Такой сгенерил для 192.168.200.85: 1c100fb414b8116725a04015fbaf907e

Конфигугрируем PowerDNS Admin. Для начала копирую пример конфигураци, потом открываю его в редакторе:

	cp /opt/web/powerdns-admin/configs/development.py /opt/web/powerdns-admin/configs/production.py
	mcedit /opt/web/powerdns-admin/configs/production.py

И редактируем следующие строки:

	#import urllib.parse
	SECRET_KEY = 'e951e5a1f4b94151b360f47edf596dd0'
	SQLA_DB_PASSWORD = 'changeme'

Также настраиваю подключение к базе данных (сам строку составил):

	SQLALCHEMY_DATABASE_URI = 'postgresql://powerdns:y7HMHi0ATxx1VC3UU5WG@127.0.0.1/powerdnsadmin'

Либо к новой базе данных:

	SQLALCHEMY_DATABASE_URI = 'sqlite:////opt/web/powerdns-admin/data/pdnsa.sqlite3'

Остальное коментирую:

	#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')

Экспортируем переменную:

	cd /opt/web/powerdns-admin &&
	export FLASK_CONF=../configs/production.py &&
	export FLASK_APP=powerdnsadmin/__init__.py
pip install --upgrade pip setuptools wheel &&
pip install setuptools &&
pip install flask-mail

Upgrade the database schema:

	export PYTHONWARNINGS="ignore" &&
	flask db upgrade

Если выдаёт ошибки то правим исзодный код:

  mcedit /opt/web/powerdns-admin/powerdnsadmin/lib/utils.py

И заменяем экранирование

  # строку
  from distutils.version import StrictVersion
  # На строки
  from packaging.version import Version as StrictVersion
  from setuptools._distutils.util import strtobool
  deactivate
sudo su - powerdns-admin
	cd /opt/web/powerdns-admin &&
	flask assets build

Можно запускать (нужно задать переменные окружения которые выше):

	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

Теперь можно открыть

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

  cd /opt/web/powerdns-admin &&
  source venv/bin/activate &&
  pip install gunicorn
exit

Создаю файл службы:

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
  sudo systemctl enable powerdns-admin.service &&
  sudo systemctl start powerdns-admin.service
sudo systemctl status powerdns-admin.service
sudo journalctl -u powerdns-admin.service
start http://192.168.200.85:9191/login