:: Exporting NicTool to BIND
:: What is
+ NicTool
NicTool is a free DNS management suite that takes all the headaches out of managing DNS. It includes an attractive web interface for users, admins, and clients to access and update their DNS zone data as well as a rich API for provisioning systems to interact with. All zone data is stored in MySQL and is extracted by export scripts to the DNS server of choice (tinydns, BIND, PowerDNS). :: NicTool
+ BIND
BIND is the most widely used DNS software on the Internet. On Unix-like operating systems it is the de facto standard. :: wikipedia
:: Installing Requirement
+ Installing Bind on Linux Debian
aptitude install bind9
+ Installing NicTool
:: Create script for Export to BIND
mkdir /exportscript cd /exportscript/ vi export_bind.php
add these line:
<?php /* nictool bind export script - created by Mihai Secasiu - //patchlog.com */ /* Version 1.3 BUGS FIXED: 1. SOA records were inverted 2. in-addr.arpa zones were not being generated correctly 3. Fixed a major bug where an empty zones.conf file was generated if the export script was unable to connect to MySQL (very bad as it means no zone data loaded or served!!) */ $db_name="nictool"; $db_user="nictool"; $db_pass="nictool"; $db_host="localhost"; $zones_dir="data/"; // directory used for storing the zone files, the script will delete the zone that are set as deleted from this folder. $zone_template="{ZONE_NAME}.zone"; // template used for zone filename. {ZONE_NAME} will be replaced by script with the domain name $conf_file="data/zones.conf"; // file where the script will write the zone entries. The script will truncate the file on open if($zones_dir[strlen($zones_dir)-1]!='/'){ $zones_dir.='/'; } if(!($cf=fopen("$conf_file.tmp",'w'))){ die("cannot open configuration file: $conf_filen"); } function get_ns($nsid) { global $nameservers; if(isset($nameservers[$nsid]))return $nameservers[$nsid]; $sql="SELECT name,ttl,description FROM nt_nameserver where nt_nameserver_id=".intval($nsid)." and deleted!='1'"; if(!($res=mysql_query($sql))){ die("query: $sql: failed with error: ".mysql_error()."n"); } $nameservers[$nsid]=mysql_fetch_array($res); return $nameservers[$nsid]; } if(!($dbl=mysql_connect($db_host,$db_user,$db_pass))){ die("cound not connect to the database servern"); } mysql_select_db($db_name, $dbl) or die("Could not select database: $db_namen"); if(count($argv)>1){ if(get_ns($argv[1])){ $ns=$argv[1]; $nsq="AND (ns0 = $ns OR ns1 = $ns OR ns2 = $ns OR ns3 = $ns OR ns4 = $ns OR ns5 = $ns OR ns6 = $ns OR ns7 = $ns OR ns8 = $ns OR ns9 = $ns) "; }else{ die("nameserver id invalid or nameserver deletedn"); } }else{ $nsq=""; } $c=0; $sql="SELECT * FROM nt_zone $nsq"; if(!($res=mysql_query($sql))){ die("query: $sql: failed with error: ".mysql_error()."n"); } while($z=mysql_fetch_assoc($res)){ $fn=$zones_dir.preg_replace('/{ZONE_NAME}/',$z['zone'],$zone_template); if($z['deleted']=="1"){ if(is_file($fn)){ unlink($fn); echo "Deleted zone file for zone ${z['zone']}n"; } continue; } $nst=""; // nameserver text $fns=""; // first nameserver for SOA record for($i=0;$i<=9;$i++){ if($z['ns'.$i] && ($ns=get_ns($z['ns'.$i])) ){ $nst.="@ ${ns['ttl']} IN NS ${ns['name']} ; ${ns['description']}n"; if($fns=="")$fns=$ns['name']; } } echo "Generating zone file for domain: ".$z['zone']." -"; $t="; ${z['description']} $ttl ${z['ttl']} @ IN SOA $fns ${z['mailaddr']} ( ${z['serial']} ${z['refresh']} ${z['retry']} ${z['expire']} ${z['minimum']} ) "; $t.=$nst; $sql="SELECT * FROM nt_zone_record where nt_zone_id=".$z['nt_zone_id']. " and deleted!='1'"; if(!($rres=mysql_query($sql))){ die("query: $sql: failed with error: ".mysql_error()."n"); } while($r=mysql_fetch_assoc($rres)){ $t.="${r['name']} ${r['ttl']} IN ${r['type']}"; if(in_array($r['type'],array('A','AAAA','NS','CNAME','PTR'))){ $t.=" ${r['address']}"; }elseif($r['type']=='TXT'){ $t.=" "${r['address']}""; }elseif($r['type']=='MX'){ $t.=" ${r['weight']} ${r['address']}"; }elseif($r['type']=='SRV'){ $t.=" ${r['priority']} ${r['weight']} ${r['other']} ${r['address']}"; } $t.=" ; ${r['description']}n"; } if(!file_put_contents($fn,$t)){ die("error writing to file: $fnn"); } $ze=" zone "${z['zone']}" IN { type master; file "$fn"; allow-update {none; }; notify no; }; "; if(!fwrite($cf,$ze)){ die("error writing to zones configuration file: $conf_filen"); } echo " file generated OKn"; $c++; } fclose($cf); rename("$conf_file.tmp",$conf_file); echo "Successfully exported $c domains. Exiting..n";
:: Setup crontab for exporting zone file
+ Create zonecopy.sh
cd /exportscript/ vi zonecopy.sh
add these line:
#!/bin/bash ####### # exporting ############ cd /exportscript/ /usr/bin/php export_bind.php ########## # copy zone file ################ # local server scp data/* /var/cache/bind/data # remotely scp data/* [email protected]:/var/cache/bind/data scp data/* [email protected]:/var/cache/bind/data ######### # reload ########## # local killall -HUP named # remotely ssh [email protected] killall -HUP named ssh [email protected] killall -HUP named sleep 5
+ Setup crontab
crontab -e
setup like this:
*/5 * * * * /bin/sh /exportscript/zonecopy.sh >/dev/null 1>/dev/null
:: Create sub folder in the directory that your script is located in called "data"
cd /exportscript mkdir data chown bind.bind data
:: Add zones.conf to named.conf
vi /etc/bind/named.conf
add this line:
include "/exportscript/data/zones.conf";
:: Setup working directory and users
+ Create directory for exporting
cd /var/cache/bind mkdir data chown bind.bind data
+ Modify shell on bind users
vi /etc/passwd
change on this line, like:
bind:x:111:119::/var/cache/bind:/bin/sh
:: Testing
Add some DNS zone on NicToolClient, and testing your zone record useing dig, nslookup, host or other domain tool checker.
:: Links
+ Google
+ LinuxPower
+ TNPI