Files
Ubuntu_docs/PowerDNS_install_doker.md
2025-04-07 07:46:21 +05:00

9.6 KiB
Raw Blame History

Устанавливаем авторитативный PowerDNS через Docker Compose в директорию /opt/powerdnsa

Эту версию пробовал: https://hub.docker.com/r/powerdns/pdns-auth-48 PowerDNS Authoritative

Connect to CCALM Turkish infrastructure:

ssh igor@156.244.31.209 -p 2200
ssh-keygen -R 192.168.200.85
ssh igor@192.168.200.85 -p 22
  sudo apt update &&
  sudo apt install docker.io docker-compose -y
  sudo mkdir -p /opt/powerdnsa &&
  cd /opt/powerdnsa &&
  sudo mkdir -p data &&
  cd /opt/powerdnsa/data

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

Похоже что environment не работаею и нужно конфигурить через

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
  cd /opt/powerdnsa &&
  sudo docker-compose up -d
  cd /opt/powerdnsa &&
  sudo docker-compose down

Проверяем какие порты открыты:

sudo netstat -tuln

Проверяем что страница работает

curl -v http://localhost:8081

Смотрим что в логе

sudo docker logs powerdns
curl -H "X-API-Key: 0aa08433-52a9-4611-9eed-5c5a08a508f0" http://localhost:8081/api/v1

пробуем добавить тестовую зону по ключу

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

Инициализируем базу данных так как сам контейнер её не создаёт

sudo apt install sqlite3 -y

Create database:

sudo sqlite3 /opt/powerdnsa/data/pdns.sqlite3 ".databases"

Create database structure

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 (создавать временные файлы):

sudo chown -R 1001:1001 /opt/powerdnsa/data &&
sudo chmod -R 775 /opt/powerdnsa/data &&
sudo chmod -R 777 /opt/powerdnsa/data

Создаём конфигурационный файл так как запарился через environment задавать параметры:

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

если остались старые образы то удаляем их:

sudo docker ps
  sudo docker stop 913bf9fec5eb &&
  sudo docker rm 913bf9fec5eb &&
  sudo docker rmi powerdns/pdns-auth-48
  cd /opt/powerdnsa &&
  sudo docker-compose up -d
  cd /opt/powerdnsa &&
  sudo docker-compose down

Проверяем переменные окружения не заходя в контейнер

sudo docker inspect powerdns | grep -A 20 "Env"
sudo docker-compose exec powerdns env | grep PDNS_

Проверяем открыты ли порты (не должен полностью отработать так как это не рекурсивный сервис)

  sudo apt update && sudo apt install net-tools -y &&
  sudo netstat -tulnp | grep 5300
  sudo netstat -tulnp | grep 8081

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

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

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

sudo docker exec -it powerdns pdnsutil list-all-zones &&
sudo docker exec -it powerdns pdnsutil list-zone test

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

dig @127.0.0.1 -p 5300 ccalm.test A

проверяем что порт открыт:

telnet 127.0.0.1 8081
wget -qO- http://127.0.0.1:8081
sudo docker exec -it powerdns 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 сервер

Захожу в докер под рутом

sudo docker exec -it --user root powerdns /bin/sh
apt update && apt install -y mc

Проверяем какие порты слушает

apt update && apt install -y net-tools
netstat -tulnp

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

env

Перезапускаю в докере

/usr/sbin/pdns_server --daemon=no --guardian=no --loglevel=9