Zum Inhalt springen

BIND/Slave: Unterschied zwischen den Versionen

Aus Foxwiki
DanielZorin (Diskussion | Beiträge)
Keine Bearbeitungszusammenfassung
Zeile 1: Zeile 1:
== BIND - Slave-Server ==
== BIND - Slave-Server ==
=== Einleitung ===
=== Einleitung ===
A nameserver running BIND can be configured to serve each zone as either a master or a slave:
Ein Nameserver, auf dem BIND läuft, kann so konfiguriert werden, dass er jede Zone entweder als Master oder als Slave bedient:
* A slave obtains its copy of the zone data by means of a zone transfer from another nameserver.
* Ein Slave erhält seine Kopie der Zonendaten durch eine Zonenübertragung von einem anderen Nameserver.
* A master obtains zone data from some other source, allowing it to operate independently of other nameservers.
* Ein Master bezieht die Zonendaten aus einer anderen Quelle, sodass er unabhängig von anderen Nameservern arbeiten kann.


Every zone should have at least two nameservers. Typical practice is to have one master, and one or two slaves which take their zone data from that master.
Jede Zone sollte mindestens zwei Nameserver haben. In der Regel gibt es einen Master und einen oder zwei Slaves, die ihre Zonendaten von diesem Master beziehen.


==== Scenario ====
==== Szenario ====
* Suppose that the zone <tt>example.com</tt> has two nameservers, <tt>ns0.example.com</tt> (198.51.100.1) and <tt>ns1.example.com</tt> (203.0.113.1).
* Angenommen, die Zone <tt>example.com</tt> hat zwei Nameserver, <tt>ns0.example.com</tt> (198.51.100.1) und <tt>ns1.example.com</tt> (203.0.113.1).
* Of these, <tt>ns0</tt> is already configured as a master. You wish to configure <tt>ns1</tt> as a slave, taking its zone data from <tt>ns0</tt>.
* Von diesen ist <tt>ns0</tt> bereits als Master konfiguriert. Sie möchten <tt>ns1</tt> als Slave konfigurieren, der seine Zonendaten von <tt>ns0</tt> bezieht.
* Both nameservers are running BIND version&nbsp;9.
* Auf beiden Nameservern läuft BIND Version 9.


==== File locations ====
==== Dateispeicherorte ====
On Debian-based systems, zone declarations should be placed in the file <tt>/etc/bind/named.conf.local</tt> and options in the file <tt>/etc/bind/named.conf.options</tt>.
Auf Debian-basierten Systemen sollten Zonendeklarationen in der Datei <tt>/etc/bind/named.conf.local</tt> und Optionen in der Datei <tt>/etc/bind/named.conf.options</tt> abgelegt werden.


You should not modify <tt>/etc/bind/named.conf</tt>.
Sie sollten die Datei <tt>/etc/bind/named.conf</tt> nicht ändern.


Slave zone files should be placed in <tt>/var/lib/bind</tt> (not <tt>/etc/bind</tt>) so that <tt>named</tt> has permission to write to them. Log messages are written to <tt>/var/log/daemon.log</tt>.
Slave-Zonendateien sollten in <tt>/var/lib/bind</tt> (nicht <tt>/etc/bind</tt>) abgelegt werden, damit <tt>named</tt> Schreibrechte für diese Dateien hat. Protokollmeldungen werden in die Datei <tt>/var/log/daemon.log</tt> geschrieben.


=== Vorgehen ===
=== Vorgehen ===
There are three points to address if <tt>ns1</tt> is to act as a slave to <tt>ns0</tt>:# <tt>ns1</tt> must be configured to act as a slave nameserver for the zone.
Es gibt drei Punkte zu beachten, wenn <tt>ns1</tt> als Slave für <tt>ns0</tt> fungieren soll:
# <tt>ns1</tt> must be told when to perform a zone transfer. The preferred method for <tt>ns0</tt> to send it a notification whenever a transfer is needed.
# <tt>ns1</tt> muss so konfiguriert werden, dass es als Slave-Nameserver für die Zone fungiert.
# <tt>ns0</tt> must be configured to allow zone transfers to <tt>ns1</tt>.
# <tt>ns1</tt> muss mitgeteilt werden, wann eine Zonenübertragung durchgeführt werden soll. Die bevorzugte Methode ist, dass <tt>ns0</tt> ihm eine Benachrichtigung sendet, wenn eine Übertragung erforderlich ist.
# <tt>ns0</tt> muss so konfiguriert werden, dass Zonenübertragungen an <tt>ns1</tt> zulässig sind.


For most purposes the default configuration of BIND would satisfy points 2 and 3, however it is good practice to configure it explicitly if you intend to rely on its behaviour.
In den meisten Fällen erfüllt die Standardkonfiguration von BIND die Punkte 2 und 3. Es empfiehlt sich jedoch, dies explizit zu konfigurieren, wenn Sie sich auf dieses Verhalten verlassen möchten.


