Новые каталоги

This commit is contained in:
Igor I
2025-05-15 09:04:57 +05:00
parent aa0179f6c0
commit 7380add41d
14 changed files with 1728 additions and 1673 deletions

204
DNS/BIND_install.md Normal file
View File

@ -0,0 +1,204 @@
****************************************************************************************************
Собственный DynDNS на Linux для observer.kz для начала устанавливаем BIND 9.13 and later по этому мануалу https://www.dmosk.ru/miniinstruktions.php?mini=bind-ubuntu и по этому для новой версии https://www.netss.by/?p=26
```sh
sudo apt-get update &&
sudo apt-get install bind9 dnsutils &&
sudo apt-get install bind9utils
```
Adding the service to autostart
```sh
systemctl enable bind9
```
Checking if the service is working
```sh
nslookup dmosk.ru 127.0.0.1
```
Opening the configuration file
```sh
mcedit /etc/bind/named.conf.options
```
Для глобальных запросов добавляем строку: allow-query { any; };
Также добавляем в этот файл DNS сервера пересылки, на них будут перенаправляться запросы если локальный не содержит данных
//forwarders {
// 8.8.8.8;
// 8.8.4.4;
//};
Проверяем настройки командой (ответ должен быть пустым):
sudo named-checkconf
Перезагружаем:
sudo systemctl restart bind9
Проверяю версию BIND:
named -v
Выдало: BIND 9.16.1-Ubuntu (Stable Release) <id:d497c32>
Можно проверить какой IP выдаст на DNS запрос
dig locust.kz A
На этом базовая настройка закончена. Наш сервер готов принимать и отдавать запросы и работать, как кэширующий dns.
Далее создаём клиента согласно: https://help.ubuntu.ru/wiki/динамический_днс_своими_руками
Перейдем в него.
cd /etc/bind/
Генерируем пару ключь для обмена информацией между клиентом и сервером:
sudo tsig-keygen -a hmac-sha512 dirt.kz > dirt.kz.key
sudo tsig-keygen -a hmac-sha512 locust.kz > locust.kz.key
Для загрузки ключа добавляем его файл mcedit /etc/bind/named.conf строчку с указанием файла, где определен ключ.
include "/etc/bind/dirt.kz.key";
include "/etc/bind/locust.kz.key";
Следующим шагом необходимо в файл mcedit /etc/bind/named.conf.local прописать доменную зону, которой мы оперируем.
zone "dirt.kz" {
type master;
allow-update {key dirt.kz;};
file "/var/cache/bind/dirt.kz";
};
zone "locust.kz" {
type master;
allow-update {key locust.kz;};
file "/var/cache/bind/locust.kz";
};
В файле "mcedit /var/cache/bind/dirt.kz" должны быть прописанны записи домена где:
В файле "mcedit /var/cache/bind/locust.kz" должны быть прописанны записи домена где:
Поле $ORIGIN для подставки имени в знак @, поэтому знак @ не используется просто так в тексте
Если используется символ @ то он заменяется на то что было прописанно в $ORIGIN смотреть в: https://help.dyn.com/how-to-format-a-zone-file/
SOA — Начало полномочий подробней смотри в https://k.psu.ru/wiki/BIND9_(методическое_пособие)#SOA
NS — Сервер имён
A — рекорд
MX — Почта для обмена
CN — Каноническое имя
PTR — указатель
И таким содержимым:
$ORIGIN dirt.kz
$TTL 604800
@ IN SOA bigfoottrade.kz. root.bigfoottrade.kz. (
8 ; Serial
604800 ; Refresh
86400 ; Retry
2419200 ; Expire
604800 ) ; Negative Cache TTL
;
@ IN NS bigfoottrade.kz.
Второй файл для locust.kz:
$ORIGIN .
$TTL 604800 ; 1 week
locust.kz IN SOA bigfoottrade.kz. irigm.mail.ru. (
134 ; serial
604800 ; refresh (1 week)
86400 ; retry (1 day)
1419200 ; expire (2 weeks 2 days 10 hours 13 minutes 20 seconds)
604800 ; minimum (1 week)
)
NS bigfoottrade.kz.
$TTL 3600 ; 1 hour
A 5.76.254.182
$ORIGIN locust.kz.
* A 127.0.0.1
Правлю права доступа:
sudo chown -R bind:bind /etc/bind
Если настройки были первоначальными то стоит удалить файл /var/cache/bind/locust.kz.jnl и переинициализировать его командой:
sudo rndc reconfig
Потом следует вызвать:
sudo systemctl restart bind9
Команда выше также переписывет накопившиеся данные из /var/cache/bind/locust.kz.jnl в /var/cache/bind/locust.kz так что после обновления если охото быстрей взглянуть на текстовое значение следует повторно вызвать эту команду
После настроек сервера перезагружаем его:
sudo named-checkconf
sudo rndc reload
sudo systemctl restart bind9
sudo rndc status
journalctl | grep bind
sudo journalctl -u bind9 -n 50
Создаю скрипт /etc/ddns/ddns.sh для обновления доменных зон удалённо с доступом по ключу:
Файл из примера:
#!/bin/bash
TTL=3600
SERVER=ns.dyndns.my
HOSTNAME=dhost.dyndns.my
ZONE=dyndns.my
KEYFILE=Kdyndns.my.+157+48025.private
new_ip_address=`curl http://dyndns.my/ip.php` #Этот файлик создадим позднее на сервере!
cd /etc/ddns
nsupdate -v -k $KEYFILE << EOF
server $SERVER
zone $ZONE
update delete $HOSTNAME A
update add $HOSTNAME $TTL A $new_ip_address
send
EOF
Мой модифицированный файл для обновления IP в Bind9 DNS сервису по созданному файлу ip.txt, файл ip.txt создаётся в PHP скрипте который описан ниже:
#!/bin/bash
TTL=3600
SERVER=127.0.0.1
HOSTNAME=*.dirt.kz
ZONE=dirt.kz
KEYFILE=/etc/bind/dirt.kz.key
new_ip_address=
FILE=/etc/ddns/ip.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
cd /etc/ddns
sudo nsupdate -v -k $KEYFILE << EOF
server $SERVER
zone $ZONE
update delete $HOSTNAME A
update add $HOSTNAME $TTL A $new_ip_address
update delete dirt.kz A
update add dirt.kz $TTL A $new_ip_address
send
EOF
echo "OK"
Так как PHP работает за HAProxy то немного модифицировал скрипт который сохраняет IP обратившегося клиента в файл, а именно использую "x-forwarded-for" для передачи IP адреса клиента:
<?php
echo '<pre>'; print_r(getallheaders()); echo '</pre>';
// PROBLEM IS each browser has different "x-forwarder-for" some "X-Forwarder-for" and some browser gave you 2x ip "x.x.x.x, x.x.x.x"
foreach ( getallheaders() as $k => $v) {
if ( strtolower($k) == 'x-forwarded-for' ) {
$tmp = explode(', ', $v);
if ( $tmp[count($tmp)-1] != '' )
$_SERVER['REMOTE_ADDR'] = $tmp[count($tmp)-1];
}
}
if(isset($_GET["key"]) && $_GET["key"]=='4fygxNq539NFfUm6SOd2vn52GwL7o7NA'){
$myfile = fopen("/etc/ddns/ip.txt", "w");
fwrite($myfile, $_SERVER['REMOTE_ADDR']);
fclose($myfile);
}
echo $_SERVER['REMOTE_ADDR'];
?>
Проверяем что находит IP по доменному имени
nslookup dirt.kz 127.0.0.1

