23 KiB
Документация по 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