==== Add slave zone declaration to ns1 ====
==== Slave-Zone-Deklaration zu ns1 hinzufügen ====
The <tt>named</tt> configuration file must include a zone declaration for each zone to be served. Here is a suitable declaration for the zone <tt>example.com</tt> on <tt>ns1</tt>:
Die <tt>named</tt>-Konfigurationsdatei muss für jede bereitzustellende Zone eine Zonendeklaration enthalten. Hier ist eine geeignete Deklaration für die Zone <tt>example.com</tt> auf <tt>ns1</tt>:


  zone "example.com" {
  zone "example.com" {
Zeile 35: Zeile 36:
  };
  };


Setting the <tt>type</tt> to <tt>slave</tt> specifies that the zone data is obtained from another nameserver.
Die Angabe <tt>type</tt> mit dem Wert <tt>slave</tt> legt fest, dass die Zonendaten von einem anderen Nameserver bezogen werden.


The <tt>masters</tt> statement contains a list of nameservers from which zone data can be obtained.
Die Anweisung <tt>masters</tt> enthält eine Liste von Nameservern, von denen Zonendaten bezogen werden können.


These need not be masters in the sense defined above: it is possible (and sometimes necessary) for a slave to obtain zone data from another slave.
Dabei müssen es sich nicht zwingend um Master im oben definierten Sinne handeln: Es ist möglich (und manchmal erforderlich), dass ein Slave die Zonendaten von einem anderen Slave bezieht.


Masters must be specified as IP addresses, not as domain names, however it is possible to define a ‘masters list’ containing the required addresses which can then be referred to symbolically (see below).
Masters müssen als IP-Adressen und nicht als Domainnamen angegeben werden; es ist jedoch möglich, eine „masters list“ mit den benötigten Adressen zu definieren, auf die anschließend symbolisch verwiesen werden kann (siehe unten).


Zone files are optional for slave nameservers, but strongly recommended otherwise the slave will lose all knowledge of the zone content whenever it is restarted.
Zonendateien sind für Slave-Nameserver optional, werden aber dringend empfohlen, da der Slave andernfalls beim Neustart alle Informationen über den Inhalt der Zone verliert.


It will not then be able to start serving the zone again until it has performed a zone transfer, and if the master is unavailable for any reason then the period of downtime could be substantial.
Er kann die Zone dann erst wieder bereitstellen, nachdem eine Zonenübertragung durchgeführt wurde; ist der Master aus irgendeinem Grund nicht verfügbar, kann die Ausfallzeit erheblich sein.


==== Enable notifications from ns0 ====
==== Benachrichtigungen von ns0 aktivieren ====
There are two ways to control when zone transfers take place:
Es gibt zwei Möglichkeiten zu steuern, wann Zonenübertragungen stattfinden:
* by polling at regular intervals, or
* durch regelmäßiges Abfragen (Polling) oder
* by having the master notify the slave when the zone has changed.
* indem der Master den Slave benachrichtigt, wenn sich die Zone geändert hat.


The latter method is preferred as it is both quicker and more efficient.
Die zweite Methode ist vorzuziehen, da sie sowohl schneller als auch effizienter ist.


BIND sends notifications by default, however it is good practice to enable them explicitly if they are an important part of the configuration. This can be done for individual zones:
BIND sendet standardmäßig Benachrichtigungen. Es ist jedoch gute Praxis, sie ausdrücklich zu aktivieren, wenn sie ein wichtiger Bestandteil der Konfiguration sind. Dies kann für einzelne Zonen erfolgen:


  zone "example.com" {
  zone "example.com" {
Zeile 63: Zeile 64:
  };
  };


or as the default for all zones:
oder als Vorgabe für alle Zonen:


  options {
  options {
Zeile 70: Zeile 71:
  };
  };


The setting for a zone takes precedence, therefore if you use the latter method then you should check that it has not been overridden.
Die Einstellung in einer Zonendeklaration hat Vorrang; wenn Sie also die zweite Methode verwenden, sollten Sie prüfen, dass diese nicht auf Zonenebene überschrieben wurde.


The master needs to know which nameservers to notify. By default it notifies the ones that have <tt>NS</tt> records, which for most purposes is sufficient.
Der Master muss wissen, welche Nameserver er benachrichtigen soll. Standardmäßig benachrichtigt er diejenigen, für die <tt>NS</tt>-Resource-Records existieren, was für die meisten Zwecke ausreichend ist.


