Skip to main content

Generating IPv6 PTR records for bind9 using Bash

·2 mins

The following script takes a Bind9 zonefile, gets all AAAA records from it and generates PTR records based on them.

What you need to do:

  1. Edit the Zone header in the script.
  2. Run the script with ./generate_v6_ptr.sh /path/to/zonefile.zone

This will output the zones on STDOUT. If you want to save this to a zonefile, you can use this example: ./generate_v6_ptr.sh /path/to/zonefile.zone > /etc/bind/ip6.arpa.zone

#!/bin/bash

read -r -d '' ZONEHEADER <<- EOM
$TTL 1h    ; Default TTL
@    IN    SOA    <NAMESERVER 1>.    <ABUSE EMAIL>. (
    2019071201    ; serial
    1h        ; slave refresh interval
    15m        ; slave retry interval
    1w        ; slave copy expire time
    1h        ; NXDOMAIN cache time
    )
;
; domain name servers
;
@    IN    NS    <NAMESERVER 1>.
@    IN    NS    <NAMESERVER 2>.
; IPv6 PTR entries
EOM

# Script:

function reverseIp6 {
    echo "$1" | awk -F: 'BEGIN {OFS=""; }{addCount = 9 - NF; for(i=1; i<=NF;i++){if(length($i) == 0){ for(j=1;j<=addCount;j++){$i = ($i "0000");} } else { $i = substr(("0000" $i), length($i)+5-4);}}; print}' | rev | sed -e "s/./&./g"
}


if [ -z "$1" ]
then
    echo "Usage: $0 <zonefile>"
    exit 1
fi

RECORD=(`cat $1 | grep AAAA | awk -v'OFS=,' '$2 == "IN" {print $4}'`)
HOST=(`cat $1 | grep AAAA | awk -v'OFS=,' '$2 == "IN" {print $1}'`)

echo "$ZONEHEADER"
for (( i=0; i<${#RECORD[@]}; i++ )); do
    echo "$(reverseIp6 ${RECORD[i]})ip6.arpa.     IN    PTR     ${HOST[i]}";
done