Документация по 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 geovizor.top ``` Проверяем отвечалет ли: ```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 ```