Betreiben eines MySQL-basierten DNS Servers: MyDNS

Betreiben eines MySQL-basierten DNS Servers: MyDNS

Version 1.0
Author: Falko Timme <ft [at] falkotimme [dot] com>
Last edited: 12/15/2005

Diese Anleitung veranschaulicht, wie man MyDNS, einen DNS Server, der eine MySQL Datenbank als Backend anstelle von Konfigurationsdateien wie Bind oder djbdns verwendet, installiert und konfiguriert. Das hat den Vorteil, dass Du web-basierte Frontends benutzen kannst um Deine DNS Einträge zu verwalten. Du könntest sogar Dein eigenes Frontend schreiben, z.B. mit PHP, um mit der MyDNS Datenbank zu interagieren. MyDNS liest einfach die Einträge der Datenbank und muss nicht neu gestartet/geladen werden wenn sich DNS Einträge ändern oder Zonen erstellt/bearbeitet/gelöscht werden! Dies ist ein großer Vorteil.

Weiterhin werde ich zeigen, wie man einen zweiten DNS Server einrichtet. Jedoch werde ich keine normalen Zonentransfers verwenden um die Einträge vom ersten auf den zweiten DNS Server zu bekommen. Stattdessen werde ich die MySQL Datenbankspiegelung (Replikation) verwenden. Ich werde einfach die Daten des ersten Servers auf den zweiten Server replizieren.

Es gibt mehrere Web Frontends für MyDNS. Natürlich kannst Du phpMyAdmin zur MyDNS Administration verwenden, oder auch das Frontend, das mit MyDNS (welches nicht für Anfänger geeignet ist, da die Feldbeschreibungen fehlen) kommt, oder aber MyDNSConfig, ein Tool, das von mir selbst geschrieben worden ist. Ich werde zeigen, wie man jedes einzelne Tool installiert.

Alles in allem macht MyDNS auf mich einen sehr guten Eindruck und ich denke, dass die Zukunft Diensten gehört, die eine Datenbank als Backend anstelle von Konfigurationsdateien verwenden.

Für dieses Setup habe ich ein Debian Sarge System verwendet. Jedoch sollten die meisten hier beschriebenen Schritte auch für andere Distributionen gelten, wie Fedore, SuSE, Mandriva, etc.

An dieser Stelle möchte ich darauf hinweisen, dass dies nicht der einzige Weg ist ein solches System einzurichten. Es gibt viele Wege dieses Ziel zu erreichen – dies ist der Weg, den ich gewählt habe. Ich übernehme keine Garantie, dass dies auch bei Dir funktioniert!

1 Installation von MySQL und MyDNS

Vergewissere Dich zunächst, dass Du eine funktionierende Basisinstallation von Debian hast, wie auf https://www.howtoforge.com/perfect_setup_debian_sarge und https://www.howtoforge.com/perfect_setup_debian_sarge_p2 beschrieben wird (bitte wende Dich an das entsprechende „Perfect Setup“ Dokument auf HowtoForge wenn Du eine andere Distribution verwendest).

Installiere dann MySQL:

apt-get install mysql-server mysql-client libmysqlclient12-dev phpmyadmin

Dir werden ein paar Fragen gestellt:

Enable suExec? <– Yes
Which web server would you like to reconfigure automatically? <– apache, apache2
Do you want me to restart apache now? <– Yes

Richte ein root MySQL Passwort wie folgt ein:

mysqladmin -u root password yourrootsqlpassword

Die MyDNS Installation ist einfach. Folge einfach diesen Schritten:

cd /tmp/
wget http://mydns.bboy.net/download/mydns-1.0.0.tar.gz
tar xvfz mydns-1.0.0.tar.gz
cd mydns-1.0.0/
./configure
make
make install

Nun müssen wir die MyDNS Datenbank (mit der Bezeichnung mydns) und einen MyDNS Dantenbankbenutzer (auch mit der Bezeichnung mydns, mit mydns_password als Passwort) erstellen:

mysql -u root -p
Enter password:

Nun erstellen wir in der MySQL Kommandozeile die mydns Datenbank und den Benutzer mydns:

CREATE DATABASE mydns;
GRANT SELECT, INSERT, UPDATE, DELETE ON mydns.* TO ‚mydns’@’localhost‘ IDENTIFIED BY ‚mydns_password‘;
GRANT SELECT, INSERT, UPDATE, DELETE ON mydns.* TO ‚mydns’@’localhost.localdomain‘ IDENTIFIED BY ‚mydns_password‘;
FLUSH PRIVILEGES;
quit;

Zurück in der normalen Kommandozeile, erstellen wir die Tabellen in der mydns Datenbank:

mydns –create-tables | mysql -u root -p mydns
Enter password:

Falls Du Fehler wie diese siehst:

mydns[14287]: error loading gid for group `nobody‘
mydns[14287]: using gid 65534 from user `nobody‘

mach Dir keine Sorgen, die kannst Du ignorieren.

Als Nächstes fügen wir zwei weitere Spalten der soa Tabelle der mydns Datenbank hinzu:

