DNS: Unterschied zwischen den Versionen

Aus Freifunk Franken
Wechseln zu:Navigation, Suche
(45 dazwischenliegende Versionen von 7 Benutzern werden nicht angezeigt)
Zeile 1: Zeile 1:
{{Entwurf}}
__TOC__
__TOC__


== Konzept ==
== Konzept ==


Für die interne Nutzung im Freifunknetz wurde durch ChristianD. die Domain fff.community reserviert.
Für die interne Nutzung im Freifunknetz besitzt F3 Netze e.V. die Domain fff.community
Wir haben keine eigene Toplevel-Domain genutzt um Kollisionen vorzubeugen.
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.
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 jemand eine Domain für seinen Service haben möchte, kann dies mit einen Pull Request gegen dieses git angefragt werden: https://git.freifunk-franken.de/freifunk-franken/dns
Wenn Subdomains delegiert werden sollen, müssen mindestens 2 Gateways von verschiedenen Betreibern autoritativ sein und das Zone-File entsprechend austauschen.
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 ==
== Funktionsfähigkeit auf allen Gateways ==


Um sicher zu stellen, das dass DNS im ganzen Netz funktioniert, müssen alle Gateways korrekt konfiguriert sein.
Um sicher zu stellen, dass das DNS im ganzen Netz funktioniert, müssen alle Gateways korrekt konfiguriert sein.
Es gibt 3 Möglichkeiten um dies zu erreichen:
Es gibt drei 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.


**Aktuell wären das:
===  Andere DNS Server nutzen ===
*** 10.83.252.11
Es muss nicht zwingend ein eigener DNS-Server betrieben werden, dann aber bitte nicht auf einen öffentlichen (z. B. 1.1.1.1 oder 2606:4700:4700::1111) verweisen, sondern auf einen unsere Server. Somit braucht man sich um die Konfiguration keine Gedanken machen.  
*** 10.50.40.10
*** 10.50.252.0


* Eigener DNS-Server mit peering der Zonen
Aktuell wären das folgende:
:Hierzu sind die untenstehenden Scripts und das Zutun der bereits am peering angeschlossenen Server Betreiber notwendig
 
