Deaktivieren der DNS Replikation in einem ISPConfig Cluster


Der folgende Post bezieht sich auf http://www.howtoforge.com/forums/showthread.php?t=62702

Stellen mehrere Server web und/oder Mail zur Verfügung, müssen alle jeweils im DNS eingetragen sein. Fällt nun ein Server aus, müssen die DNS-Einträge entsprechend angepasst werden; auch eine Round-Robin-Lösung im DNS führt zu Timeouts. Ist auf jedem Server im DNS aber nur die eigene IP eingetragen, werden Anfragen auch nur für die eigene IP beantwortet. Wichtig ist nur, dass alle NS-Records enthalten sind.

Um die DNS Replikation in einem ISPConfig-Cluster zu stoppen, muss in server/plugins-available/bind_plugin.inc.php die Zeile 104 von

$records = $app->db->queryAllRecords("SELECT * FROM dns_rr WHERE zone = ".$zone['id']." AND active = 'Y'");

zu

$records = $app->db->queryAllRecords("SELECT * FROM dns_rr WHERE zone=".$zone['id']." AND active = 'Y' AND (data NOT IN (SELECT ip_address FROM server_ip WHERE server_ip.server_id<>".$conf["server_id"].") OR name REGEXP '^ns')");

geändert werden.

Der SQL-Aufruf sieht auf den ersten Blick vielleicht etwas verwirrend aus, lässt sich aber leicht zerlegen:

SELECT * FROM dns_rr WHERE zone=".$zone['id']." AND active = 'Y'

Dadurch werden alle aktiven DNS-Einträge für die jeweilige Zone abgefragt.

AND (
data NOT IN
(
SELECT ip_address FROM server_ip WHERE server_ip.server_id<>".$conf["server_id"]."
)

Durch data NOT IN werden die IP-Adressen anderer Server gefiltert. Die Adressen stehen in der Tabelle server_ip und sind an die jeweilige Server-ID geknüpft. Also reicht ein zweites SELECT, bei dem alle IP-Adressen abgefragt werden, die nicht zum aktuellen Server gehören (auf diesem wird das Script gerade ausgeführt).
Man kann die IP-Adressen von anderen Servern auch direkt in das Script schreiben, bei mehr als zwei Servern wird es aber unhandlich; zumal dann der Source-Code auf jedem Server unterschiedlich ist.

OR name REGEXP '^ns'
)

Von der Filterung ausgenommen sind alle Einträge, die mit ns anfangen. Ansonsten würde in den Zonen-Files bestenfalls nur der DNS auf dem aktuellen Server auftauchen.

Der Regex lässt sich beliebig erweitern. Wer auch alle Einträge die mit mx beginnen im DNS haben will, nimmt stattdessen

OR name REGEXP '^ns|^mx'

.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind markiert *