589
DNS/PowerDNS_install.md Normal file
View File

@ -0,0 +1,589 @@
Документация по 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
```
Выше задал такие настройки как
```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
```

View File

@ -0,0 +1,145 @@
```sh
sudo apt-get install pdns-backend-mysql -y
```
Create database to MarinaDB
```sh
sudo mysql -u root -p
```
Create new user into MarinaDB
```sh
CREATE USER 'poweruser'@'%' IDENTIFIED BY 'uFqqXQEQwErjkQga6rcz';
GRANT ALL PRIVILEGES ON *.* TO 'poweruser'@'%';
FLUSH PRIVILEGES;
REVOKE ALL PRIVILEGES ON *.* FROM 'powerdns'@'%';
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER ON poweruser.* TO 'poweruser'@'%';
FLUSH PRIVILEGES;
```
```sh
SELECT User, Host FROM mysql.user WHERE User = 'poweruser';
```
Create database
```sh
CREATE DATABASE powerdns;
GRANT ALL PRIVILEGES ON powerdns.* TO 'poweruser'@'%';
FLUSH PRIVILEGES;
```
Create file with SQL to create database, text from https://doc.powerdns.com/authoritative/backends/generic-mysql.html
```sql
sudo mysql -u poweruser -p powerdns <<'EOF'
CREATE TABLE domains (
id INT AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
master VARCHAR(128) DEFAULT NULL,
last_check INT DEFAULT NULL,
type VARCHAR(8) NOT NULL,
notified_serial INT UNSIGNED DEFAULT NULL,
account VARCHAR(40) CHARACTER SET 'utf8' DEFAULT NULL,
options VARCHAR(64000) DEFAULT NULL,
catalog VARCHAR(255) DEFAULT NULL,
PRIMARY KEY (id)
) Engine=InnoDB CHARACTER SET 'latin1';
CREATE UNIQUE INDEX name_index ON domains(name);
CREATE INDEX catalog_idx ON domains(catalog);
CREATE TABLE records (
id BIGINT AUTO_INCREMENT,
domain_id INT DEFAULT NULL,
name VARCHAR(255) DEFAULT NULL,
type VARCHAR(10) DEFAULT NULL,
content VARCHAR(64000) DEFAULT NULL,
ttl INT DEFAULT NULL,
prio INT DEFAULT NULL,
disabled TINYINT(1) DEFAULT 0,
ordername VARCHAR(255) BINARY DEFAULT NULL,
auth TINYINT(1) DEFAULT 1,
PRIMARY KEY (id)
) Engine=InnoDB CHARACTER SET 'latin1';
CREATE INDEX nametype_index ON records(name,type);
CREATE INDEX domain_id ON records(domain_id);
CREATE INDEX ordername ON records (ordername);
CREATE TABLE supermasters (
ip VARCHAR(64) NOT NULL,
nameserver VARCHAR(255) NOT NULL,
account VARCHAR(40) CHARACTER SET 'utf8' NOT NULL,
PRIMARY KEY (ip, nameserver)
) Engine=InnoDB CHARACTER SET 'latin1';
CREATE TABLE comments (
id INT AUTO_INCREMENT,
domain_id INT NOT NULL,
name VARCHAR(255) NOT NULL,
type VARCHAR(10) NOT NULL,
modified_at INT NOT NULL,
account VARCHAR(40) CHARACTER SET 'utf8' DEFAULT NULL,
comment TEXT CHARACTER SET 'utf8' NOT NULL,
PRIMARY KEY (id)
) Engine=InnoDB CHARACTER SET 'latin1';
CREATE INDEX comments_name_type_idx ON comments (name, type);
CREATE INDEX comments_order_idx ON comments (domain_id, modified_at);
CREATE TABLE domainmetadata (
id INT AUTO_INCREMENT,
domain_id INT NOT NULL,
kind VARCHAR(32),
content TEXT,
PRIMARY KEY (id)
) Engine=InnoDB CHARACTER SET 'latin1';
CREATE INDEX domainmetadata_idx ON domainmetadata (domain_id, kind);
CREATE TABLE cryptokeys (
id INT AUTO_INCREMENT,
domain_id INT NOT NULL,
flags INT NOT NULL,
active BOOL,
published BOOL DEFAULT 1,
content TEXT,
PRIMARY KEY(id)
) Engine=InnoDB CHARACTER SET 'latin1';
CREATE INDEX domainidindex ON cryptokeys(domain_id);
CREATE TABLE tsigkeys (
id INT AUTO_INCREMENT,
name VARCHAR(255),
algorithm VARCHAR(50),
secret VARCHAR(255),
PRIMARY KEY (id)
) Engine=InnoDB CHARACTER SET 'latin1';
CREATE UNIQUE INDEX namealgoindex ON tsigkeys(name, algorithm);
EOF
```
Проверяем создалась ли таблицы в базе
```sh
mysql -u poweruser -p -e "SHOW TABLES FROM powerdns;"
```
----------------------------------------------------------------------------------------------------
Configure database connection from PowerDNS to SQLIte
```sh
sudo tee /etc/powerdns/pdns.d/pdns.local.mysql.conf <<'EOF'
launch=gmysql
gmysql-host=127.0.0.1
gmysql-port=3306
gmysql-user=poweruser
gmysql-password=uFqqXQEQwErjkQga6rcz
gmysql-dbname=powerdns
gmysql-dnssec=yes
EOF
```
Set access level to file
```sh
sudo chown pdns: /etc/powerdns/pdns.d/pdns.local.mysql.conf &&
sudo chmod 640 /etc/powerdns/pdns.d/pdns.local.mysql.conf
```

View File

@ -0,0 +1,25 @@
```sh
sudo apt-get install pdns-backend-pgsql -y
```
----------------------------------------------------------------------------------------------------
Подключаюсь к базе и создаю схему базу со схемой из: https://doc.powerdns.com/authoritative/backends/generic-postgresql.html
Настраиваю соединение с базой данных в:
```sh
sudo tee /etc/powerdns/pdns.d/pdns.local.gpgsql.conf <<'EOF'
launch+=gpgsql
# gmysql parameters
gpgsql-host=127.0.0.1
gpgsql-port=5432
gpgsql-dbname=powerdns
gpgsql-user=powerdns
gpgsql-password=y7HMHi0ATxx1VC3UU5WG
gpgsql-dnssec=no
EOF
```
Set access level to file:
```sh
sudo chown pdns: /etc/powerdns/pdns.d/pdns.local.gpgsql.conf &&
sudo chmod 640 /etc/powerdns/pdns.d/pdns.local.gpgsql.conf
```
----------------------------------------------------------------------------------------------------

View File

@ -0,0 +1,129 @@
Для использования SQLIte копируем схему из https://doc.powerdns.com/authoritative/backends/generic-sqlite3.html
```sh
sudo apt-get install pdns-backend-sqlite3 -y
```
```sh
sudo apt install sqlite3 -y
```
Create database:
```sh
sudo sqlite3 /var/lib/powerdns/pdns.sqlite3 ".databases" &&
sudo chown pdns:pdns /var/lib/powerdns/pdns.sqlite3
```
Create database structure
```sql
sudo sqlite3 /var/lib/powerdns/pdns.sqlite3 <<'EOF'
PRAGMA foreign_keys = 1;
CREATE TABLE domains (
id INTEGER PRIMARY KEY,
name VARCHAR(255) NOT NULL COLLATE NOCASE,
master VARCHAR(128) DEFAULT NULL,
last_check INTEGER DEFAULT NULL,
type VARCHAR(8) NOT NULL,
notified_serial INTEGER DEFAULT NULL,
account VARCHAR(40) DEFAULT NULL,
options VARCHAR(65535) DEFAULT NULL,
catalog VARCHAR(255) DEFAULT NULL
);
CREATE UNIQUE INDEX name_index ON domains(name);
CREATE INDEX catalog_idx ON domains(catalog);
CREATE TABLE records (
id INTEGER PRIMARY KEY,
domain_id INTEGER DEFAULT NULL,
name VARCHAR(255) DEFAULT NULL,
type VARCHAR(10) DEFAULT NULL,
content VARCHAR(65535) DEFAULT NULL,
ttl INTEGER DEFAULT NULL,
prio INTEGER DEFAULT NULL,
disabled BOOLEAN DEFAULT 0,
ordername VARCHAR(255),
auth BOOL DEFAULT 1,
FOREIGN KEY(domain_id) REFERENCES domains(id) ON DELETE CASCADE ON UPDATE CASCADE
);
CREATE INDEX records_lookup_idx ON records(name, type);
CREATE INDEX records_lookup_id_idx ON records(domain_id, name, type);
CREATE INDEX records_order_idx ON records(domain_id, ordername);
CREATE TABLE supermasters (
ip VARCHAR(64) NOT NULL,
nameserver VARCHAR(255) NOT NULL COLLATE NOCASE,
account VARCHAR(40) NOT NULL
);
CREATE UNIQUE INDEX ip_nameserver_pk ON supermasters(ip, nameserver);
CREATE TABLE comments (
id INTEGER PRIMARY KEY,
domain_id INTEGER NOT NULL,
name VARCHAR(255) NOT NULL,
type VARCHAR(10) NOT NULL,
modified_at INT NOT NULL,
account VARCHAR(40) DEFAULT NULL,
comment VARCHAR(65535) NOT NULL,
FOREIGN KEY(domain_id) REFERENCES domains(id) ON DELETE CASCADE ON UPDATE CASCADE
);
CREATE INDEX comments_idx ON comments(domain_id, name, type);
CREATE INDEX comments_order_idx ON comments (domain_id, modified_at);
CREATE TABLE domainmetadata (
id INTEGER PRIMARY KEY,
domain_id INT NOT NULL,
kind VARCHAR(32) COLLATE NOCASE,
content TEXT,
FOREIGN KEY(domain_id) REFERENCES domains(id) ON DELETE CASCADE ON UPDATE CASCADE
);
CREATE INDEX domainmetaidindex ON domainmetadata(domain_id);
CREATE TABLE cryptokeys (
id INTEGER PRIMARY KEY,
domain_id INT NOT NULL,
flags INT NOT NULL,
active BOOL,
published BOOL DEFAULT 1,
content TEXT,
FOREIGN KEY(domain_id) REFERENCES domains(id) ON DELETE CASCADE ON UPDATE CASCADE
);
CREATE INDEX domainidindex ON cryptokeys(domain_id);
CREATE TABLE tsigkeys (
id INTEGER PRIMARY KEY,
name VARCHAR(255) COLLATE NOCASE,
algorithm VARCHAR(50) COLLATE NOCASE,
secret VARCHAR(255)
);
CREATE UNIQUE INDEX namealgoindex ON tsigkeys(name, algorithm);
EOF
```
Configure database connection from PowerDNS to SQLIte
```sh
sudo tee /etc/powerdns/pdns.d/pdns.local.sqlite.conf <<'EOF'
launch=gsqlite3
gsqlite3-database=/var/lib/powerdns/pdns.sqlite3
EOF
```
Set access level to file
```sh
sudo chown pdns: /etc/powerdns/pdns.d/pdns.local.sqlite.conf &&
sudo chmod 640 /etc/powerdns/pdns.d/pdns.local.sqlite.conf
```
In PowerDNS configured to auto read config from dir /etc/powerdns/pdns.d/

View File

@ -0,0 +1,380 @@
# Устанавливаем авторитативный PowerDNS через Docker Compose в директорию /opt/powerdnsa
Эту версию пробовал: https://hub.docker.com/r/powerdns/pdns-auth-48
PowerDNS Authoritative
Connect to CCALM Turkish infrastructure:
```sh
ssh igor@156.244.31.209 -p 2200
```
```sh
ssh-keygen -R 192.168.200.85
```
```sh
ssh igor@192.168.200.85 -p 22
```
```sh
sudo apt update &&
sudo apt install docker.io docker-compose -y
```
```sh
sudo mkdir -p /opt/powerdnsa &&
cd /opt/powerdnsa &&
sudo mkdir -p data &&
cd /opt/powerdnsa/data
```
----------------------------------------------------------------------------------------------------
Как настроить MariaDB базу для использования в PowerDNS смотри:
[Установка PowerDNS с MariaDB](./PowerDNS_install_MarinaDB.md)
----------------------------------------------------------------------------------------------------
Похоже что environment не работаею и нужно конфигурить через
```sh
cd /opt/powerdnsa
sudo tee docker-compose.yml > /dev/null <<'EOF'
services:
powerdns:
image: powerdns/pdns-auth-48
container_name: powerdns
restart: unless-stopped
network_mode: "host"
environment:
- PDNS_LOCAL_ADDRESS=127.0.0.1,156.244.31.209
- PDNS_LAUNCH=gmysql
- PDNS_API=yes
- PDNS_API_KEY=0aa08433-52a9-4611-9eed-5c5a08a508f0
- PDNS_MASTER=yes
- PDNS_ALLOW_AXFR_IPS=127.0.0.1
- PDNS_WEBSERVER=yes
- PDNS_WEBSERVER_ADDRESS=127.0.0.1,156.244.31.209
- PDNS_WEBSERVER_PORT=8081
# MariaDB connection settings
- PDNS_GMYSQL_HOST=127.0.0.1 # MariaDB на localhost хоста
- PDNS_GMYSQL_PORT=3306
- PDNS_GMYSQL_USER=poweruser
- PDNS_GMYSQL_PASSWORD=uFqqXQEQwErjkQga6rcz
- PDNS_GMYSQL_DBNAME=powerdns
- PDNS_GMYSQL_DNSSEC=yes
EOF
```
```sh
cd /opt/powerdnsa &&
sudo docker-compose up -d
```
```sh
cd /opt/powerdnsa &&
sudo docker-compose down
```
Проверяем какие порты открыты:
```sh
sudo netstat -tuln
```
Проверяем что страница работает
```sh
curl -v http://localhost:8081
```
Смотрим что в логе
```sh
sudo docker logs powerdns
```
```sh
curl -H "X-API-Key: 0aa08433-52a9-4611-9eed-5c5a08a508f0" http://localhost:8081/api/v1
```
пробуем добавить тестовую зону по ключу
```sh
curl -X POST -H "X-API-Key: 0aa08433-52a9-4611-9eed-5c5a08a508f0" \
-H "Content-Type: application/json" \
-d '{"name": "localhost.", "kind": "Master", "dnssec": false, "soa_edit": "", "soa_edit_api": "DEFAULT"}' \
http://localhost:8081/api/v1/servers/localhost/zones
```
Инициализируем базу данных так как сам контейнер её не создаёт
```sh
sudo apt install sqlite3 -y
```
Create database:
```sh
sudo sqlite3 /opt/powerdnsa/data/pdns.sqlite3 ".databases"
```
Create database structure
```sql
sudo sqlite3 /opt/powerdnsa/data/pdns.sqlite3 <<'EOF'
PRAGMA foreign_keys = 1;
CREATE TABLE domains (
id INTEGER PRIMARY KEY,
name VARCHAR(255) NOT NULL COLLATE NOCASE,
master VARCHAR(128) DEFAULT NULL,
last_check INTEGER DEFAULT NULL,
type VARCHAR(8) NOT NULL,
notified_serial INTEGER DEFAULT NULL,
account VARCHAR(40) DEFAULT NULL,
options VARCHAR(65535) DEFAULT NULL,
catalog VARCHAR(255) DEFAULT NULL
);
CREATE UNIQUE INDEX name_index ON domains(name);
CREATE INDEX catalog_idx ON domains(catalog);
CREATE TABLE records (
id INTEGER PRIMARY KEY,
domain_id INTEGER DEFAULT NULL,
name VARCHAR(255) DEFAULT NULL,
type VARCHAR(10) DEFAULT NULL,
content VARCHAR(65535) DEFAULT NULL,
ttl INTEGER DEFAULT NULL,
prio INTEGER DEFAULT NULL,
disabled BOOLEAN DEFAULT 0,
ordername VARCHAR(255),
auth BOOL DEFAULT 1,
FOREIGN KEY(domain_id) REFERENCES domains(id) ON DELETE CASCADE ON UPDATE CASCADE
);
CREATE INDEX records_lookup_idx ON records(name, type);
CREATE INDEX records_lookup_id_idx ON records(domain_id, name, type);
CREATE INDEX records_order_idx ON records(domain_id, ordername);
CREATE TABLE supermasters (
ip VARCHAR(64) NOT NULL,
nameserver VARCHAR(255) NOT NULL COLLATE NOCASE,
account VARCHAR(40) NOT NULL
);
CREATE UNIQUE INDEX ip_nameserver_pk ON supermasters(ip, nameserver);
CREATE TABLE comments (
id INTEGER PRIMARY KEY,
domain_id INTEGER NOT NULL,
name VARCHAR(255) NOT NULL,
type VARCHAR(10) NOT NULL,
modified_at INT NOT NULL,
account VARCHAR(40) DEFAULT NULL,
comment VARCHAR(65535) NOT NULL,
FOREIGN KEY(domain_id) REFERENCES domains(id) ON DELETE CASCADE ON UPDATE CASCADE
);
CREATE INDEX comments_idx ON comments(domain_id, name, type);
CREATE INDEX comments_order_idx ON comments (domain_id, modified_at);
CREATE TABLE domainmetadata (
id INTEGER PRIMARY KEY,
domain_id INT NOT NULL,
kind VARCHAR(32) COLLATE NOCASE,
content TEXT,
FOREIGN KEY(domain_id) REFERENCES domains(id) ON DELETE CASCADE ON UPDATE CASCADE
);
CREATE INDEX domainmetaidindex ON domainmetadata(domain_id);
CREATE TABLE cryptokeys (
id INTEGER PRIMARY KEY,
domain_id INT NOT NULL,
flags INT NOT NULL,
active BOOL,
published BOOL DEFAULT 1,
content TEXT,
FOREIGN KEY(domain_id) REFERENCES domains(id) ON DELETE CASCADE ON UPDATE CASCADE
);
CREATE INDEX domainidindex ON cryptokeys(domain_id);
CREATE TABLE tsigkeys (
id INTEGER PRIMARY KEY,
name VARCHAR(255) COLLATE NOCASE,
algorithm VARCHAR(50) COLLATE NOCASE,
secret VARCHAR(255)
);
CREATE UNIQUE INDEX namealgoindex ON tsigkeys(name, algorithm);
EOF
```
Даём права на директорию где будет работать SQLIte (создавать временные файлы):
```sh
sudo chown -R 1001:1001 /opt/powerdnsa/data &&
sudo chmod -R 775 /opt/powerdnsa/data &&
sudo chmod -R 777 /opt/powerdnsa/data
```
Создаём конфигурационный файл так как запарился через environment задавать параметры:
```sh
cd /opt/powerdnsa
sudo tee docker-compose.yml > /dev/null <<'EOF'
services:
powerdns:
image: powerdns/pdns-auth-48
container_name: powerdns
restart: unless-stopped
ports:
- "5300:53/udp"
- "5300:53/tcp"
- "8081:8081/tcp"
volumes:
- ./data:/var/lib/powerdns
environment:
- PDNS_LOCAL_ADDRESS=0.0.0.0
- PDNS_GSQLITE3_DATABASE=/var/lib/powerdns/pdns.sqlite3
- PDNS_LAUNCH=gsqlite3
- PDNS_API=yes
- PDNS_API_KEY=0aa08433-52a9-4611-9eed-5c5a08a508fc
- PDNS_MASTER=yes
- PDNS_ALLOW_AXFR_IPS=127.0.0.1
- PDNS_WEBSERVER=yes
- PDNS_WEBSERVER_ADDRESS=0.0.0.0
- PDNS_WEBSERVER_PORT=8081
EOF
```
если остались старые образы то удаляем их:
```sh
sudo docker ps
```
```sh
sudo docker stop 913bf9fec5eb &&
sudo docker rm 913bf9fec5eb &&
sudo docker rmi powerdns/pdns-auth-48
```
```sh
cd /opt/powerdnsa &&
sudo docker-compose up -d
```
```sh
cd /opt/powerdnsa &&
sudo docker-compose down
```
Проверяем переменные окружения не заходя в контейнер
```sh
sudo docker inspect powerdns | grep -A 20 "Env"
```
```sh
sudo docker-compose exec powerdns env | grep PDNS_
```
Проверяем открыты ли порты (не должен полностью отработать так как это не рекурсивный сервис)
```sh
sudo apt update && sudo apt install net-tools -y &&
```
```sh
sudo netstat -tulnp | grep 5300
```
```sh
sudo netstat -tulnp | grep 8081
```
Создаём зону и добавляем запись
```sh
sudo docker exec -it powerdns pdnsutil create-zone test ns1.test &&
sudo docker exec -it powerdns pdnsutil add-record test ccalm A 192.168.200.184
```
Проверим список зон
```sh
sudo docker exec -it powerdns pdnsutil list-all-zones &&
sudo docker exec -it powerdns pdnsutil list-zone test
```
Проверяем отвечалет ли:
```sh
dig @127.0.0.1 -p 5300 ccalm.test A
```
проверяем что порт открыт:
```sh
telnet 127.0.0.1 8081
```
```sh
wget -qO- http://127.0.0.1:8081
```
```sh
sudo docker exec -it powerdns sh
```
Посмотреть логи контейнера:
```sh
sudo docker logs --tail=100 -f 913bf9fec5eb
```
wget -qO- http://127.0.0.1:8081/api/v1/servers/localhost --header="X-API-Key: 0aa08433-52a9-4611-9eed-5c5a08a508fc"
----------------------------------------------------------------------------------------------------
Пытаюсь зазобраться почему не работает Web сервер
Захожу в докер под рутом
```sh
sudo docker exec -it --user root powerdns /bin/sh
```
```sh
apt update && apt install -y mc
```
Проверяем какие порты слушает
```sh
apt update && apt install -y net-tools
```
```sh
netstat -tulnp
```
Смотрим все переменые окружения:
```sh
env
```
Перезапускаю в докере
```sh
/usr/sbin/pdns_server --daemon=no --guardian=no --loglevel=9
```