* Eigener DNS-Server mit Static-Stub
{| class="wikitable"
:siehe hierzu Static-Stub Konfiguration
! IPv4-Adresse
! IPv6-Adresse
! Betreiber
! Bemerkung
|-
| 10.50.40.10 || – || [[Benutzer:Mayosemmel | Mayosemmel]] ||
|-
| 10.50.252.0 || fd43:5602:29bd:ffff::252 || [[Benutzer:RedDog | RedDog]] ||
|-
| 10.83.252.0 || fd43:5602:29bd:ffff::42 || [[Benutzer:fblaese | fblaese]] ||
|-
| 10.83.252.11 || fd43:5602:29bd:ffff:a:a:a:a || [[Benutzer:ChristianD | 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 || [[Benutzer:Adrian Schmutzler | Adrian Schmutzler]] ||
|}
 
==== DoH/DoT ====
Mittlerweile werden im Freifunk Franken Netz auch DoT/DoH DNS Server betrieben. Aktuell gibt es folgende Server:
 
{| class="wikitable"
! IPv4-Adresse
! IPv6-Adresse
! Betreiber
! Domain für Zertifikat
! Bemerkung
|-
| 10.83.227.163 || fd43:5602:29bd:ffff:c:c:c:c || [[Benutzer:ChristianD | 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. Die Unbound config von hier ist dazu brauchbar https://wiki.freifunk-franken.de/w/Freifunk-Gateway_aufsetzen/DNS#unbound_config
 
=== Eigener DNS-Server mit peering der Zonen ===
Die Anzahl der DNS-Server sollte aber beschränkt bleiben. Drei sind eine gute Anzahl.
Hierzu sind die [[#Synchronisationsscript|untenstehenden Scripts]] und das Zutun der bereits am peering angeschlossenen Server Betreiber notwendig
 
=== Eigener DNS-Server mit Static-Stub ===
siehe hierzu [[#StaticStub]]
 
<span style="color:#ff0000">'''Hinweis:'''</span> 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:
 
<code>
apt-get install bind9 bind9utils dnsutils
</code>


== Static-Stub Konfiguration ==
== Static-Stub Konfiguration ==
 
<div id="StaticStub"></div>
Ein so genannter Static-Stub sorgt dafür, dass 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.
Voraussetzung ist allerdings, dass keine Forwarder eingetragen sind.
Voraussetzung ist allerdings, dass keine Forwarder eingetragen sind.
Zeile 39: Zeile 85:
zone "50.10.in-addr.arpa" {
zone "50.10.in-addr.arpa" {
     type static-stub;
     type static-stub;
     server-addresses { 10.50.40.10; 10.83.252.11; 10.50.252.0; };
     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" {
zone "fff.community" {
     type static-stub;
     type static-stub;
     server-addresses { 10.50.40.10; 10.83.252.11; 10.50.252.0; };
     server-addresses { 10.50.40.10; 10.83.252.11; 10.50.252.0; 10.83.252.62; };
};
};
</pre>
</pre>
Zeile 73: Zeile 124:
zone "50.10.in-addr.arpa" {
zone "50.10.in-addr.arpa" {
     type static-stub;
     type static-stub;
     server-addresses { 10.50.40.10; 10.83.252.11; 10.50.252.0; };
     server-addresses { 10.50.40.10; 10.83.252.11; 10.50.252.0; 10.83.252.62; };
};
};


zone "fff.community" {
zone "fff.community" {
     type static-stub;
     type static-stub;
     server-addresses { 10.50.40.10; 10.83.252.11; 10.50.252.0; };
     server-addresses { 10.50.40.10; 10.83.252.11; 10.50.252.0; 10.83.252.62; };
};
};
EOF
EOF
Zeile 112: Zeile 163:


== Synchronisationsscript für DNS-Zones ==
== Synchronisationsscript für DNS-Zones ==
Dieses script ist nur zu verwenden, wenn man kein "static-stub" macht
<div id="Synchronisationsscript"></div>
 
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.
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):
<pre>
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";
};
</pre>
Das Skript zum Erstellen/Updaten des Zone files (als root ausführen):
<pre>
<pre>
#!/bin/bash
#!/bin/bash
Zeile 248: Zeile 322:


== Script um die Reverse-DNS Zone zu erstellen ==
== 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.


<pre>
<pre>
Zeile 340: Zeile 416:


</pre>
</pre>
== 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 [[Server#Gateway_Server_.22fff-gw-cd1.22|fff-gw-cdfue1]] || Internet ||
|-
|| http://fff-fra1.fff.community/ || [[Benutzer:delphiN]] || Monitoring von [[Server/fff-fra1]] || Internet ||
|-
|| http://owncloud.fff.community/ || [[Benutzer:ChristianD]] || Owncloud Instanz, Accountanfragen an mich, aktuell Beta! || Freifunknetz ||
|-
|| *.bridge.fff.community || alle || wird verwendet um 5GHz Bridges mit einen Namen anzusprechen || Freifunknetz ||
|-
|| MAC.node.fff.community || alle || hiermit können Router über DNS erreicht werden, anstatt MAC muss die MAC Adresse des Routers ohne Doppelpunkte angegeben werden || Freifunknetz ||
|-
|| fff-bc.christiand.fff.community || [[Benutzer:ChristianD]] || Bitcoin Fullnode Port 8333 || Freifunknetz
|}

Version vom 29. März 2020, 22:59 Uhr

Konzept

Für die interne Nutzung im Freifunknetz besitzt F3 Netze e.V. die Domain fff.community 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, kann dies mit einen Pull Request gegen dieses git angefragt werden: https://git.freifunk-franken.de/freifunk-franken/dns 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 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, dann aber bitte nicht auf einen öffentlichen (z. B. 1.1.1.1 oder 2606:4700:4700::1111) verweisen, sondern auf einen unsere 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

Mittlerweile werden im Freifunk Franken Netz 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. Die Unbound config von hier ist dazu brauchbar https://wiki.freifunk-franken.de/w/Freifunk-Gateway_aufsetzen/DNS#unbound_config

Eigener DNS-Server mit peering der Zonen

Die Anzahl der DNS-Server sollte aber beschränkt bleiben. Drei sind eine gute Anzahl. Hierzu sind die untenstehenden Scripts und das Zutun der bereits am peering angeschlossenen Server Betreiber notwendig

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