Einstieg - So wird das Leben leichter

  • Webspace - Erste Schritte um mit dem Webspace zu arbeiten
  • Datenbank - Erste Schritte um mit der Datenbank zu arbeiten.
  • Protokolle - Eine Sammlung der im Internet am häufigsten verwendeten Protokolle und ihre Funktion.

Inhalt

Aktiv/Passiv - Failovercluster

Hardware-Support

Sicherheit

Bind9 MySQL-Support

Bind9-Sources aus den Paketquellen herunterladen

apt-get install dpkg-dev
mkdir -p /usr/local/src/bind9
cd /usr/local/src/bind9
apt-get source bind9

Auf dem System müssen diverse Developementpakete installiert sein um das Bauen des Quellcodes zu ermöglichen.

cd /usr/local/src/bind9/bind9-x.x.x/

Nun müssen ein paar Änderungen an den Erstellregeln vorgenommen werden um den MySQL-Support zu aktivieren.

vim debian/rules

In der Section configure-stamp wird --with-dlz-mysql=yes gesetzt. Des Weiteren muss --enable-threads=no gesetzt sein, da bind mit dlz-MySQL nicht mehr als einen Thread unterstützt. Andernfalls läuft der MySQL-Support nicht.

Nun können die entsprechenden Pakete gebaut…

dpkg-buildpackage -rfakeroot -b

… und danach installiert werden.

cd ..
dpkg -i *.deb

Beispiel einer Grundkonfiguration

Die Konfiguration ist unter /etc/bind/named.conf.local zu finden, in die folgendes eingefügt wird.

dlz "Mysql zone" {
    database "mysql
    {host=127.0.0.1 dbname=bind user=root pass=rootpw ssl=false port=3306}
    {select zone from dns_records where zone='$zone$'}
    {select ttl, type, mx_priority, case when lower(type)='txt' then concat('\"', data, '\"') else data end from dns_records where zone = '$zone$' and host = '$record$' and not (type = 'SOA' or type = 'NS')}
    {select ttl, type, mx_priority, data, resp_person, serial, refresh, retry, expire, minimum 	from dns_records where zone = '$zone$' and (type = 'SOA' or type='NS')}
    {select ttl, type, host, mx_priority, data, resp_person, serial, refresh, retry, expire, minimum from dns_records where zone = '$zone$' and not (type = 'SOA' or type = 'NS')}
    {select zone from xfr_table where zone = '$zone$' and client = '$client$'}
    {update data_count set count = count + 1 where zone ='$zone$'}";
};

Ein wenig trockene Dokumentation über die Implementierung des dlz-Treibers

Wie bei den oberen Querys leicht zu erkennen ist, teilen sich manche Records einen Query. Das hat zur Folge, dass ein Query mehr Daten aus der Datenbank auslesen kann, wie der Record eigentlich bräuchte. Als konkretes Beispiel sind hier SOA- und NS-Records zu nennen, die sich einen Query teilen. Wenn diese „zusätzlichen“ Felder nicht NULL in der Datenbankzeile enthalten, werden diese zusätzlichen Daten aufgrund der einfach gehaltenen Arbeitsweise des mysql_dlz-Treibers intern zu viel an Bind9 übergeben. Daraus resultiert dann eine Fehlermeldung im log welche zum Beispiel wie folgt lauten kann:

dns_sdlz_putrr returned error. Error code was: unexpected end of input

Hier wird deutlich, dass noch Daten erwartet wurden. Wenn zu viele Daten übergeben worden sind, kann im log-File folgender Eintrag gefunden werden:

dns_sdlz_putrr returned error. Error code was: extra input text

Es ist also wichtig, dass bei den Records nur die Angaben gemacht werden, die zu dem Record gehören. Ansonsten kommt es zu Problemen bei der DNS-Auflösung durch Bind9 und wir erhalten eine Rückmeldung mit dem Status „SERFAIL“.

Hier wäre eine bessere Implementierung sicherlich wünschenswert. So lange der dlz-Treiber genutzt wird muss zumindest auf Datenbankebene die Richtigkeit der eingetragenen DNS-Records sichergestellt werden.

Testdatenbank für Bind9

Als kleines Beispiel ist hier eine brauchbare Datenbankstruktur mit einigen Beispieldaten gegeben.

CREATE TABLE `dns_records` ( 
  `zone` varchar(64) default NULL, 
  `host` varchar(64) default NULL, 
  `type` varchar(8) default NULL, 
  `data` varchar(64) default NULL, 
  `ttl` int(11) NOT NULL default '3600', 
  `mx_priority` int(11) default NULL, 
  `refresh` int(11) default NULL, 
  `retry` int(11) default NULL, 
  `expire` int(11) default NULL, 
  `minimum` int(11) default NULL, 
  `serial` bigint(20) default NULL, 
  `resp_person` varchar(64) default NULL, 
  `primary_ns` varchar(64) default NULL, 
  KEY `host` (`host`), 
  KEY `zone` (`zone`), 
  KEY `type` (`type`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf-8; 


INSERT INTO `dns_records` (`zone`,`host`,`type`,`data`,`ttl`,`mx_priority`,`refresh`,`retry`, `expire`,`minimum`,`serial`,`resp_person`,`primary_ns`) 
VALUES ('example.com','@','SOA','@',3600,NULL,10800,1800,604800,3600,2008082700,'root.example.com.','ns1.example.com'), 
('example.com','@','A','192.0.2.1',3600,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), 
('example.com','@','NS','ns1.example.com.',3600,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), 
('example.com','@','NS','ns2.example.com.',3600,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), 
('example.com','@','NS','ns3.example.com.',3600,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), 
('example.com','@','AAAA','2001:0db8::1',3600,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), 
('example.com','www','AAAA','2001:0db8::1',3600,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), 
('example.com','www','A','192.0.2.1',3600,NULL,NULL,NULL,NULL,NULL,NULL,NULL,NULL), 
('example.com','@','MX','ns1.example.com.',3600,10,NULL,NULL,NULL,NULL,NULL,NULL,NULL);

Umgang mit Sonderzeichen in Domains / Zeichencodierung

Seit 2010 dürfen in Domains Umlaute und das „ß“ genutzt werden. Diese müssen von Bind9 richtig behandelt werden. Es gilt daher für die Einträge in der Datenbank die Zeichen mit dem Punycode zu kodieren: Dazu wird eine Library sowie ein kleines Tool installiert, welche für die Codierung in den Punycode genutzt werden.

apt-get install idn libidn11

Beispiel:

echo müllermeißner.tld |idn -a --quiet
Müllermeißner.de ⇔ xn--mllermeissner-wob.tld
Zum Seitenanfang.

 

Copyright © 2018 Linetz – Hosting und IT-Dienstleistungen Hendrik Borgmeyer.