Nameservers that do not have <tt>NS</tt> records can be notified by adding an <tt>also-notify</tt> statement. As previously this can be done either for an individual zone:
Nameserver, für die keine <tt>NS</tt>-Einträge existieren, können über die Anweisung <tt>also-notify</tt> benachrichtigt werden. Wie zuvor kann dies entweder für eine einzelne Zone erfolgen:


  zone "example.com" {
  zone "example.com" {
Zeile 83: Zeile 84:
  };
  };


or as the default for all zones:
oder als Vorgabe für alle Zonen:


  options {
  options {
Zeile 91: Zeile 92:
  };
  };


==== Allow zone transfers on ns0  ====
==== Zonenübertragungen auf ns0 erlauben ====
By default BIND allows zone transfers from anywhere. Opinion is divided as to whether this is good practice, and it is not unusual for a more restrictive policy to be imposed.
Standardmäßig erlaubt BIND Zonenübertragungen von überall her. Ob dies eine sinnvolle Praxis ist, wird unterschiedlich bewertet, und es ist nicht ungewöhnlich, eine restriktivere Richtlinie vorzugeben.


The servers that are allowed to perform transfers are specified in an <tt>allow-transfer</tt> statement. As with notifications this can be done either for an individual zone:
Die Server, denen Zonenübertragungen erlaubt sind, werden in einer <tt>allow-transfer</tt>-Anweisung angegeben. Wie bei den Benachrichtigungen kann dies entweder für eine einzelne Zone erfolgen:


  zone "example.com" {
  zone "example.com" {
Zeile 103: Zeile 104:
  };
  };


or as the default for all zones:
oder als Vorgabe für alle Zonen:


  options {
  options {
Zeile 111: Zeile 112:
  };
  };


If you are content for zone transfers to be unrestricted then you can make this explicit using an address of <tt>any</tt>:
Wenn Sie damit einverstanden sind, dass Zonenübertragungen nicht eingeschränkt werden, können Sie dies durch die Angabe der Adresse <tt>any</tt> explizit machen:


  options {
  options {
Zeile 119: Zeile 120:
  };
  };


