Go to file
Blackyfff 48914a9bfb version 1.0.0rc1
Signed-off-by: Blackyfff <freifunk@freifunk-herpf.de>
2023-04-02 03:26:32 +02:00
etc/ffdns Force delv to bind to internal upstream IP 2021-10-19 01:56:14 +02:00
usr/lib/ffdns version 1.0.0rc1 2023-04-02 03:26:32 +02:00
LICENSE.txt change file extension license 2021-07-08 21:08:18 +02:00
README.md update readme 2023-04-02 03:25:30 +02:00

README.md

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.