mysql -u root -p
Enter password:
ALTER TABLE mydns.soa ADD COLUMN active ENUM(‚Y‘,’N‘) NOT NULL;
ALTER TABLE mydns.soa ADD INDEX (active);
ALTER TABLE mydns.soa ADD COLUMN xfer CHAR(255) NOT NULL;
quit;

Mit der active Spalte kannst Du später einfach Zonen aktivieren/deaktivieren und die xfer Spalte kann für Zonentransfers verwendet werden (die wir nicht brauchen, da wir die MySQL Datenbankspiegelung verwenden werden um die Daten auf den zweiten DNS Server zu bekommen, ich erwähne es nur der Vollständigkeit halber) (wenn Du Zonentransfers anstelle von der Datenbankspiegelung verwenden möchtest, dann sollte die xfer Spalte eine oder mehrere IP Adressen beinhalten, durch Kommas getrennt. Diese IP Adressen dürfen die Zone transferieren.).

Nun erstellen wir die MyDNS Konfigurationsdatei /etc/mydns.conf indem wir diesen Befehl ausführen:

cd /tmp/mydns-1.0.0/
make conf

Dann bearbeiten wir /etc/mydns.conf sodass es wie folgt aussieht:

##
##  /etc/mydns.conf
##  Fri Oct 21 16:36:32 2005
##  For more information, see mydns.conf(5).
##

                                # DATABASE INFORMATION

db-host = localhost             # SQL server hostname
db-user = mydns                 # SQL server username
db-password = mydns_password    # SQL server password
database = mydns                # MyDNS database name

                                # GENERAL OPTIONS

user = nobody                   # Run with the permissions of this user
group = nogroup                 # Run with the permissions of this group
listen = *                      # Listen on these addresses ('*' for all)

                                # CACHE OPTIONS

zone-cache-size = 1024          # Maximum number of elements stored in the zone cache
zone-cache-expire = 60          # Number of seconds after which cached zones expires
reply-cache-size = 1024         # Maximum number of elements stored in the reply cache
reply-cache-expire = 30         # Number of seconds after which cached replies expire

                                # ESOTERICA

log = LOG_DAEMON                # Facility to use for program output (LOG_*/stdout/stderr)
pidfile = /var/run/mydns.pid    # Path to PID file
timeout = 120                   # Number of seconds after which queries time out
multicpu = 1                    # Number of CPUs installed on your system
allow-axfr = no                 # Should AXFR be enabled?
allow-tcp = yes                 # Should TCP be enabled?
ignore-minimum = no             # Ignore minimum TTL for zone?
soa-table = soa                 # Name of table containing SOA records
rr-table = rr                   # Name of table containing RR data

Vergewissere Dich, dass Du die richtigen Datenbankangaben eingibst. Pass auch bei der Gruppe auf. Auf Debian ist die Gruppe von nobody die Gruppe nogroup, die vom Standardwert in /etc/mydns.conf abweicht (also nobody), also stelle sicher, dass Du dies änderst! Stelle allow-tcp auf yes.

Nun erstellen wir das MyDNS Init Skript /etc/init.d/mydns:

#! /bin/sh
#
# mydns         Start the MyDNS server
#
# Author:       Falko Timme <ft@falkotimme.com>.
#

set -e

PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
NAME=mydns
DAEMON=/usr/local/sbin/$NAME
DESC="DNS server"

SCRIPTNAME=/etc/init.d/$NAME

# Gracefully exit if the package has been removed.
test -x $DAEMON || exit 0

case "$1" in
  start)
        echo -n "Starting $DESC: $NAME"
        $DAEMON --background
        echo "."
        ;;
  stop)
        echo "Stopping $DESC: $NAME."
        kill -9 `pidof $NAME` &> /dev/null
        ;;
  restart)
        echo "Restarting $DESC: $NAME."
        $0 stop && sleep 1
        $0 start
        ;;
  *)
        echo "Usage: $SCRIPTNAME {start|stop|restart}" >&2
        exit 1
        ;;
esac

exit 0

Dann veranlassen wir, dass es ausführbar wird und starten MyDNS:

chmod 755 /etc/init.d/mydns
/etc/init.d/mydns start

Wenn Du möchtest, dass MyDNS beim Hochfahren automatisch gestartet wird, musst Du die notwendigen System Bootup Links erstellen. Auf Debian führst Du dies wie folgt aus:

update-rc.d mydns defaults 21 22

Auf Fedora oder RedHat würdest Du dies ausführen:

chkconfig –levels 235 mydns on

2 Installation eines Web Interfaces für MyDNS

In den folgenden Schritten gehe ich davon aus, dass Du Debian Sarge verwendest; der Standard Dokumenten-Root von Debian Apache ist /var/www, also werde ich die Web Interfaces hier installieren. Weiterhin gehe ich davon aus, dass der Hostname ns1.example.com ist.

2.1 phpMyAdmin

