DNS: Unterschied zwischen den Versionen

Aus Freifunk Franken
Wechseln zu:Navigation, Suche
Zeile 25: Zeile 25:
== Static-Stub Konfiguration ==
== Static-Stub Konfiguration ==


Ein so genannter Static-Stub sorgt dafür, das Bind für definierte Zonen immer zuerst die festgelegten DNS-Server anfragt.
Ein so genannter Static-Stub sorgt dafür, dass Bind für definierte Zonen immer zuerst die festgelegten DNS-Server anfragt.


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
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''


<pre>
<pre>
Zeile 43: Zeile 43:


Weiterhin sollte das ICVPN-DNS aufgenommen werden. Wie das passiert ist [https://wiki.freifunk.net/DNS hier] erklärt.
Weiterhin sollte das ICVPN-DNS aufgenommen werden. Wie das passiert ist [https://wiki.freifunk.net/DNS hier] erklärt.


== Synchronisationsscript für DNS-Zones ==
== Synchronisationsscript für DNS-Zones ==

Version vom 23. Dezember 2015, 15:42 Uhr

Diese Seite befindet sich noch im Entwurfsstadium.
Hilf mit sie zu verbessern!


Konzept

Für die interne Nutzung im Freifunknetz wurde durch ChristianD. die Domain fff.community reserviert. Wir haben keine eigene Toplevel-Domain genutzt um Kollisionen vorzubeugen.

Eine Gruppe von verschiedenen Gateway Betreibern ist autoritativ für die Zone zuständig und synchronisiert untereinander das Zonefile mittels untenstehendem Script.

Wenn jemand eine Domain für seinen Service haben möchte, sollte eine Mail an die Mailingliste genügen. Wenn Subdomains delegiert werden sollen, müssen mindestens 2 Gateways von verschiedenen Betreibern autoritativ sein und das Zone-File entsprechend austauschen.

Funktionsfähigkeit auf allen GWs

Um sicher zu stellen, das dass DNS im ganzen Netz funktioniert, müssen alle Gateways korrekt konfiguriert sein. Es gibt 3 Möglichkeiten um dies zu erreichen:

  • Kein eigener DNS-Server
Wenn kein eigener DNS-Server betrieben wird, bitte nicht auf einen öffentlichen verweisen, sondern auf einen unserer Server. Somit braucht man sich um die Konfiguration keine Gedanken machen.
  • Eigener DNS-Server mit peering der Zonen
Hierzu sind die untenstehenden Scripts und das Zutun der bereits am peering angeschlossenen Server Betreiber notwendig
  • Eigener DNS-Server mit Static-Stub
siehe hierzu Static-Stub Konfiguration

Static-Stub Konfiguration

Ein so genannter Static-Stub sorgt dafür, dass Bind für definierte Zonen immer zuerst die festgelegten DNS-Server anfragt.

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.50.48.3; 10.50.252.8; };
};

zone "fff.community" {
    type static-stub;
    server-addresses { 10.50.40.10; 10.50.48.3; 10.50.252.8; };
};


Weiterhin sollte das ICVPN-DNS aufgenommen werden. Wie das passiert ist hier erklärt.

Synchronisationsscript für DNS-Zones

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.

#!/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 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
	/etc/init.d/bind9 reload
	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
        /etc/init.d/bind9 reload
        exit_script 0
fi


Script um die Reverse-DNS Zone zu erstellen

#!/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 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

oldSerial=$(grep SOA $ReverseZoneFile |awk 'NR==1{print $7}')


if [ $serial -gt $oldSerial ]
then
	named-compilezone -o $ReverseZoneFile $DomainZone "$TempDir/$DomainZone" >/dev/null 2>&1
	/etc/init.d/bind9 reload
fi
rm -r $TempDir

Bereits angelegte Domains & Services

In diese Liste kann sich jeder "Servicebetreiber" freiwillig eintragen. Sie wird nicht automatisch aus der Zonefile generiert und daher besteht auch kein Anspruch auf Vollständigkeit.

Domain Bereitgestellt durch Art des Services erreichbar über
http://fff-gw-cd1.fff.community/ Benutzer:ChristianD Monitoring von fff-gw-cdfue1 Internet
http://owncloud.fff.community/ Benutzer:ChristianD Owncloud Instanz, Accountanfragen an mich, aktuell Beta! Freifunknetz