dns-scripts/README.md

225 lines
6.5 KiB
Markdown

# dns-scripts
Dieses Git enthält eine Sammlung an Scripten zur Aktualisierung der Zonen für fff.community.
Dabei werden aus der Forward-Zone und optional eigener Subdomain (durch community-Zonendatei gesteuert) auch passende Reverse-Zonen für unsere internen RFC 1918 und RFC 4193 Adressen erzeugt.
Es werden bei eigener Subdomain die momentan vergebenen Adressen von dnsmasq und odhcpd (alles unter /tmp/hosts/) inkludiert.
Das ermöglicht eine Namensauflösung für Freifunk-Teilnehmer ohne manuelle Konfiguration.
Damit kann jeder Freifunk-Teilnehmer ein gültiges TLS-Zertifikat bekommen, sofern DHCPv6 am Gateway aktiviert ist.
Unterstützt wird Split-DNS für Freifunk-interne und -externe Anfragen, dabei kann auch eine Subdomain angelegt werden unter welcher nur extern erreichbare IPs herausgegeben werden.
DNSSEC wird für jede Zone unterstützt, allerdings nur für die Hauptzone mit mehreren Servern. Für Subdomainserver darf mit DNSSEC nur jeweils ein primärer Server autoritativ sein.
## Installation
#### Systemanforderungen
curl
bind9
named-checkzone (z.B. bei bind oder bind-tools enthalten)
für DNSSEC: delv; bind9 >= 9.16.33/9.18.12; openssl
#### dns-scripts klonen
Die Scripte müssen geklont werden, oder anderweitig auf dem Server abgelegt werden. Die Ordner sind im Git vorgegeben. /usr/lib/ffdns für die Scripte und /etc/ffdns für die Konfigurationsdateien.
```
git clone https://git.freifunk-franken.de/freifunk-franken/dns-scripts.git
```
#### konfigurieren
Die Datei /etc/ffdns/community.conf wird für eine Community konfiguriert (vorzugsweise im Git), und sollte nicht lokal geändert werden.
Die Datei /etc/ffdns/local.conf muss serverspezifisch konfiguriert werden.
Für die Konfiguration der Zonendatei siehe https://git.freifunk-franken.de/freifunk-franken/dns
#### Cron anlegen
Das Script muss regelmäßig aufgerufen werden, z.B. via Cron:
```
1-59/5 * * * * /usr/lib/ffdns/update-dns.sh
```
#### DNS-Server konfigurieren
##### Erstkonfiguration
Vor der Konfiguration des DNS-Dienstes bietet es sich an, das update-dns.sh Script einmalig manuell aus zu führen, um die Konfigurationsdateien anlegen zu lassen. Dafür empfiehlt sich `DNSSCRIPT_BIND_RELOAD_VER=-1` (local.conf).
Hat die vorherige Konfiguration von `bind` noch keine `views`, so muss beachtet werden, dass `zone`-Einträge bei der Konfiguration mit `views` sich nur noch innerhalb von `view`-Einträgen befinden dürfen. Deswegen muss meißt die Standardkonfiguration angepasst werden.
##### Konfiguration des DNS-Dienstes
Die Scripte sind auf `bind` ausgerichtet. Andere Distributionen sind auch möglich, aber DNSSEC und automatische Konfiguration der verschiedenen Zonen müssen dann selbst gelöst werden.
Für `bind` werden durch die Scripte für jeden `view` include-Dateien im Ordner `$GeneratedIncludeFileFolder` (local.conf) angelegt (z.B. icvpn-internal-view.conf) und zusätzlich eine icvpn-acl.conf:
##### Konfiguration:
Die Reihenfolge der Einträge ist obligatorisch
```
$ cat named.conf.local
[..]
acl icvpnlocal {
10.0.0.0/8;
172.16.0.0/12;
fc00::/7;
};
acl lo0 {
127.0.0.0/8;
::1/128;
};
[..]
options {
[..] # eigene Optionen
recursion no;
check-names master warn; # Wichtig, da sonst Hostnamen mit _ (z.B.: HUAWEI_P30_lite ) bind nicht laden lassen
};
[..]
view "external-view" {
match-destinations {
!icvpnlocal;
!lo0;
any;
};
match-clients {
!icvpnlocal;
!lo0;
any;
};
[..] # eigene Optionen
include "/etc/bind/external-view.conf"; # auto-generated
[..]
};
view "icvpn-internal-view" {
match-clients { any; };
allow-query-cache { any; };
recursion yes;
[..] # eigene Optionen
include "/etc/bind/icvpn-internal-view.conf"; # auto-generated
include "/etc/bind/icvpn-zones.conf"; # Nicht vergessen ;) siehe https://github.com/freifunk/icvpn-scripts#dns-mkdns
[..]
};
[..]
```
##### Beispielkonfiguration mit DNSSEC:
```
[..]
options {
[..] # eigene Optionen
};
dnssec-policy <Name frei wählbar> { # Name muss in der config gesetzt werden
keys {
ksk key-directory lifetime unlimited algorithm ECDSAP384SHA384; # Alle Server einer Domain müssen den gleichen Algorithmus für ksk wählen
zsk key-directory lifetime P30D algorithm ECDSAP384SHA384; # Alle Server einer Domain müssen den gleichen Algorithmus für zsk wählen
};
max-zone-ttl 3600;
nsec3param;
};
[..]
```
##### Beispielkonfiguration für DNS64:
```
[..]
view "icvpn-internal-dns64-view" {
match-destinations {
<IPv6>; # eine separate Adresse ist für DNS64 notwendig
};
allow-query-cache { any; };
recursion yes;
dns64 64:ff9b::/96 {
break-dnssec yes;
mapped { !10/8; !192.168/16; !172.16/12; any; };
exclude { 64:FF9B::/96; };
};
include "/etc/bind/icvpn-internal-dns64-view.conf";
[..]
};
view "external-view" {
[..]
```
##### empfohlene Konfigurationen:
```
options {
[..] # eigene Optionen
minimal-responses yes;
server-id "<eigener Hostname>" # sehr hilfreich wenn anycast-Adressen bedient werden
};
view "external-view" {
[..]
rate-limit {
responses-per-second 50;
};
[..]
};
```
## Konfiguration der Zonendatei
### Einträge generell
Alle Einträge sollten im relativen Schema vorliegen, also ohne die Rootdomain und ohne abschließenden Punkt.
### Subdomains
Subdomains der Rootzone können von Root-Servern selbst oder auch von jedem anderen Server gehostet werden.
Subdomains sollten im folgenden Format angelegt werden
```
<Subdomain> IN NS <Serverhostname>[ ; Subnets:[ <SubnetzIPv4>/<Subnetzmaske>| <SubnetzIPv6>/<Subnetzmaske>]*]?
```
z.B.:
```
herpf IN NS dns.herpf.fff.community. ; Subnets: 10.50.250.0/24 fd43:5602:29bd:62::/64
```
Serverhostname muss mit der Konfiguration in local.conf übereinstimmen und muss absolut sein (mit abschließendem Punkt).
Die Subnetzparameter sind für die Delegierung und Erstellung der Reversezonen notwendig.
Sofern noch nicht vorhanden wird dann eine neue Zonendatei für diese Subdomain erstellt. Diese darf dann auch oberhalb der Zeile
```
;### Leases ###
```
wie die Rootzonendatei editiert werden.
In den durch die Scripte angelegten Zonen des ersten internen View (bei DNSSEC die unsignierte Variante) können mit einer update-policy auch dynamisch Einträge gesetzt werden. Da bei DNSSEC diese Datei nicht über die Scripte von bind geladen wird, sollte diese in einem separaten View für Updates geladen werden.
### Subsubdomains
Auch unterhalb von bereits delegierten Subdomains können beliebig viele weitere Subdomains bedient werden.
Dazu muss in local.conf angegeben werden wo die Zonendatei der nächst höheren Zone zu erreichen ist.