Nameserver Bind Master / PowerDNS Slave

  • huhu,

    hat jemand ein solches Setup und kann mir mal helfen ?

    Hab mehrere Anleitungen durch doch mit keiner kam ich zum gewünschten Ergebnis.

    Möchte halt das der BIND Master alles an den PowerDNS weitergibt. Jedoch werden die Zonen nicht automatisch erstellt, die muss ich jedesmal erst im PowerDNS anlegen.

    Hab ich dir als sekundär Zone mit IP vom Master angelegt kommt die DNS Einträge automatisch hinterher, und auch änderugen funktionieren...

    Nur das Initiale Anlegen der Zone muss manuell geschehen, wüsste jemand wie ich das umgehen kann ?

    Als backend läuft mysql

    LG

  • nur wie sage ich bind das er der master für den powerdns ist

    bekomme das nicht gebacken, wie erwähnt hab ich schon paar anleitungen durch aber nie tauchen die Zonen automatisch auf

    allerdings waren das auch nicht die neusten und immer mit mysql backend.

  • nur wie sage ich bind das er der master für den powerdns ist

    im zonefile selbst muss der powerdns als NS drinnen stehen. in der zone config brauchst notify yes und allow-transfer entsprechend.

    https://www.zytrax.com/books/dns/ch7/xfer.html#notify

    https://www.zytrax.com/books/dns/ch7/xfer.html#allow-transfer

    fragt mich jetzt nur nicht wo es hinkte

    Du könntest die stellen die ich oberhalb erwähnte hier zur veranschaulichung posten.

  • das Transfer-allow setzt Plesk selber wenn man die IP der Nameserver im Transferbeschrönkungen Template einträgt.

    Nur das notify musst ich selber setzen, hab es direkt in die named.conf eingetragen von Plesk

    möchte noch ausprobieren ob es genügt die notify Einträge in den Serverweiten Einstellungen von Plesk zu setzen, dann würde das manuelle bearbeiten der named.conf entfallen.

  • Ich versuche es mal nieder zu kritzeln falls jemand auch powerdns+poweradmin haben möchte als slave DNS für Plesk (Bind) Primary

    Bin zwar selbst noch bischen am tüfteln, aber die Zone werden automatisch in PowerDNS erstellt und aktualisiert. nur wenn man eine Domain löscht, verbleibt es im PowerDNS und bedarf eines manuellen Eingriffs.

    Master:

    Ubuntu 22.04

    Plesk Obsidian Web Admin Edition Version 18.0.63 Update Nr. 1

    In der Plesk Oberfläche gehen wir auf

    Tools & Einstellung -> DNS-Einstellungen -> Transferbeschränkungen-Template

    und fügen hier die IP Adressen unserer DNS Server ein.

    Im nächsten Reiter "Serverweite Einstellungen" fügen wir unter Zusätzliche DNS-Einstellungen folgendes hinzu:

    Nachtrag; man kann auch "notify yes;" anstatt von "notify explicit;" verwenden.

    Bei notify yes werden alle Server angesprochen die im NS RRset stehen außer der, der im SOA Feld ans MNAME steht und die aus der also-notify liste

    bei notify explicit werden nur die Server angesprochen die in der also-notify liste stehen.

    Spoiler anzeigen
    Code
    notify explicit;
    notify-source MasterIP;
    also-notify { NS1-IP; NS2-IP; usw...; };

    Slave:

    Ubuntu 22.04

    Als erstes alles auf aktuellen Stand bringen falls das noch nicht der fall sein sollte:

    Spoiler anzeigen

    apt update && apt upgrade -y

    Dannach laden wir schonmal alles runter was wir später an Abhängigkeiten brauchen:

    Spoiler anzeigen

    apt install nginx python3-dev libsasl2-dev libldap2-dev libssl-dev libxml2-dev libxslt1-dev libxmlsec1-dev libffi-dev pkg-config apt-transport-https virtualenv build-essential libmariadb-dev git python3-flask libpq-dev software-properties-common gnupg2 -y

    Installieren und absichern der MariaDB Instanz:

    Spoiler anzeigen

    apt install mariadb-server mariadb-client -y && mysql_secure_installation

    Dieses könnte ein optionaler Schritt sein, bin mir nicht ganz sich:

    Spoiler anzeigen

    printf "# InnoDB

    innodb_log_file_size = 64M

    default-storage-engine=INNODB

    innodb_buffer_pool_size=1G

    innodb_buffer_pool_instances = 2

    innodb_autoinc_lock_mode = 2

    innodb_doublewrite = 1

    innodb_file_per_table = 1

    innodb_flush_log_at_trx_commit = 2

    innodb_lock_wait_timeout = 60

    innodb_locks_unsafe_for_binlog = 1

    innodb_stats_on_metadata = 0

    transaction-isolation=READ-COMMITTED" >> /etc/mysql/mariadb.conf.d/50-server.cnf

    Dann werden Datenbank und Benutzer für PowerDNS hinzugefügt (User und Datenbank heißen in diesen Beispiel pdns)

    Spoiler anzeigen

    mysql

    create database pdns;

    grant all on pdns.* to pdns@localhost identified by 'password';

    flush privileges;

    exit;

    Nun wird das Resolv System gestoppt und PowerDNS mit MySQL Backend installiert:

    Spoiler anzeigen

    systemctl disable --now systemd-resolved && rm -rf /etc/resolv.conf

    echo "nameserver 8.8.8.8" > /etc/resolv.conf

    apt-get install pdns-server pdns-backend-mysql -y

    Das Datenbank-Schema importieren:

    Spoiler anzeigen

    mysql -u pdns -p pdns < /usr/share/pdns-backend-mysql/schema/schema.mysql.sql

    MariaDB Config erstellen für PDNS: (sollte euer mysql password sonderzeichen enthalten solltet Ihr die Datei besser mit nano oder vi per Hand erstellen)

    Spoiler anzeigen

    printf "# MariaDB Configuration file

    launch+=gmysql

    gmysql-host=127.0.0.1

    gmysql-port=3306

    gmysql-dnssec=yes

    gmysql-dbname=pdns

    gmysql-user=pdns

    gmysql-password=password">/etc/powerdns/pdns.d/pdns.local.gmysql.conf

    Rechte anpassen und PDNS stoppen:

    Spoiler anzeigen

    chmod 640 /etc/powerdns/pdns.d/pdns.local.gmysql.conf

    chown pdns:pdns /etc/powerdns/pdns.d/pdns.local.gmysql.conf

    systemctl stop pdns

    SuperMaster in die Datenbank Eintragen:

    Spoiler anzeigen

    mysql

    insert into pdns.supermasters (ip, nameserver, account) VALUES ('x.x.x.x', 'ns1.example.com', 'admin');

    exit;

    NodeJS + Yarn installieren:

    Spoiler anzeigen

    curl -sL https://deb.nodesource.com/setup_16.x | bash -

    apt-get install nodejs -y

    curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add -

    echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list

    apt update -y

    apt install yarn -y

    PowerDNS Admin Repo herunterladen und abhänigkeiten updaten/installieren:

    Spoiler anzeigen

    git clone https://github.com/ngoduykhanh/PowerDNS-Admin.git /var/www/html/pdns

    cd /var/www/html/pdns/

    virtualenv -p python3 flask

    source ./flask/bin/activate

    pip install --upgrade pip

    pip install -r requirements.txt

    deactivate

    Jetzt müssen wir die Datei (/var/www/html/pdns/powerdnsadmin/default_config.py) bearbeiten, dazu fügt Ihr folgendes hinzu oder ändert es ab falls vorhanden:

    Spoiler anzeigen

    BIND_ADDRESS = '0.0.0.0'
    CAPTCHA_ENABLE = True
    CAPTCHA_HEIGHT = 60
    CAPTCHA_LENGTH = 6
    CAPTCHA_SESSION_KEY = 'captcha_image'
    CAPTCHA_WIDTH = 160
    CSRF_COOKIE_HTTPONLY = True
    HSTS_ENABLED = False
    OFFLINE_MODE = False
    PORT = 9191
    SALT = '32charsecret'
    SAML_ASSERTION_ENCRYPTED = True
    SAML_ENABLED = False
    SECRET_KEY = 'another32charsecret'
    SERVER_EXTERNAL_SSL = os.getenv('SERVER_EXTERNAL_SSL', True)
    SESSION_COOKIE_SAMESITE = 'Lax'
    SESSION_TYPE = 'sqlalchemy'
    SQLALCHEMY_DATABASE_URI = 'sqlite:///' + os.path.join(basedir, 'pdns.db')
    SQLALCHEMY_TRACK_MODIFICATIONS = True
    SQLA_DB_USER = 'pdns'
    SQLA_DB_PASSWORD = 'euerDB Passwort'
    SQLA_DB_HOST = '127.0.0.1'
    SQLA_DB_NAME = 'pdns'
    # SQLALCHEMY_DATABASE_URI = 'mysql://{}:{}@{}/{}'.format(
    # urllib.parse.quote_plus(SQLA_DB_USER),
    # urllib.parse.quote_plus(SQLA_DB_PASSWORD),
    # SQLA_DB_HOST,
    # SQLA_DB_NAME
    # )


    Danach führen wir folgendes aus:

    Spoiler anzeigen

    cd /var/www/html/pdns/

    source ./flask/bin/activate

    export FLASK_APP=powerdnsadmin/__init__.py

    flask db upgrade

    yarn install --pure-lockfile

    flask assets build

    deactivate

    Nginx als reverse Proxy für PowerDNS Admin:

    Spoiler anzeigen
    nano /etc/nginx/conf.d/pdns-admin.conf

    und folgendes einfügen (server_name nicht vergessen zu bearbeiten)

    Spoiler anzeigen

    server {
    listen *:80;
    server_name pdns01.example.com;

    index index.html index.htm index.php;
    root /var/www/html/pdns;
    access_log /var/log/nginx/pdnsadmin_access.log combined;
    error_log /var/log/nginx/pdnsadmin_error.log;

    client_max_body_size 10m;
    client_body_buffer_size 128k;
    proxy_redirect off;
    proxy_connect_timeout 90;
    proxy_send_timeout 90;
    proxy_read_timeout 90;
    proxy_buffers 32 4k;
    proxy_buffer_size 8k;
    proxy_set_header Host $host;
    proxy_set_header X-Real-IP $remote_addr;
    proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    proxy_headers_hash_bucket_size 64;

    location ~ ^/static/ {
    include /etc/nginx/mime.types;
    root /var/www/html/pdns/powerdnsadmin;

    location ~* \.(jpg|jpeg|png|gif)$ {
    expires 365d;
    }

    location ~* ^.+.(css|js)$ {
    expires 7d;
    }
    }

    location / {
    proxy_pass http://unix:/run/pdnsadmin/socket;
    proxy_read_timeout 120;
    proxy_connect_timeout 120;
    proxy_redirect off;
    }

    }

    Rechte anpassen und nginx neustarten:

    Spoiler anzeigen

    chown -R www-data:www-data /var/www/html/pdns

    systemctl restart nginx

    Systemd Dienst für PowerDNS erstellen:

    Spoiler anzeigen

    printf "[Unit]

    Description=PowerDNS-Admin

    Requires=pdnsadmin.socket

    After=network.target

    [Service]

    PIDFile=/run/pdnsadmin/pid

    User=pdns

    Group=pdns

    WorkingDirectory=/var/www/html/pdns

    ExecStart=/var/www/html/pdns/flask/bin/gunicorn --pid /run/pdnsadmin/pid --bind unix:/run/pdnsadmin/socket 'powerdnsadmin:create_app()'

    ExecReload=/bin/kill -s HUP $MAINPID

    ExecStop=/bin/kill -s TERM $MAINPID

    PrivateTmp=true

    [Install]

    WantedBy=multi-user.target" >> /etc/systemd/system/pdnsadmin.service

    printf "[Unit]

    Description=PowerDNS-Admin socket

    [Socket]

    ListenStream=/run/pdnsadmin/socket

    [Install]

    WantedBy=sockets.target" >> /etc/systemd/system/pdnsadmin.socket


    echo "d /run/pdnsadmin 0755 pdns pdns -" >> /etc/tmpfiles.d/pdnsadmin.conf

    mkdir /run/pdnsadmin/

    chown -R pdns: /run/pdnsadmin/

    chown -R pdns: /var/www/html/pdns/powerdnsadmin/

    PowerDNS Config bearbeiten: (/etc/powerdns/pdns.conf)

    Spoiler anzeigen

    allow-dnsupdate-from=127.0.0.0/8,::1,MasterIP

    allow-notify-from=0.0.0.0/0,::/0

    api=yes

    api-key=yourapikey

    autosecondary=yes

    disable-axfr=yes

    include-dir=/etc/powerdns/pdns.d

    launch=

    primary=no

    secondary=yes

    security-poll-suffix=

    slave-cycle-interval=20

    version-string=anonymous


    Zu guter letzt Dienste neustarten/laden

    Spoiler anzeigen

    systemctl daemon-reload

    systemctl enable --now pdnsadmin.service pdnsadmin.socket

    systemctl start pdns

    Nun könnt Ihr unter der zuvor angelegten URL euren PowerDNS Admin besuchen und einen Benutzer anlegen. Nach dem einloggen müsst Ihr noch die Api URL und euren API Key eingeben. Nach einpaar momenten könnt Ihr auf das Dashboard gehen und Ihr solltet sehen wir eure Domains/Zonen auftauchen.

  • warum nicht einfach yes?

    Öhm hab beides probiert und beides geht, bin irgendwie auf explicit hängen geblieben.

    warum nicht aus den Ubuntu repos?

    hab immer nen fehler bekommen, weiß jetzt auch nicht mehr welcher. tante google lieferte mir dann nach einigen beiträgen das es mit dieser "repo" keine fehler gibt und so war es dann auch.

    warum aus den Ubuntu repos?

    darauf hab ich keine antwort, habs einfach aus anderen guides so übernommen

  • irgendwie auf explicit hängen geblieben

    mit yes würdest Dir imho also-notify ersparen.

    Wieso fragtest du wegen den Repos?

    mein ansatz ist so konservativ wie möglich zu sein. also immer versuchen die pakete ausm distributions repo zu installieren und nur fremdrepos wenn was fehlt (generell oder ein bestimmtes feature in einer neueren version). und wenn schon fremde quellen dann ein repo, damit ist dann gewährleistet dass man mindestens die wichtigsten security updates fast automatisch hat.

    ein mysql/mariadb erwarte ich aus den distributions repos in funktionierend.

  • Ok gut zu wissen das man sich dann das also-notify sparen würde, ich belasse es nun bei explicit. .

    Ganz nach dem Motto never change a running system :D

    So hab das in einem lxc container nochmal nachgestellt, und keine fehler zu mariadb bekommen.

    Wird wohl in meinem 100 versuchen irgendwas durcheinander gekommen sein, hab den schnipsel entfernt

    Danke für den stupser da nochmal nach zu schauen :)