DNS
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.
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 |