Merge branch 'master' of https://git.dirt.kz/igor/Ubuntu_docs
# Conflicts: # DNS/PowerDNS_install.md
This commit is contained in:
204
DNS/BIND_install.md
Normal file
204
DNS/BIND_install.md
Normal 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
|
||||
597
DNS/PowerDNS_install.md
Normal file
597
DNS/PowerDNS_install.md
Normal file
@ -0,0 +1,597 @@
|
||||
Документация по 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
|
||||
|
||||
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
|
||||
pdnsutil delete-rrset locust.ge locust.ge.locust.ge NS
|
||||
```
|
||||
|
||||
|
||||
|
||||
Выше задал такие настройки как
|
||||
```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
|
||||
```
|
||||
145
DNS/PowerDNS_install_MarinaDB.md
Normal file
145
DNS/PowerDNS_install_MarinaDB.md
Normal 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
|
||||
```
|
||||
25
DNS/PowerDNS_install_PostgreSQL.md
Normal file
25
DNS/PowerDNS_install_PostgreSQL.md
Normal 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
|
||||
```
|
||||
----------------------------------------------------------------------------------------------------
|
||||
143
DNS/PowerDNS_install_SQIite3.md
Normal file
143
DNS/PowerDNS_install_SQIite3.md
Normal file
@ -0,0 +1,143 @@
|
||||
Для использования 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/
|
||||
|
||||
|
||||
|
||||
|
||||
For delete record from SQLite run:
|
||||
```sh
|
||||
cp /var/lib/powerdns/pdns.sqlite3 /var/lib/powerdns/pdns.sqlite3.bak
|
||||
sqlite3 /var/lib/powerdns/pdns.sqlite3
|
||||
SELECT id, name FROM domains WHERE name = 'locust.ge';
|
||||
SELECT id, name, type, content FROM records WHERE name = 'locust.ge.locust.ge' AND type = 'NS';
|
||||
DELETE FROM records WHERE id IN (25, 26, 27, 28);
|
||||
.exit
|
||||
pdns_control notify locust.ge
|
||||
```
|
||||
380
DNS/PowerDNS_install_doker.md
Normal file
380
DNS/PowerDNS_install_doker.md
Normal 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
|
||||
```
|
||||
|
||||
|
||||
Reference in New Issue
Block a user