DNS: Unterschied zwischen den Versionen
Zeile 16: | Zeile 16: | ||
=== Andere DNS Server nutzen === | === Andere DNS Server nutzen === | ||
Es muss nicht zwingend ein eigener DNS-Server betrieben werden | Es muss nicht zwingend ein eigener DNS-Server betrieben werden. Es sollte aber möglichst nicht einer der großen bekannten öffentlichen (z.B. 1.1.1.1 oder 2606:4700:4700::1111) verwendet werden, sondern besser einer unserer eigenen Server. Somit braucht man sich um die Konfiguration keine Gedanken machen. | ||
Aktuell wären das folgende: | Aktuell wären das folgende: | ||
Zeile 38: | Zeile 38: | ||
==== DoH/DoT ==== | ==== DoH/DoT ==== | ||
Im Freifunk Franken Netz werden auch DoT/DoH DNS Server betrieben. Aktuell gibt es folgende Server: | |||
{| class="wikitable" | {| class="wikitable" | ||
Zeile 53: | Zeile 53: | ||
=== Eigener DNS Server als Cache mit forwarding === | === Eigener DNS Server als Cache mit forwarding === | ||
Es kann auch ein eigener DNS Server betrieben werden und auf einen Freifunk DNS Server gefordwardet werden. | Es kann auch ein eigener DNS Server betrieben werden und auf einen Freifunk DNS Server gefordwardet werden. | ||
Siehe hier: [[Freifunk-Gateway_aufsetzen/DNS#unbound_config]] | |||
=== Eigener DNS-Server mit Static-Stub === | === Eigener DNS-Server mit Static-Stub === |
Version vom 26. Juli 2020, 16:30 Uhr
Konzept
Für die interne Nutzung im Freifunknetz besitzt F3 Netze e.V. die Domain fff.community. Im Gegensatz zu anderen Communites verwenden wir keine eigene Toplevel-Domain, um Kollisionen vorzubeugen und Probleme mit DNSSEC zu vermeiden.
Die Zone wird in einem Git [1] verwaltet und über Skripte [2] auf die für diese Zone authoritativen Nameserver einiger Freifunker synchronisiert.
Wenn jemand eine Domain für seinen Service haben möchte, kann dies mit einen Pull Request angefragt werden: [3]
Die Delegation von Subdomains ist ebenfalls möglich.
Funktionsfähigkeit auf allen Gateways
Um sicher zu stellen, dass das DNS im ganzen Netz funktioniert, müssen alle Gateways korrekt konfiguriert sein. Es gibt drei Möglichkeiten um dies zu erreichen:
Andere DNS Server nutzen
Es muss nicht zwingend ein eigener DNS-Server betrieben werden. Es sollte aber möglichst nicht einer der großen bekannten öffentlichen (z.B. 1.1.1.1 oder 2606:4700:4700::1111) verwendet werden, sondern besser einer unserer eigenen Server. Somit braucht man sich um die Konfiguration keine Gedanken machen.
Aktuell wären das folgende:
IPv4-Adresse | IPv6-Adresse | Betreiber | Bemerkung |
---|---|---|---|
10.50.40.10 | – | Mayosemmel | |
10.50.252.0 | fd43:5602:29bd:ffff::252 | RedDog | |
10.83.252.0 | fd43:5602:29bd:ffff::42 | fblaese | |
10.83.252.11 | fd43:5602:29bd:ffff:a:a:a:a | ChristianD | Statistik: https://homeserver.dresel.it:3001/d/7_2CgErWk/bind?orgId=1&from=now-6h&to=now&refresh=1m |
10.83.252.62 | fd43:5602:29bd:ffff::62 | Adrian Schmutzler |
DoH/DoT
Im Freifunk Franken Netz werden auch DoT/DoH DNS Server betrieben. Aktuell gibt es folgende Server:
IPv4-Adresse | IPv6-Adresse | Betreiber | Domain für Zertifikat | Bemerkung |
---|---|---|---|---|
10.83.227.163 | fd43:5602:29bd:ffff:c:c:c:c | ChristianD | dns.dresel.systems | Ist auch öffentlich erreichbar und von überall möglich zu verwenden: 2a06:e881:340d::1 / 194.50.19.86 Statistik: https://homeserver.dresel.it:3001/d/s51tgaLWk/dohdotdns-server?orgId=1&refresh=1m |
Eigener DNS Server als Cache mit forwarding
Es kann auch ein eigener DNS Server betrieben werden und auf einen Freifunk DNS Server gefordwardet werden. Siehe hier: Freifunk-Gateway_aufsetzen/DNS#unbound_config
Eigener DNS-Server mit Static-Stub
siehe hierzu #StaticStub
Hinweis: Wenn ein eigener DNS-Server betrieben werden soll, sollte man unbedingt in Betracht ziehen auch die deutschlandweiten Freifunk-Zonen zu übernehmen. Wie das geht, steht hier: https://wiki.freifunk.net/DNS
Funktioniert analog zu unserer Konfiguration als "Static-Stub"
Voraussetzungen
Debian:
apt-get install bind9 bind9utils dnsutils
Static-Stub Konfiguration
Ein so genannter Static-Stub sorgt dafür, dass Bind für definierte Zonen immer zuerst die festgelegten DNS-Server anfragt. Voraussetzung ist allerdings, dass keine Forwarder eingetragen sind.
Wir haben zur Zeit eine Forward und eine Reverse Lookup Zone. Diese sollten statisch eingetragen werden. Dies geschieht in der /etc/bind/named.conf.local
zone "50.10.in-addr.arpa" { type static-stub; server-addresses { 10.50.40.10; 10.83.252.11; 10.50.252.0; 10.83.252.62; }; }; zone "83.10.in-addr.arpa" { type static-stub; server-addresses { 10.50.40.10; 10.83.252.11; 10.50.252.0; 10.83.252.62; }; }; zone "fff.community" { type static-stub; server-addresses { 10.50.40.10; 10.83.252.11; 10.50.252.0; 10.83.252.62; }; };
In der /etc/bind/named.conf.options müssen eventuell vorhandene Forwarder entfernt werden. Untenstehend ein Beispiel:
forwarders { 8.8.8.8; };
Ebenfalls in der named.conf.options muss dnssec deaktiviert werden:
dnssec-validation no;
Weiterhin sollte das ICVPN-DNS aufgenommen werden. Wie das passiert ist hier erklärt.
Beispielhafte Installation
Die Installation könnte dann etwa so aussehen:
cd /etc/bind cat <<EOF >> named.conf.local zone "50.10.in-addr.arpa" { type static-stub; server-addresses { 10.50.40.10; 10.83.252.11; 10.50.252.0; 10.83.252.62; }; }; zone "fff.community" { type static-stub; server-addresses { 10.50.40.10; 10.83.252.11; 10.50.252.0; 10.83.252.62; }; }; EOF aptitude install python-yaml git clone https://github.com/freifunk/icvpn-scripts.git git clone https://github.com/freifunk/icvpn-meta.git echo 'include "/etc/bind/named.conf.icvpn";' >> named.conf cat <<EOF > update-icvpn.sh #!/bin/bash cd /etc/bind/icvpn-meta git pull cd .. icvpn-scripts/mkdns -x franken -f bind -s icvpn-meta > named.conf.icvpn /usr/sbin/rndc reload EOF chmod +x update-icvpn.sh # falls das sich wg. fehlendem yaml beschwert wird python3 für das script verwendet - dann python3-yaml nachinstallieren! ./update-icvpn.sh echo "10 2 * * * root /etc/bind/update-icvpn.sh" >> /etc/crontab
Der DHCP sollte natürlich auch angepasst werden:
In der dhcpd config:
- option domain-name "fff.community";
- Bitte auch keine Freifunk Fremden DNS Server verteilen, wenn kein eigener DNS betrieben werden soll, lieber einige vorhandene Freifunk DNS Server announcen.
Danach:
- /etc/init.d/isc-dhcp-server restart
Synchronisationsscript für DNS-Zones
Dieses script ist nur zu verwenden, wenn man ein Peering mit allen Serverbetreibern ausgehandelt hat. Bei "static-stub" oder "kein DNS" nicht nötig.
Dies ist notwendig um die Dezentralität zu wahren. Wobei man dazu sagen muss, dass unsere DNS Lösung nicht 100% dezentral ist. Daher sollte man unseren DNS als "Service innerhalb des Freifunknetzes Franken" ansehen.
Im Gegensatz zu static-stub muss Folgendes in der named.conf.local eingetragen werden (Pfade ggf. anpassen):
zone "fff.community" { type master; file "/etc/bind/db.fff.community"; allow-transfer {10.50.252.0/24; 10.83.252.0/24; fd43:5602:29bd::/48; 2a0b:f4c0::/32;}; }; zone "50.10.in-addr.arpa." { type master; file "/etc/bind/db.50.10"; }; zone "83.10.in-addr.arpa." { type master; file "/etc/bind/db.83.10"; };
Das Skript zum Erstellen/Updaten des Zone files (als root ausführen):
#!/bin/bash #Server die abgefragt werden sollen (Alle DNS Peers) DnsPeers=( 10.50.252.15 10.50.252.39 10.50.252.27 ) #Name der Zone die verteilt werden soll DomainZone="fff.community" #Position und Name des Zone Files OwnZoneFile="/etc/bind/db.fff.community" #Temporäres Verzeichnis - muss pro Zone exclusiv sein! TempDir="/tmp/fff-dns" #Backup Verzeichnis BackupDir="/home/freifunk/DNS-Backup" #Wie viele Backups sollen aufgehoben werden? Nur Integer Werte! BackupsToStore=20 echo $(date) "Script started" function dnsreload { /etc/init.d/bind9 reload } function backup { datetime=$(date +"%Y-%m-%d_%H-%M-%S") mkdir -p $1/$datetime cp $OwnZoneFile $1/$datetime/. BackupFiles=( $(ls -t $1) ) if [ -n ${BackupFiles[0]} ] && [ ${#BackupFiles[@]} -gt 20 ] then rm -rf $1/${BackupFiles[$BackupsToStore]} fi } function exit_script { rm -rf $TempDir echo $(date) "Script ended" exit $1 } mkdir -p $TempDir cd $TempDir OwnSerial=$(grep SOA $OwnZoneFile |awk 'NR==1{print $7}') HighestSerialSoFar=0 for peer in "${DnsPeers[@]}" do echo $(date) "process DNS-Peer" #Zone File von Peering DNS Servern herunterladen dig @$peer $DomainZone axfr |grep -v ";"> $peer #Seriennummer des Zone Files einlesen PeerSerial=$(grep SOA $peer |awk 'NR==1{print $7}') #Falls keine Seriennummer vorhanden, ist das File invalid oder die Verbindung zum Peer ist nicht in Ordnung if [ -z $PeerSerial ] then rm -f $peer continue PeerSerial=1 fi #Falls eigenes Zone File keine Seriennummer enthält und somit invalid ist, automatisch erstbestes valides nutzen if [ -z $OwnSerial ] then named-checkzone $DomainZone $peer if [ $? -eq 0 ] then named-compilezone -o $OwnZoneFile $DomainZone $peer fi exit 0 fi #Nur die Zone-Files mit dem höchsten Serial behalten - wenn dieser höher ist als der bereits vorhandene if [ $OwnSerial -ge $PeerSerial ] then rm -f $peer continue elif [ ${HighestSerialSoFar[0]} -gt $PeerSerial ] then rm -f $peer continue else HighestSerialSoFar=( $PeerSerial $peer ) fi done #Anzahl der verbliebenen Zone Files ermitteln PeerZoneFileCount=$(ls -l|wc -l) #Im Falle von einem Update vorher ein Backup machen if [ $PeerZoneFileCount -gt 1 ] then backup $BackupDir $BackupsToStore else exit_script 0 fi #Falls nur ein Zone File verblieben ist, direkt einspielen und neustarten if [ $PeerZoneFileCount -eq 2 ] then echo $(date) "Check Zonefile1" named-checkzone $DomainZone ${HighestSerialSoFar[1]} if [ $? -eq 0 ] then echo $(date) "Copy Zonefile1" named-compilezone -o $OwnZoneFile $DomainZone ${HighestSerialSoFar[1]} fi dnsreload exit_script 0 #Im Fall von mehreren Zone Files, prüfen ob alle identisch sind. Falls nicht Abbruch. Ansonsten einspielen und neustart else md5=$(md5sum ${HighestSerialSoFar[1]} |awk '{print $1}') for ZoneFile in * do loopmd5=$(md5sum $ZoneFile |awk '{print $1}') if [ $md5 != $loopmd5 ] then echo $(date) $md5 $loopmd5 exit_script 1 fi done echo $(date) "Check Zonefile2" named-checkzone $DomainZone ${HighestSerialSoFar[1]} if [ $? -eq 0 ] then echo $(date) "Copy Zonefile2" named-compilezone -o $OwnZoneFile $DomainZone ${HighestSerialSoFar[1]} fi dnsreload exit_script 0 fi
Script um die Reverse-DNS Zone zu erstellen
Das Skript muss jeweils einmal für 10.50.0.0/16 und 10.83.0.0/16 angelegt und entsprechend angepasst werden.
#!/bin/bash #Name der Zone DomainZone="50.10.in-addr.arpa." #Positionen und Namen der Forward Lookup Zone Files ForwardZoneFiles=("/etc/bind/db.fff.community") ReverseZoneFile="/etc/bind/db.50.10" #Temporäres Verzeichnis - muss pro Zone exclusiv sein! TempDir="/tmp/50.10.in-addr.arpa" #TTL TTL=3600 #refresh refresh=2000 #retry retry=6400 #expire expire=2419200 #minimum minimum=86400 #contact-mail contact=franken.freifunk.net. #responsible DNS Server by name(for reverseDNS your own) responsible=fff-gw-m1.gw.fff.community. ################################################################# function dnsreload { /etc/init.d/bind9 reload } function validate_ip() { local ip=$1 local stat=1 if [[ $ip =~ ^[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}\.[0-9]{1,3}$ ]]; then OIFS=$IFS IFS='.' ip=($ip) IFS=$OIFS [[ ${ip[0]} -le 255 && ${ip[1]} -le 255 \ && ${ip[2]} -le 255 && ${ip[3]} -le 255 ]] stat=$? fi return $stat } mkdir -p $TempDir Serials=() for ForwardZoneFile in "${ForwardZoneFiles[@]}" do ZoneName=$(cat $ForwardZoneFile|grep SOA| awk '{ print $1 }'|head -n 1) named-compilezone -o "$TempDir/$ZoneName" $ZoneName $ForwardZoneFile >/dev/null 2>&1 serial=$(cat "$TempDir/$ZoneName"|grep SOA| awk '{ print $7 }'|head -n 1) Serials+=( "$serial" ) done Serials=( $( for i in ${Serials[@]}; do echo "$i"; done | sort -rn ) ) serial=${Serials[0]} echo "$DomainZone $TTL IN SOA $responsible $contact $serial $refresh $retry $expire $minimum"> "$TempDir/$DomainZone" echo "$DomainZone $TTL IN NS $responsible" >> "$TempDir/$DomainZone" for ForwardZoneFile in $(ls $TempDir) do Hosts=($(cat "$TempDir/$ForwardZoneFile"|grep -v SOA|awk '{ print $1 }')) IPs=$(cat "$TempDir/$ForwardZoneFile"|grep -v SOA|awk '{ print $5 }') i=0 for IP in $IPs do if validate_ip $IP then echo $(echo $IP|awk 'BEGIN { FS = "." } ; { print $4 "." $3 "." $2 "." $1 }')".in-addr.arpa." $TTL IN PTR ${Hosts[$i]} >> "$TempDir/$DomainZone" fi i=$((i+1)) done done if [ -f $ReverseZoneFile ]; then oldSerial=$(grep SOA $ReverseZoneFile |awk 'NR==1{print $7}') else oldSerial=0 fi if [ $serial -gt $oldSerial ] then named-compilezone -o $ReverseZoneFile $DomainZone "$TempDir/$DomainZone" >/dev/null 2>&1 dnsreload fi rm -r $TempDir