PowerDNS housekeeping

PowerDNS is een DNS server welke gebruik maakt van een MySQL database voor de DNS recors bij te houden.

Deze wordt door vele hosting providers gebruikt vanwege de goede performance en schaalbaarheid. Dankzij de master – slave opstelling is het mogelijk met het AXFR protocol automatisch DNS records binnen te krijgen van de masters. Op die manier is dit schaalbaar tot het oneindige. Het enige probleem hiermee is dat bij het verwijderen van een domein op de master DNS server deze niet op de slaves verwijderd wordt, dit is een tekortkoming van het AXFR protocol. Na verloop van tijd staan er vele DNS records en domeinen die er niet meer toe doen.

Hiervoor is er een klein scriptje gemaakt welke elke dag gaat controleren of de domeinen nog bestaan en op je master servers aanwezig zijn. Zoniet dan wordt deze genoteerd tot wanneer hij meer dan 5 keer dit opmerkt. Op deze manier voorkomen we dat er domeinen verwijderd worden wanneer de master DNS servers tijdelijk down liggen.

Pas in het scriptje ook volgende configuratie items aan:

  • # MySQL settings : Hierin staan de mysql settings van je powerdns server
  • SHOWTIME=1 : Dit stellen we op 0 in als we de records effectief willen verwijderen, wanneer dit op 1 staat laat dit script gewoon zien wat hij wilt doen. Op deze manier kan je veilig testen.
  • TRY_IT=5 : Na 5x de domein niet te vinden op de master DNS server zal hij deze verwijderen. Dit is instelbaar naar wens.

We installeren dit op deze manier:

wget files.fusa.be/clean_pdns.sh -O /bin/clean_pdns;
chmod +x /bin/clean_pdns;
vi /bin/clean_pdns;
echo "12 0 * * * root /bin/clean_pdns" >> /etc/crontab
/bin/clean_pdns # We voeren een test uit of het werkt

Het scriptje vind je hier:Power DNS clean script

Een verbeterde versie van dit scriptje is hier te vinden:
http://dennis.dehoux.be/files/pdns-tools.tar.gz met dank aan all-in-one

#!/bin/bash
#
# A small script to clean out the DNS records from a PowerDNS server
#  Needed commands: mysql, host, sed, echo, cat
#  By: Tim Bracquez <tim@fusa.be>
##### START SETTINGS ####

# MySQL settings
MYSQL_HOST=localhost
MYSQL_USER=pdnsuser
MYSQL_PASS=pdnspassword
MYSQL_DB=powerdns

# Just show (1) or delete records (0)? [0-1]
SHOWTIME=1

# Working directory [/the/dir/]
WORK_DIR=/var/run/pdns/

# Delete after xx checks [0-9999]
TRY_IT=5

#### DONE SETTINGS ####
mkdir -p $WORK_DIR

for DOMAIN in $(mysql –batch -h $MYSQL_HOST -u $MYSQL_USER -p$MYSQL_PASS -D $MYSQL_DB -e “SELECT name FROM domains”); do

DOMAIN=$(echo $DOMAIN | sed ‘s/ //g’)

if [ "$DOMAIN" != "name" -a "$DOMAIN" != "" ]; then

SQL_MASTER=$(mysql –batch -h $MYSQL_HOST -u $MYSQL_USER -p$MYSQL_PASS -D $MYSQL_DB -e “SELECT master FROM domains WHERE name=’”$DOMAIN”‘”)
SQL_MASTER=$(echo $SQL_MASTER | sed ‘s/master //g’)

if [ "$SQL_MASTER" != "master" -a "$SQL_MASTER" != "" -a "$SQL_MASTER" != "NULL" ]; then

CHECK_DNS=$(host $DOMAIN $SQL_MASTER)
CHECK_DNS_GREP=$(echo $CHECK_DNS | grep “$DOMAIN has address”)
CHECK_DNS_EXEPT=$(echo $DOMAIN | grep “in-addr.arpa”)

# DNS COMMAND = OK ; DNS RESULT = OK
if [ "$CHECK_DNS" != "" -a "$CHECK_DNS_GREP" != "" -o "$CHECK_DNS_EXEPT" != "" ]; then
echo 0 > “$WORK_DIR$DOMAIN”

# DNS COMMAND = OK ; DNS RESULT = NOK
elif [ "$CHECK_DNS" != "" ]; then

if [ -e "$WORK_DIR$DOMAIN" ]; then

NUM=$(cat “$WORK_DIR$DOMAIN”)

# MAX ATTEMPTS?
if [ $NUM -ge $TRY_IT ]; then

if [ "$SHOWTIME" = "0" ]; then
rm -rf “$WORK_DIR$DOMAIN”
SQL_DID=$(mysql –batch -h $MYSQL_HOST -u $MYSQL_USER -p$MYSQL_PASS -D $MYSQL_DB -e “SELECT id FROM domains WHERE name=’”$DOMAIN”‘”)
SQL_DID=$(echo $SQL_DID | sed ‘s/id //g’)

if [ "$SQL_DID" != "" ]; then
mysql –batch -h $MYSQL_HOST -u $MYSQL_USER -p$MYSQL_PASS -D $MYSQL_DB -e “DELETE FROM records WHERE domain_id=’”$SQL_DID”‘”
mysql –batch -h $MYSQL_HOST -u $MYSQL_USER -p$MYSQL_PASS -D $MYSQL_DB -e “DELETE FROM domains WHERE id=’”$SQL_DID”‘”
fi
else
echo “TO DELETE: $DOMAIN”
fi

else
NUM=$((NUM+1))
echo $NUM > “$WORK_DIR$DOMAIN”
fi

else
echo 1 > “$WORK_DIR$DOMAIN”
fi

fi

fi

fi

# DNS requests overflow!?
#sleep 5

done

Dit artikel werd geschreven in de categorie bash en gaat over , , .
Lees de reacties of reageer zelf.

Schrijf een reactie!

Je moet ingelogd zijn om een reactie te mogen schrijven.

Volg deze blog

Blijf op de hoogte van nieuwe artikels en sla deze bladwijzer op.

Blijf op de hoogte