==== Reload ns0 ====
==== ns0 neu laden ====
If the configuration of <tt>ns0</tt> has been changed in any way then it should be reloaded. * [https://www.microhowto.info/howto/cause_a_system_service_to_reload_its_configuration.html Cause a system service to reload its configuration]https://www.microhowto.info/howto/cause_a_system_service_to_reload_its_configuration.html.
Wenn die Konfiguration von <tt>ns0</tt> in irgendeiner Weise geändert wurde, sollte der Dienst neu geladen werden. * [https://www.microhowto.info/howto/cause_a_system_service_to_reload_its_configuration.html Einen Systemdienst dazu veranlassen, seine Konfiguration neu zu laden]https://www.microhowto.info/howto/cause_a_system_service_to_reload_its_configuration.html.


==== Reload ns1 ====
==== ns1 neu laden ====
The configuration of <tt>ns1</tt> will have changed, so it will certainly need to be reloaded. This should be the last thing that you do (after reloading <tt>ns0</tt> if necessary). * [https://www.microhowto.info/howto/cause_a_system_service_to_reload_its_configuration.html Cause a system service to reload its configuration]https://www.microhowto.info/howto/cause_a_system_service_to_reload_its_configuration.html.
Die Konfiguration von <tt>ns1</tt> wurde geändert, daher muss dieser Dienst auf jeden Fall neu geladen werden. Dies sollte der letzte Schritt sein (nach dem Neuladen von <tt>ns0</tt>, falls erforderlich). * [https://www.microhowto.info/howto/cause_a_system_service_to_reload_its_configuration.html Einen Systemdienst dazu veranlassen, seine Konfiguration neu zu laden]https://www.microhowto.info/howto/cause_a_system_service_to_reload_its_configuration.html.


=== Testing ===
=== Tests ===
==== Is ns1 serving the zone? ====
==== Bedient ns1 die Zone? ====
You can test whether <tt>ns1</tt> is operational by using the <tt>dig</tt> command to request the statement of authority record for the zone in question:
Sie können testen, ob <tt>ns1</tt> funktionsfähig ist, indem Sie mit dem Befehl <tt>dig</tt> den SOA-Resource-Record (Start of Authority) für die betreffende Zone abfragen:


  dig @203.0.113.1 -t SOA example.com +norecurs
  dig @203.0.113.1 -t SOA example.com +norecurs


The <tt>+norecurs</tt> flag at the end of the command instructs <tt>dig</tt> to perform a non-recursive query. The answer should be similar to the following:
Der Parameter <tt>+norecurs</tt> am Ende des Befehls weist <tt>dig</tt> an, eine nicht-rekursive Abfrage durchzuführen. Die Antwort sollte in etwa wie folgt aussehen:


  <nowiki>;; ANSWER SECTION:</nowiki>
  <nowiki>;; ANSWER SECTION:</nowiki>
  example.com.            86400  IN      SOA    example.com. hostmaster.example.com. 41 28800 7200 604800 86400
  example.com.            86400  IN      SOA    example.com. hostmaster.example.com. 41 28800 7200 604800 86400


Receiving the correct answer indicates that <tt>ns1</tt> is functioning as a nameserver, but not necessarily that it is a slave for <tt>example.com</tt>: the answer could have been cached from a previous recursive query.
Eine korrekte Antwort zeigt an, dass <tt>ns1</tt> als Nameserver funktioniert, jedoch nicht zwingend, dass er ein Slave für <tt>example.com</tt> ist: Die Antwort könnte aus dem Cache einer früheren rekursiven Abfrage stammen.


To tell the difference you should inspect the flags that are displayed near the start of the response:
Um den Unterschied zu erkennen, sollten Sie die Flags betrachten, die am Anfang der Antwort ausgegeben werden:


  <nowiki>;; Got answer:</nowiki>
  <nowiki>;; Got answer:</nowiki>
Zeile 144: Zeile 145:
  <nowiki>;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2</nowiki>
  <nowiki>;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2</nowiki>


The <tt>aa</tt> flag is the significant one. If <tt>ns1</tt> is operating as a slave then the <tt>aa</tt> flag will be present, meaning that the answer is authoritative.
Das relevante Flag ist <tt>aa</tt>. Wenn <tt>ns1</tt> als Slave arbeitet, ist das Flag <tt>aa</tt> gesetzt; dies bedeutet, dass die Antwort autoritativ ist.


==== Check notifications ====
==== Benachrichtigungen überprüfen ====
The initial zone transfer is not dependent on notifications, but subsequent ones are (unless you intend to rely on polling). To test whether they are working you will need to modify the zone on <tt>ns0</tt> and check whether the change is replicated on <tt>ns1</tt>. The least invasive change you can make is to increment the serial number.
Die initiale Zonenübertragung ist nicht von Benachrichtigungen abhängig, spätere Übertragungen hingegen schon (es sei denn, Sie verlassen sich bewusst auf Polling). Um zu testen, ob Benachrichtigungen funktionieren, müssen Sie die Zone auf <tt>ns0</tt> ändern und prüfen, ob die Änderung auf <tt>ns1</tt> repliziert wird. Die am wenigsten eingreifende Änderung besteht darin, die Seriennummer zu erhöhen.


Edit the zone file on <tt>ns0</tt> and locate the SOA record. This should look similar to:
Bearbeiten Sie die Zonendatei auf <tt>ns0</tt> und suchen Sie den SOA-Eintrag. Er sollte in etwa wie folgt aussehen:


  @      IN      SOA    example.com. hostmaster.example.com. (
  @      IN      SOA    example.com. hostmaster.example.com. (
Zeile 158: Zeile 159:
                         1D)
                         1D)


The serial number in this record is 41, therefore you should increment it to 42:
Die Seriennummer in diesem Eintrag ist 41; erhöhen Sie sie daher auf 42:


  @      IN      SOA    example.com. hostmaster.example.com. (
  @      IN      SOA    example.com. hostmaster.example.com. (
Zeile 167: Zeile 168:
                         1D)
                         1D)


Now reload the configuration of <tt>named</tt> on <tt>ns0</tt> (see [https://www.microhowto.info/howto/cause_a_system_service_to_reload_its_configuration.html Cause a system service to reload its configuration]). <tt>ns0</tt> should notify <tt>ns1</tt> that it has a copy of the zone with a serial number of 42.
Laden Sie nun die Konfiguration von <tt>named</tt> auf <tt>ns0</tt> neu (siehe [https://www.microhowto.info/howto/cause_a_system_service_to_reload_its_configuration.html Einen Systemdienst dazu veranlassen, seine Konfiguration neu zu laden]). <tt>ns0</tt> sollte <tt>ns1</tt> darüber benachrichtigen, dass es eine Kopie der Zone mit der Seriennummer 42 besitzt.


The copy of the zone held by <tt>ns1</tt> has an older serial number, 41, so when it receives the notification it should request a zone transfer.
Die auf <tt>ns1</tt> vorhandene Kopie der Zone hat noch die ältere Seriennummer 41; wenn der Server die Benachrichtigung erhält, sollte er deshalb eine Zonenübertragung anfordern.


You can determine whether this has happened by re-requesting the SOA record:
Ob dies geschehen ist, können Sie feststellen, indem Sie den SOA-Eintrag erneut abfragen:


  dig @203.0.113.1 -t SOA example.com +norecurs
  dig @203.0.113.1 -t SOA example.com +norecurs


If the serial number has changed to 42 then a zone transfer has occurred, which probably means that notifications are working:
Hat sich die Seriennummer auf 42 geändert, hat eine Zonenübertragung stattgefunden, was sehr wahrscheinlich bedeutet, dass die Benachrichtigungen funktionieren:


  <nowiki>;; ANSWER SECTION:</nowiki>
  <nowiki>;; ANSWER SECTION:</nowiki>
  example.com.            86400  IN      SOA    example.com. hostmaster.example.com. 42 28800 7200 604800 86400
  example.com.            86400  IN      SOA    example.com. hostmaster.example.com. 42 28800 7200 604800 86400


For additional confidence that a notification caused the transfer you can either repeat the test or inspect the logs.
Um zusätzliche Sicherheit zu gewinnen, dass die Übertragung tatsächlich durch eine Benachrichtigung ausgelöst wurde, können Sie den Test wiederholen oder die Protokolle auswerten.
 
=== Troubleshooting ===
If the tests described above indicate that <tt>ns1</tt> is not functioning as intended then you should attempt to answer the following questions:# Is <tt>named</tt> is running on <tt>ns0</tt> as an authoritative nameserver for <tt>example.com</tt>?
# Is <tt>named</tt> is running on <tt>ns1</tt>?
# Has <tt>ns1</tt> successfully performed an initial zone transfer, and if not why?
# Does <tt>ns0</tt> notify <tt>ns1</tt> when the zone serial number changes?
# Does <tt>ns1</tt> perform further zone transfers when notified by <tt>ns0</tt>?
# Questions 1 to 3 are relevant when <tt>ns1</tt> is not working as a nameserver at all. Questions 4 and 5 are relevant when it is working, but not responding to updates.
 
==== Is named running on ns0? ====
Before looking at <tt>ns1</tt> it would be prudent to check that <tt>ns0</tt> is working.
 
A good way to do this is to perform a remote query from <tt>ns0</tt> to <tt>ns1</tt> concerning the zone you are attempting to serve:
 
dig @198.51.100.1 -t SOA example.com
 
This should give an answer similar to the following:
 
<nowiki>;; ANSWER SECTION:</nowiki>
example.com.            86400  IN      SOA    example.com. hostmaster.example.com. 41 28800 7200 604800 86400
 
The <tt>aa</tt> flag should be set, indicating that this is an authoritative response:
 
<nowiki>;; Got answer:</nowiki>
<nowiki>;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 13518</nowiki>
<nowiki>;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2</nowiki>
 
If either of these are missing then that would indicate <tt>ns0</tt> is running as a nameserver, but is not authoritative for <tt>example.com</tt>.
 
The absence of any response at all could indicate that there is no nameserver running on <tt>ns0</tt>, or that there is a problem with network connectivity.
 
Whatever the reason, it will need to be addressed before the slave nameserver on <tt>ns1</tt> can be properly tested.
 
==== Is named running on ns1? ====
You can check whether <tt>named</tt> is running using the <tt>ps</tt> command:
 
ps -C named
 
This should give a response of the form:
 
  PID TTY          TIME CMD
11409 ?        00:00:00 named
 
If no process is listed then you should try restarting <tt>named</tt>, then check again using <tt>ps</tt>. If it does not start then this may indicate that:
* there is a syntax error in one of the configuration files, or
* another process is listening on port 53.
 
The first of these is the more likely explanation. The log should contain enough information to identify the cause.
 
==== Did ns1 performed initial zone transfer? ====
You can check whether an initial zone transfer has occurred by looking for the zone file. This is the argument to the <tt>file</tt> statement in the zone declaration:
 
zone "example.com" {
  type slave;
  masters { 198.51.100.1; };
  file "/var/lib/bind/db.example.com";
};
 
The file should have been created by <tt>named</tt>, and have content equivalent to (but probably not identical to) the master zone file on <tt>ns0</tt>.
 
===== If it has not been written then this could be because: =====
* <tt>ns1</tt> has not requested a zone transfer, or
* <tt>ns1</tt> sent the request to the wrong nameserver, or
* <tt>ns1</tt> cannot communicate with <tt>ns1</tt>, or
* <tt>ns0</tt> refused to transfer the zone, or
* <tt>ns1</tt> received the zone data, but was unable to write the file.
 
You can check the first four points by viewing DNS traffic to and from <tt>ns1</tt> using <tt>tcpdump</tt>:
 
tcpdump -n "host ns1.example.com and (udp port 53 or tcp port 53)"
 
You should see an initial query for the SOA record (normally UDP), followed by the zone transfer (always TCP).
 
If <tt>ns0</tt> refused to transfer the zone then this should be recorded in the log on <tt>ns0</tt>, for example:
 
client 203.0.113.1#42541: zone transfer 'example.com/AXFR/IN' denied
 
If the transfer occurred but the file could not be written then this should be recorded in the log on <tt>ns1</tt>, for example:
 
dumping master file: /etc/bind/tmp-nIOVHD85JX: open: permission denied
 
See below for further consideration of these errors.
 
==== Dose ns0 notifies ns1? ====
You can check whether <tt>ns0</tt> is notifying <tt>ns1</tt> by using <tt>tcpdump</tt> to view the traffic:
 
tcpdump -n "host ns1.example.com and (udp port 53 or tcp port 53)"
 
A notification should look similar to:
 
198.51.100.1.3278 > 203.0.113.1.53: 62737 notify [b2&3=0x2400] [1a] SOA? example.com. (95)
203.0.113.1.53 > 198.51.100.1.3278: 62737 notify* 0/0/0 (29)
 
Notifications should also be logged by the sender:
 
zone example.com/IN: sending notifies (serial 42)
 
and by the receiver:
 
client 198.51.100.1#3278: received notify for zone 'example.com'
 
If notifications are not being sent or logged then you should check that they are enabled for the zone in question, and that <tt>ns1</tt> is either:
* listed as a nameserver using an <tt>NS</tt> record in the master zone file, or
* listed in a <tt>also-notify</tt> statement in the master zone declaration.
 
==== Is ns1 performing zone transfers? ====
Subsequent zone transfers can be viewed in the same way as the initial transfer, but may be considerably smaller if you have enabled the use of incremental transfers.
 
The most likely reason for the slave not requesting a transfer when it has received a notification is if it already has a copy of the zone with the same or a more recent serial number.
 
In that case you should advance the serial number of the master zone file until it is greater than that of the slave zone file.
 
=== Fehlermeldungen ===
==== Zone transfer denied ====
An error of the form:
 
client 203.0.113.1#42541: zone transfer 'example.com/AXFR/IN' denied
 
on <tt>ns0</tt> indicates that zone transfers have been restricted to a specific list of nameservers and that <tt>ns1</tt> is not one of them. You should look for a relevant <tt>allow-transfer</tt> statement in the configuration of <tt>ns0</tt> and add <tt>ns1</tt> to the list.
 
==== Dumping master file: permission denied ====
An error of the form:
 
dumping master file: /etc/bind/tmp-nIOVHD85JX: open: permission denied
 
on <tt>ns1</tt> indicates that <tt>named</tt> has successfully performed a zone transfer, but was unable to write the result to a zone file because it did not have permission to write to the relevant directory.
 
In this particular case it has been incorrectly configured to write the zone file to <tt>/etc/bind</tt>.
 
You should not attempt to fix this by granting write access to that directory: there are good security reasons why <tt>named</tt> should only have read access to its configuration.
 
Instead you should write the zone file to some other location. On Debian-based systems, the appropriate location is <tt>/var/lib/bind</tt>.
 
=== Variationen ===
==== Use a masters list ====
If it is necessary to refer to the same master nameserver(s) repeatedly then it is good practice to define a ‘masters list’ containing the relevant IP address(es) so that they can be referred to symbolically.
 
: Beispiel
masters ns0 { 198.51.100.1; };
zone "example.com" {
        type slave;
        masters { ns0; };
        notify no;
        file "/var/lib/bind/zone.example.com";
};
zone "example.net" {
        type slave;
        masters { ns0; };
        notify no;
        file "/var/lib/bind/zone.example.net";
};
 
Doing this reduces the risk of specifying the wrong IP address, and simplifies the task of changing the address should this ever be necessary.


[[Kategorie:BIND]]
[[Kategorie:BIND]]

Version vom 19. November 2025, 13:31 Uhr

BIND - Slave-Server

Einleitung

Ein Nameserver, auf dem BIND läuft, kann so konfiguriert werden, dass er jede Zone entweder als Master oder als Slave bedient:

  • Ein Slave erhält seine Kopie der Zonendaten durch eine Zonenübertragung von einem anderen Nameserver.
  • Ein Master bezieht die Zonendaten aus einer anderen Quelle, sodass er unabhängig von anderen Nameservern arbeiten kann.

Jede Zone sollte mindestens zwei Nameserver haben. In der Regel gibt es einen Master und einen oder zwei Slaves, die ihre Zonendaten von diesem Master beziehen.

Szenario

  • Angenommen, die Zone example.com hat zwei Nameserver, ns0.example.com (198.51.100.1) und ns1.example.com (203.0.113.1).
  • Von diesen ist ns0 bereits als Master konfiguriert. Sie möchten ns1 als Slave konfigurieren, der seine Zonendaten von ns0 bezieht.
  • Auf beiden Nameservern läuft BIND Version 9.

Dateispeicherorte

Auf Debian-basierten Systemen sollten Zonendeklarationen in der Datei /etc/bind/named.conf.local und Optionen in der Datei /etc/bind/named.conf.options abgelegt werden.

Sie sollten die Datei /etc/bind/named.conf nicht ändern.

Slave-Zonendateien sollten in /var/lib/bind (nicht /etc/bind) abgelegt werden, damit named Schreibrechte für diese Dateien hat. Protokollmeldungen werden in die Datei /var/log/daemon.log geschrieben.

Vorgehen

Es gibt drei Punkte zu beachten, wenn ns1 als Slave für ns0 fungieren soll:

  1. ns1 muss so konfiguriert werden, dass es als Slave-Nameserver für die Zone fungiert.
  2. ns1 muss mitgeteilt werden, wann eine Zonenübertragung durchgeführt werden soll. Die bevorzugte Methode ist, dass ns0 ihm eine Benachrichtigung sendet, wenn eine Übertragung erforderlich ist.
  3. ns0 muss so konfiguriert werden, dass Zonenübertragungen an ns1 zulässig sind.

In den meisten Fällen erfüllt die Standardkonfiguration von BIND die Punkte 2 und 3. Es empfiehlt sich jedoch, dies explizit zu konfigurieren, wenn Sie sich auf dieses Verhalten verlassen möchten.

Slave-Zone-Deklaration zu ns1 hinzufügen

Die named-Konfigurationsdatei muss für jede bereitzustellende Zone eine Zonendeklaration enthalten. Hier ist eine geeignete Deklaration für die Zone example.com auf ns1:

zone "example.com" {
  type slave;
  masters { 198.51.100.1; };
  file "/var/lib/bind/db.example.com";
};

Die Angabe type mit dem Wert slave legt fest, dass die Zonendaten von einem anderen Nameserver bezogen werden.

Die Anweisung masters enthält eine Liste von Nameservern, von denen Zonendaten bezogen werden können.

Dabei müssen es sich nicht zwingend um Master im oben definierten Sinne handeln: Es ist möglich (und manchmal erforderlich), dass ein Slave die Zonendaten von einem anderen Slave bezieht.

Masters müssen als IP-Adressen und nicht als Domainnamen angegeben werden; es ist jedoch möglich, eine „masters list“ mit den benötigten Adressen zu definieren, auf die anschließend symbolisch verwiesen werden kann (siehe unten).

Zonendateien sind für Slave-Nameserver optional, werden aber dringend empfohlen, da der Slave andernfalls beim Neustart alle Informationen über den Inhalt der Zone verliert.

Er kann die Zone dann erst wieder bereitstellen, nachdem eine Zonenübertragung durchgeführt wurde; ist der Master aus irgendeinem Grund nicht verfügbar, kann die Ausfallzeit erheblich sein.

Benachrichtigungen von ns0 aktivieren

Es gibt zwei Möglichkeiten zu steuern, wann Zonenübertragungen stattfinden:

  • durch regelmäßiges Abfragen (Polling) oder
  • indem der Master den Slave benachrichtigt, wenn sich die Zone geändert hat.

Die zweite Methode ist vorzuziehen, da sie sowohl schneller als auch effizienter ist.

BIND sendet standardmäßig Benachrichtigungen. Es ist jedoch gute Praxis, sie ausdrücklich zu aktivieren, wenn sie ein wichtiger Bestandteil der Konfiguration sind. Dies kann für einzelne Zonen erfolgen:

zone "example.com" {
  type master;
  file "/var/lib/bind/db.example.com";
  notify yes;
  // …
};

oder als Vorgabe für alle Zonen:

options {
  notify yes;
  // …
};

Die Einstellung in einer Zonendeklaration hat Vorrang; wenn Sie also die zweite Methode verwenden, sollten Sie prüfen, dass diese nicht auf Zonenebene überschrieben wurde.

Der Master muss wissen, welche Nameserver er benachrichtigen soll. Standardmäßig benachrichtigt er diejenigen, für die NS-Resource-Records existieren, was für die meisten Zwecke ausreichend ist.

Nameserver, für die keine NS-Einträge existieren, können über die Anweisung also-notify benachrichtigt werden. Wie zuvor kann dies entweder für eine einzelne Zone erfolgen:

zone "example.com" {
  type master;
  notify yes;
  also-notify { 203.0.113.1; };
  file "/var/lib/bind/db.example.com";
};

oder als Vorgabe für alle Zonen:

options {
  notify yes;
  also-notify { 203.0.113.1; };
  // …
};

Zonenübertragungen auf ns0 erlauben

Standardmäßig erlaubt BIND Zonenübertragungen von überall her. Ob dies eine sinnvolle Praxis ist, wird unterschiedlich bewertet, und es ist nicht ungewöhnlich, eine restriktivere Richtlinie vorzugeben.

Die Server, denen Zonenübertragungen erlaubt sind, werden in einer allow-transfer-Anweisung angegeben. Wie bei den Benachrichtigungen kann dies entweder für eine einzelne Zone erfolgen:

zone "example.com" {
  type master;
  notify yes;
  allow-transfer { 203.0.113.1; };
  file "/var/lib/bind/db.example.com";
};

oder als Vorgabe für alle Zonen:

options {
  notify yes;
  allow-transfer { 203.0.113.1; };
  // …
};

Wenn Sie damit einverstanden sind, dass Zonenübertragungen nicht eingeschränkt werden, können Sie dies durch die Angabe der Adresse any explizit machen:

options {
  notify yes;
  allow-transfer { any; };
  // …
};

ns0 neu laden

Wenn die Konfiguration von ns0 in irgendeiner Weise geändert wurde, sollte der Dienst neu geladen werden. * Einen Systemdienst dazu veranlassen, seine Konfiguration neu zu ladenhttps://www.microhowto.info/howto/cause_a_system_service_to_reload_its_configuration.html.

ns1 neu laden

Die Konfiguration von ns1 wurde geändert, daher muss dieser Dienst auf jeden Fall neu geladen werden. Dies sollte der letzte Schritt sein (nach dem Neuladen von ns0, falls erforderlich). * Einen Systemdienst dazu veranlassen, seine Konfiguration neu zu ladenhttps://www.microhowto.info/howto/cause_a_system_service_to_reload_its_configuration.html.

Tests

Bedient ns1 die Zone?

Sie können testen, ob ns1 funktionsfähig ist, indem Sie mit dem Befehl dig den SOA-Resource-Record (Start of Authority) für die betreffende Zone abfragen:

dig @203.0.113.1 -t SOA example.com +norecurs

Der Parameter +norecurs am Ende des Befehls weist dig an, eine nicht-rekursive Abfrage durchzuführen. Die Antwort sollte in etwa wie folgt aussehen:

;; ANSWER SECTION:
example.com.            86400   IN      SOA     example.com. hostmaster.example.com. 41 28800 7200 604800 86400

Eine korrekte Antwort zeigt an, dass ns1 als Nameserver funktioniert, jedoch nicht zwingend, dass er ein Slave für example.com ist: Die Antwort könnte aus dem Cache einer früheren rekursiven Abfrage stammen.

Um den Unterschied zu erkennen, sollten Sie die Flags betrachten, die am Anfang der Antwort ausgegeben werden:

;; Got answer:
;; ->>HEADER<<- opcode: QUERY, status: NOERROR, id: 42311
;; flags: qr aa rd ra; QUERY: 1, ANSWER: 1, AUTHORITY: 2, ADDITIONAL: 2

Das relevante Flag ist aa. Wenn ns1 als Slave arbeitet, ist das Flag aa gesetzt; dies bedeutet, dass die Antwort autoritativ ist.

Benachrichtigungen überprüfen

Die initiale Zonenübertragung ist nicht von Benachrichtigungen abhängig, spätere Übertragungen hingegen schon (es sei denn, Sie verlassen sich bewusst auf Polling). Um zu testen, ob Benachrichtigungen funktionieren, müssen Sie die Zone auf ns0 ändern und prüfen, ob die Änderung auf ns1 repliziert wird. Die am wenigsten eingreifende Änderung besteht darin, die Seriennummer zu erhöhen.

Bearbeiten Sie die Zonendatei auf ns0 und suchen Sie den SOA-Eintrag. Er sollte in etwa wie folgt aussehen:

@       IN      SOA     example.com. hostmaster.example.com. (
                        41
                        8H
                        2H
                        1W
                        1D)

Die Seriennummer in diesem Eintrag ist 41; erhöhen Sie sie daher auf 42:

@       IN      SOA     example.com. hostmaster.example.com. (
                        42
                        8H
                        2H
                        1W
                        1D)

Laden Sie nun die Konfiguration von named auf ns0 neu (siehe Einen Systemdienst dazu veranlassen, seine Konfiguration neu zu laden). ns0 sollte ns1 darüber benachrichtigen, dass es eine Kopie der Zone mit der Seriennummer 42 besitzt.

Die auf ns1 vorhandene Kopie der Zone hat noch die ältere Seriennummer 41; wenn der Server die Benachrichtigung erhält, sollte er deshalb eine Zonenübertragung anfordern.

Ob dies geschehen ist, können Sie feststellen, indem Sie den SOA-Eintrag erneut abfragen:

dig @203.0.113.1 -t SOA example.com +norecurs

Hat sich die Seriennummer auf 42 geändert, hat eine Zonenübertragung stattgefunden, was sehr wahrscheinlich bedeutet, dass die Benachrichtigungen funktionieren:

;; ANSWER SECTION:
example.com.            86400   IN      SOA     example.com. hostmaster.example.com. 42 28800 7200 604800 86400

Um zusätzliche Sicherheit zu gewinnen, dass die Übertragung tatsächlich durch eine Benachrichtigung ausgelöst wurde, können Sie den Test wiederholen oder die Protokolle auswerten.