Vai al contenuto
⚠️ Warning: Extraordinary electrical maintenance – Scheduled shutdown of the Cloud garr-ct1 region (Catania) from 22 to 29 July 2025. For more details, please read the maintenance notice.

Installare DNS Autoritativo

Questa ricetta, che fa ampiamente riferimento alla documentazione esistente, ti guida all'installazione di un server PowerDNS Authoritative DNS e del suo frontend GUI PowerDNS-admin. Il server PowerDNS è supportato da un database MySQL/MariaDB.

La ricetta è intesa per quei casi in cui è necessario un servizio DNS minimale. Per questo motivo, il server DNS (così come il database MySQL/MariaDB di backend) e la sua GUI saranno installati sulla stessa macchina virtuale.

Verrà installata la versione 4.X di PowerDNS, che agisce come un server autoritativo DNS puro. Potresti anche considerare di installare un PowerDNS recursor, ma questa parte non è coperta qui e viene lasciata come esercizio.

La ricetta assume il sistema operativo CentOS: per altri sistemi operativi, fare riferimento alle pagine ufficiali pertinenti e modificare i comandi di conseguenza.

Tra le molte possibili alternative per la GUI di gestione, ho abbandonato il glorioso PowerAdmin (ancora disponibile su https://www.poweradmin.org/), che mi ha servito così bene fino ad oggi, poiché sembra non essere mantenuto da molto tempo. D'altra parte, PowerDNS-Admin sembra avere una comunità piuttosto ampia e vivace dietro. Un vantaggio di quest'ultimo prodotto è che non richiede più l'accesso diretto al database MySQL, poiché interagisce tramite API PowerDNS.

Prerequisiti

Configurare il firewall

Per proteggere la macchina virtuale che esegue il server DNS, è necessario configurare correttamente il firewall. Se la macchina virtuale viene creata all'interno di un tenant OpenStack, consiglio vivamente di creare un Security Group dedicato contenente le seguenti eccezioni:

  • consentire accesso UDP alla porta 53 (dall'Universo, se questo DNS deve essere autoritativo)
  • consentire accesso TCP alla porta 53 (dall'Universo, se questo DNS deve essere autoritativo)
  • consentire accesso TCP alla porta 8181 (GUI del server web PowerDNS) da host/reti fidati
  • consentire accesso TCP alla porta 9191 (GUI di gestione PowerDNS-Admin) da host/reti fidati
  • consentire accesso TCP alla porta 22 (SSH) da host/reti fidati

Inoltre, trovo anche conveniente aggiungere l'accesso ICMP da 0.0.0.0.

Server MySQL

Installa il server MariaDB, configuralo, aggiorna e riavvia:

yum install epel-release
yum install mariadb-server
systemctl start mariadb
systemctl enable mariadb
systemctl status mariadb
mysql_secure_installation # inizialmente, la password di root è vuota, durante l'esecuzione del comando puoi impostarla su qualcosa di sensato
yum update
reboot

Ansible

Installa Ansible:

yum install epel-release
yum install ansible

Crea utente Ansible, con privilegi sudo:

  • crea un gruppo per ansible, modifica il file /etc/group e aggiungi una riga come:
  groupadd --gid 22222 ansible
  • crea utente ansible:
  useradd --create-home --gid 22222 --uid 22222 ansible
  • aggiungi l'utente a sudoers, crea il file /etc/sudoers.d/ansible con contenuto:
  Defaults:ansible     !requiretty
  ansible ALL = (root) NOPASSWD:ALL

Installazione e configurazione PowerDNS

PowerDNS è gestito tramite un ruolo Ansible.

Poiché assumiamo che la macchina virtuale appartenga a un tenant OpenStack e abbia un IP floating, stiamo configurando il nostro server DNS in modo che ascolti su qualsiasi interfaccia.

  • crea una directory di lavoro:
  mkdir /home/Ansible/PowerDNS
  • scarica da GitHub:
  cd /home/Ansible/PowerDNS
  ansible-galaxy --roles-path . install PowerDNS.pdns
  • crea il file inventory nella directory di lavoro Ansible, con contenuto:
[mydns]
localhost

[mydns:vars]
ansible_user=ansible
  • crea manageDNS.yml nella directory di lavoro Ansible, contenente la configurazione per il tuo server DNS, leggi la documentazione PowerDNS per ulteriori informazioni. Ad esempio, qualcosa di simile:
- hosts: localhost
  roles:
    - { role: PowerDNS.pdns }
  vars:
    pdns_config:
      daemon: yes
      master: true
      slave: false
      # local-address: # lasciando questo commentato, quindi il DNS si legherà a qualsiasi interfaccia
      disable-axfr: yes
      log-dns-details: on
      loglevel: 3
      slave-cycle-interval: 60
      api: yes
      api-key: superStringaSicura
      webserver: yes
      # webserver-address: # lasciando questo commentato, quindi il webserver ascolterà su qualsiasi interfaccia
      webserver-password: dnspwd
      # configura la riga successiva come necessario: aggiungi tutte le reti autorizzate a fare query
      webserver-allow-from: 127.0.0.0/16,10.200.0.0/16,192.168.209.0/24,10.3.0.0/23,193.206.158.0/23
    pdns_backends:
      gmysql:
        host: 127.0.0.1
        port: 3306
        # utente/password e nome database PowerDNS da creare
        user: powerdns
        password: qualchePasswordSicuraPerIlMioDNS
        dbname: pdns
    pdns_mysql_databases_credentials:
      gmysql:
      # imposta priv_user e priv_password alle tue credenziali MySQL
        priv_user: root
        priv_password: qualsiasiPasswordTuAbbiaConfiguratoPerMysqlRoot
        priv_host:
          - "%"
    pdns_install_repo: "\{\{  pdns_auth_powerdns_repo_41  \}\}"
  • esegui Ansible:
  cd /home/Ansible/PowerDNS
  ansible-playbook -b -v -i inventory.yml manageDNS.yml

Installazione e configurazione PowerDNS-Admin

La documentazione ufficiale per PowerDNS-Admin è disponibile qui: molta documentazione utile è disponibile anche nella wiki.

Crea il database MySQL come da istruzioni ufficiali per impostare il database powerdnsadmin.

Installa PowerDNS-Admin come da istruzioni ufficiali per CentOS 7 o controlla la pagina pertinente nella wiki per altri sistemi operativi.

Una volta che hai PowerDNS-Admin attivo e funzionante, segui le istruzioni nella wiki per renderlo un servizio: ho optato per Systemd, altre configurazioni sono possibili. Rispetto alle istruzioni sopra, ho fatto solo un paio di modifiche:

  • creato powerdnsadmin e il suo gruppo con il comando:

    useradd --system --user-group powerdnsadmin

  • cambiata la proprietà della directory PowerDNS-Admin:

    chown -R powerdnsadmin.powerdnsadmin /opt/web/powerdns-admin

Per riferimento, ho creato il file config.py copiando config_template.py e modificando:

BIND_ADDRESS = '0.0.0.0'
SQLA_DB_USER = '<scegli_il_tuo_nome_utente_DB>'
SQLA_DB_PASSWORD = '<scegli_una_password_decente>'
SQLA_DB_HOST = 'localhost'
PDNS_STATS_URL = 'http://127.0.0.1:8081/'
PDNS_API_KEY = '<qualsiasi_cosa_sia_impostata_in_pdns.conf_per_api-key>'