phpMyAdmin wurde zu Anfang dieser Anleitung installiert (apt-get install mysql-server mysql-client libmysqlclient12-dev phpmyadmin), Du also unter http://ns1.example.com/phpmyadmin darauf zugreifen können. Wähle dann die Datenbank mydns und Du solltest die Tabellen rr und soa sehen können. Sieh Dir Folgendes an, um eine Erklärung für die Struktur/Felder etc. der Datenbank zu erhalten: http://mydns.bboy.net/doc/html/mydns_8.html#SEC8

2.2 Das originale MyDNS Web Interface

Um das originale MyDNS Web Interface zu installieren (geht mit dem MyDNS Quelltext einher, der immer noch im /tmp Verzeichnis sein sollte), führe dies aus:

cp /tmp/mydns-1.0.0/contrib/admin.php /var/www

Bearbeite dann /var/www/admin.php und konfiguriere die Variabeln im ersten Teil dieses Skriptes, z.B. wie folgt:

/*****************************************************************************
        CONFIGURABLE OPTIONS
*****************************************************************************/

/*
**  Set the following four variables to the hostname of your SQL server, the
**  username and password used to access that server, and the name of the
**  database where your MyDNS data resides.
*/
$dbhost = "localhost";
$dbuser = "mydns";
$dbpass = "mydns_password";
$dbname = "mydns";

/*
**  This script uses MySQL by default.  To use PostgreSQL instead, set
**  '$use_pgsql' to '1'.
*/
$use_pgsql = 0;

/*
**  The following two variables tell this script the name of your SOA
**  table and the name of your RR table.
*/
$soa_table_name = "soa";
$rr_table_name = "rr";

/*
**  The following two values configure the number of records shown per page
**  in the zone browser and the resource record editor, respectively.
*/
$zone_group_size = 25;
$rr_group_size = 20;

/*
**  This script can automatically update the serial number for a zone
**  whenever a client modifies any record in that zone.
**  Setting '$auto_update_serial' to '1' will enable this option.
*/
$auto_update_serial = 1;

/*
**  This script can automatically update PTR records when you modify,
**  add, or delete A records.  To enable this functionality, set
**  '$auto_update_ptr' to '1'.  If you enable this, be sure to fill in
**  the values for '$default_ns' and '$default_mbox', below, so that
**  new SOA records will have the correct information.
*/
$auto_update_ptr = 1;

/*
**  If this option is nonzero, this script will not complain if the
**  TTL for a record is set below the zone minimum.
**
**  Note that if $ttl_min below is nonzero, that value will still be
**  checked.
*/
$ignore_minimum_ttl = 1;

/*
**  The following values are used by this script to enforce minimum values
**  for SOA and RR records.  The script will prevent clients from entering
**  values lower than these numbers.
*/
$ttl_min = 300;
$refresh_min = 300;
$retry_min = 300;
$expire_min = 86400;

/*
**  The following two variables specify the default nameserver for new
**  SOA records, and the default administrator mailbox for new SOA records.
**  These will be filled in automatically whenever a new zone is created.
*/
$default_ns = "ns1.example.com.";
$default_mbox = "admin.example.com.";

/*
**  The following array specifies default records for new SOA records.
**  These get inserted automatically whenever a SOA is inserted.
**  The format of each record is (name, type, aux, data).
*/
$default_records = array(
        array("", "NS",  0, "ns1.example.com."),
/*        array("", "MX", 10, "mail.example.com.") */
);

/*
**  The following five values will be used as default values whenever new
**  zones are created.
*/
$default_ttl = 86400;
$default_refresh = 28800;
$default_retry = 7200;
$default_expire = 604800;
$default_minimum_ttl = 86400;

/*
**  The remainder of these variables enable cosmetic changes.
*/
$fontsize = 12;                                                /* Default font size (pixels) */

$font_color                        =        "#663300";        /* Font color */

$page_bgcolor                =        "white";                /* Page background color */
$help_bgcolor                =        "#FFFFCC";        /* Main screen help box background color */
$soa_bgcolor                =        "#FFFF99";        /* SOA editor background color */

$list_bgcolor_1        =        "#FFFFCC";        /* List items #1 background */
$list_bgcolor_2        =        "#FFFFAA";        /* List items #2 background */

$query_bgcolor                =        "#FFFFCC";        /* Search query input background color */
$query_fgcolor                =        "black";                /* Search query input font color */

$input_bgcolor                =        "white";                /* Text input box background color */
$input_fgcolor                =        "black";                /* Text input box font color */

/**** End of configurable options *******************************************/

Pass auf, dass Du die richtigen Datenbanangaben eingibst. Zusätzlich dazu setze ich $auto_update_serial und $auto_update_ptr auf 1 und lege Werte in $default_ns und $default_mbox fest, sodass Seriennummern im Falle von Änderungen automatisch inkrementiert werden und PTR Einträge auch automatisch erstellt werden. Aber selbstverständlich ist es Dir überlassen, ob Du dieses Verhalten möchtest.

Nun kannst Du auf das Web Interface unter http://ns1.example.com/admin.php zugreifen.

Das könnte dich auch interessieren …