Servers

HostnavnRolleOSLokation
authns-master.noahks.netHidden masterDebian 12Albertslund, Danmark
ns1.noahks.netNavneserver #1Debian 12Albertslund, Danmark
ns2.noahks.netNavneserver #2Debian 12Eygelshoven, Holland
ns3.noahks.netNavneserver #3Debian 12Seattle, USA

Opsætning af software

Jeg havde et ønske om et web interface og/eller API adgang til at administrere min DNS records og tilføje nye domæner. Her stødte jeg hurtigt på PowerDNS som er et udbredt produkt, brugt af mange. For at PowerDNS fungerer optimalt, kræver man har en database som backend, hvilket for mit vedkommende er totalt overkill og tilføjer endnu et point of failure.

Derfor endte jeg på at køre PowerDNS på en hidden master og BIND9 på mine slave servers. Det giver mig fuld API adgang uden at skulle vedligeholde en MySQL installation på alle 3 DNS slaves.

Automatisering

Mens der er fuld API adgang via PowerDNS på min hidden master til at lave nye zones, skal de jo også tilføjes på de tre slaves. Lige noget Ansible kan hjælpe mig med at automatisere.

Ansible playbook:

- hosts: slave
  become: yes
  vars_files: vars/zones.yml
  tasks:
    - name: Create new zone on slaves
      file:
        path: "/var/cache/bind/zones/{{item.file}}"
        state: touch
        group: bind
        owner: bind
        modification_time: preserve
      loop: "{{ zones }}"
    - name: Create named.conf.local
      template:
        src: templates/named.conf.local.slave.j2
        dest: /etc/bind/named.conf.local
        owner: bind
        group: bind
    - name: Reload BIND9
      command: rndc reload

vars/zones.yml

masters: 
  - 2001:67c:2aa0::63
zones: 
  - name: noahks.dk
    file: noahks.dk.zone
  - name: noahks.net
    file: noahks.net.zone
  - name: zoko.dk
    file: zoko.dk.zone
  - name: 0.a.a.2.c.7.6.0.1.0.0.2.ip6.arpa
    file: 0.a.a.2.c.7.6.0.1.0.0.2.ip6.arpa.zone  
  - name: 8.1.0.0.c.e.b.2.1.a.2.ip6.arpa
    file: 8.1.0.0.c.e.b.2.1.a.2.ip6.arpa.zone

Template fil, der bliver skubbet ud til slaves:

## {{ ansible_managed }}
{% for slave_zone in zones %}
zone "{{ slave_zone.name }}" {
    type slave;
    file "/var/cache/bind/zones/{{ slave_zone.file }}";
    masters {
{% for master in masters %}
          {{ master }};
{% endfor %}
    };
};
{% endfor %}

Hvorfor ikke Cloudflare DNS eller en af mange gratis DNS udbydere?

For mig handler det om kontrol over min egen infrastruktur, endeløse automatiseringsmuligheder uden at blive rate limited af en API, ubegrænset antal zones/records.

Desuden er mit management af DNS ikke exposed til internettet, hvilket bidrager til sikkerheden af mit setup.