Migrating a DNS server to PowerDNS

Today I had to migrate a customer’s DNS server to a new server… This because the old server (a very old plesk instance) was end of life.

As I have very good experiences with PowerDNS, we decided to migrate from Bind (Named) to PowerDNS.

PowerDNS provides you with the utilities to do so, but I did not find a straight forward way to export/import zones from Bind into PowerDNS.

Installation of PowerDNS and PowerAdmin (a PowerDNS Gui) is out of the scope of this document, so I assume you already have a working PowerDNS server.

These are the steps I had to perform to migrate from the Plesk 8.2 server to PowerDNS:

1) First of all, you need to allow zone transfer (AXFR) on your bind server from your new PowerDNS server IP. You need to change the contents of /etc/named.conf in something like this (add the allow-transfer lines in the Options block.

options {
  ...
  allow-transfer {xx.xx.yy.zz;};
  allow-transfer {aa.bb.cc.dd;};
  ... 
};

2) Reload or restart named to take effect:

/etc/init.d/named reload

3)Test a zone transfer, eg:

dig AXFR @old.nameserver.tld test.tld

4) Now that you know zone transfer is working, create a list of domains that your Bind server is ‘serving’.  In my case i have to remove some extra .lock and .saved_by_psa files from my listing. If you use this tutorial, your command can look differently of course.

ls -1 /var/named/run-root/var/ | grep -v .lock | grep -v .saved_by_psa > /root/domainlist.dns

If needed: check if the domains in bind still use your old nameservers… (do not polute your new powerDNS server :))

cat /root/domainlist.dns | while read domein; do echo $domein; dig ns $domein +short ; done > /root/domain_nsusage.txt

Then delete all domains from /root/domainlist.dns if they not valid anymore
5) Import your zones by:
a) Create Zone Import SQL scripts

for zone in `cat /root/domainlist.dns` ; do dig AXFR @old.nameserver.tld $zone > /tmp/$zone.sql ; zone2sql --gmysql --zone-name=$zone --zone=/tmp/$zone.sql > /tmp/import.$zone; done

From these generated files, remove duplicate SOA records from all import files:

cd /tmp && for zone in `ls -1 import.*`; do sort $zone| uniq > fresh.$zone; done

If needed: change TTLs:

sed -i 's/86400,/900,/g' /tmp/import.*.sql

Depending if your imported zones need to be set as NATIVE or MASTER

sed -i 's/NATIVE/MASTER/g' /tmp/import.*.sql

Change extra stuff with sed, like hostmaster and so on

b) Test import into mysql

mysql -uroot -p powerdns < /tmp/import.testdomain.tld.sql

c) Verify in poweradmin and drop the imported zone (or you’ll get an import error on the next step, which is not bad or something… but hey :))

d) Import all your zones, if you like what you have done:

for zone in `ls -1 /tmp/import.*.sql`; do mysql powerdns < /$zone; done

 

2 thoughts on “Migrating a DNS server to PowerDNS”

  1. hi nicovs

     

    im trying to follow your steps but unfortuneatly i have issues in remove duplicate soa

     

    for zone in `ls -1 /tmp/import.*`; do sort import.$zone| uniq > fresh.$zone; done

    output:

    sort: error : import./tmp/import.www.grupovidela.com: File or directory do not exist

    Do you know how to fix it? I have tested lot of modifications without success

     

    great work by the way!

    1. Oops… My bad… Updated the post: it should be: cd /tmp && for zone in `ls -1 import.*`; do sort $zone| uniq > fresh.$zone; done

Leave a Comment

Your email address will not be published. Required fields are marked *

Scroll to Top