]> git.ipfire.org Git - thirdparty/pdns.git/blame - docs/modes-of-operation.rst
add toLogString() to ComboAddress and start using it
[thirdparty/pdns.git] / docs / modes-of-operation.rst
CommitLineData
0e2063c3
PL
1DNS Modes of Operation
2======================
3
4PowerDNS offers full master and slave semantics for replicating domain
5information. Furthermore, PowerDNS can benefit from native database
6replication.
7
8.. _native-operation:
9
10Native replication
11------------------
12
13Native replication is the default, unless other operation is
14specifically configured. Native replication basically means that
15PowerDNS will not send out DNS update notifications, nor will react to
16them. PowerDNS assumes that the backend is taking care of replication
17unaided.
18
19MySQL replication has proven to be very robust and well suited, even
20over transatlantic connections between badly peering ISPs. Other
21PowerDNS users employ Oracle replication which also works very well.
22
23To use native replication, configure your backend storage to do the
24replication and do not configure PowerDNS to do so.
25
a8b6e3fa
AF
26Typically, a database slave will be configured as read-only as
27uni-directional database replication is usually sufficient. A PowerDNS
28server only requires database write access if it is participating as a
29master or slave in zone transfers, or has a frontend attached for
30managing records etc.
31
0e2063c3
PL
32.. _master-operation:
33
34Master operation
35----------------
36
37When operating as a master, PowerDNS sends out notifications of changes
38to slaves, which react to these notifications by querying PowerDNS to
39see if the zone changed, and transferring its contents if it has.
40Notifications are a way to promptly propagate zone changes to slaves, as
41described in :rfc:`1996`. Since
42version 4.0.0, the NOTIFY messages have a TSIG record added (transaction
43signature) if zone has been configured to use TSIG and feature has been
44enabled.
45
46.. warning::
47 Master support is OFF by default, turn it on by adding
48 :ref:`setting-master` to the configuration.
49
50.. warning::
51 If you have DNSSEC-signed zones and non-PowerDNS slaves,
52 please check your :ref:`metadata-soa-edit`
53 settings.
54
55.. warning::
56 Notifications are only sent for domains with type MASTER in
29e8eee7 57 your backend unless :ref:`setting-slave-renotify` is enabled.
0e2063c3
PL
58
59Left open by :rfc:`1996` is who is to be notified - which is harder to
60figure out than it sounds. All slaves for this domain must receive a
61notification but the nameserver only knows the names of the slaves - not
62the IP addresses, which is where the problem lies. The nameserver itself
63might be authoritative for the name of its secondary, but not have the
64data available.
65
66To resolve this issue, PowerDNS tries multiple tactics to figure out the
67IP addresses of the slaves, and notifies everybody. In contrived
68configurations this may lead to duplicate notifications being sent out,
69which shouldn't hurt.
70
71Some backends may be able to detect zone changes, others may chose to
72let the operator indicate which zones have changed and which haven't.
73Consult the documentation for your backend to see how it processes
74changes in zones.
75
76To help deal with slaves that may have missed notifications, or have
77failed to respond to them, several override commands are available via
78the :ref:`pdns_control <running-pdnscontrol>` tool:
79
80- ``pdns_control notify <domain>`` This instructs PowerDNS to notify
81 all IP addresses it considers to be slaves of this domain.
82
83- ``pdns_control notify-host <domain> <ip-address>`` This is truly an
84 override and sends a notification to an arbitrary IP address. Can be
85 used in :ref:`setting-also-notify` situations or
86 when PowerDNS has trouble figuring out who to notify - which may
87 happen in contrived configurations.
88
89.. _slave-operation:
90
91Slave operation
92---------------
93
94On launch, PowerDNS requests from all backends a list of domains which
95have not been checked recently for changes. This should happen every
96'**refresh**' seconds, as specified in the SOA record. All domains that
97are unfresh are then checked for changes over at their master. If the
98:ref:`types-SOA` serial number there is higher, the domain is
99retrieved and inserted into the database. In any case, after the check
100the domain is declared 'fresh', and will only be checked again after
101'**refresh**' seconds have passed.
102
103When the freshness of a domain cannot be checked, e.g. because the
104master is offline, PowerDNS will retry the domain after
105:ref:`setting-slave-cycle-interval` seconds.
106Every time the domain fails it's freshness check, PowerDNS will hold
107back on checking the domain for
108``amount of failures * slave-cycle-interval`` seconds, with a maximum of
109:ref:`setting-soa-retry-default` seconds
110between checks. With default settings, this means that PowerDNS will
111back off for 1, then 2, then 3 etc. minutes, to a maximum of 60 minutes
112between checks.
113
114.. warning::
115 Slave support is OFF by default, turn it on by adding
116 :ref:`setting-slave` to the configuration.
117
118.. note::
119 When running PowerDNS via the provided systemd service file,
120 `ProtectSystem <http://www.freedesktop.org/software/systemd/man/systemd.exec.html#ProtectSystem=>`_
121 is set to ``full``, this means PowerDNS is unable to write to e.g.
122 ``/etc`` and ``/home``, possibly being unable to write AXFR's zones.
123
124PowerDNS also reacts to notifies by immediately checking if the zone has
125updated and if so, retransfering it.
126
127All backends which implement this feature must make sure that they can
128handle transactions so as to not leave the zone in a half updated state.
129MySQL configured with either BerkeleyDB or InnoDB meets this
130requirement, as do PostgreSQL and Oracle. The Bindbackend implements
131transaction semantics by renaming files if and only if they have been
132retrieved completely and parsed correctly.
133
134Slave operation can also be programmed using several
135:ref:`running-pdnscontrol` commands. The ``retrieve``
136command is especially useful as it triggers an immediate retrieval of
137the zone from the configured master.
138
139PowerDNS supports multiple masters. For the BIND backend, the native
140BIND configuration language suffices to specify multiple masters, for
141SQL based backends, list all master servers separated by commas in the
142'master' field of the domains table.
143
144Since version 4.0.0, PowerDNS requires that masters sign their
145notifications. During transition and interoperation with other
146nameservers, you can use options :ref:`setting-allow-unsigned-notify` to permit
147unsigned notifications. For 4.0.0 this is turned on by default, but it
148might be turned off permanently in future releases.
149
150Master/Slave Setup Requirements
151-------------------------------
152
153Generally to enable a Master/Slave setup you have to take care of
154following properties.
155
156* The :ref:`setting-master`/:ref:`setting-slave` state has to be enabled in the respective ``/etc/powerdns/pdns.conf`` config files.
157* The nameservers have to be set up correctly as NS domain records i.e. defining a NS and A record for each slave.
158* Master/Slave state has to be configured on a per domain basis in the ``domains`` table. Namely the ``type`` column has to be either ``MASTER`` or ``SLAVE`` respectively and the slave needs a comma separated list of master node IP addresses in the ``master`` column in the ``domains`` table. :doc:`more to this topic <backends/generic-sql>`.
159
160IXFR: incremental zone transfers
161--------------------------------
162
163If the 'IXFR' zone metadata item is set to 1 for a zone, PowerDNS will
164attempt to retrieve zone updates via IXFR.
165
166.. warning::
167 If a slave zone changes from non-DNSSEC to DNSSEC, an IXFR
168 update will not set the PRESIGNED flag. In addition, a change in NSEC3
169 mode will also not be picked up.
170
171In such cases, make sure to delete the zone contents to force a fresh
172retrieval.
173
174Finally, IXFR updates that "plug" Empty Non Terminals do not yet remove
175ENT records. A 'pdnsutil rectify-zone' may be required.
176
177PowerDNS itself is currently only able to retrieve updates via IXFR. It
178can not serve IXFR updates.
179
180.. _supermaster-operation:
181
182Supermaster: automatic provisioning of slaves
183---------------------------------------------
184
185PowerDNS can recognize so called 'supermasters'. A supermaster is a host
186which is master for domains and for which we are to be a slave. When a
187master (re)loads a domain, it sends out a notification to its slaves.
188Normally, such a notification is only accepted if PowerDNS already knows
189that it is a slave for a domain.
190
191However, a notification from a supermaster carries more persuasion. When
192PowerDNS determines that a notification comes from a supermaster and it
193is bonafide, it can provision the domain automatically, and configure
194itself as a slave for that zone.
195
196Before a supermaster notification succeeds, the following conditions
49f9972c
PL
197must be met:
198
199 - The supermaster must carry a SOA record for the notified domain
200 - The supermaster IP must be present in the 'supermaster' table
201 - The set of NS records for the domain, as retrieved by the slave from the supermaster, must include the name that goes with the IP address in the supermaster table
202 - If your master sends signed NOTIFY it will mark that TSIG key as the TSIG key used for retrieval as well
203 - If you turn off :ref:`setting-allow-unsigned-supermaster`, then your supermaster(s) are required to sign their notifications.
0e2063c3
PL
204
205.. warning::
206 If you use another PowerDNS server as master and have
207 DNSSEC enabled on that server please don't forget to rectify the domains
208 after every change. If you don't do this there is no SOA record
209 available and one requirement will fail.
210
211So, to benefit from this feature, a backend needs to know about the IP
212address of the supermaster, and how PowerDNS will be listed in the set
213of NS records remotely, and the 'account' name of your supermaster.
214There is no need to fill the account name out but it does help keep
215track of where a domain comes from.
216
217.. note::
218 Removal of zones provisioned using the supermaster must be
219 done on the slaves themselves. As there is no way to signal this removal
220 from the master to the slave.
221
222.. _modes-of-operation-axfrfilter:
223
224Modifying a slave zone using a script
225-------------------------------------
226
227The PowerDNS Authoritative Server can invoke a Lua script on an incoming
228AXFR zone transfer. The user-defined function ``axfrfilter`` within your
229script is invoked for each resource record read during the transfer, and
230the outcome of the function defines what PowerDNS does with the records.
231
232What you can accomplish using a Lua script: - Ensure consistent values
233on SOA - Change incoming SOA serial number to a YYYYMMDDnn format -
234Ensure consistent NS RRset - Timestamp the zone transfer with a TXT
235record
236
237To enable a Lua script for a particular slave zone, determine the
238``domain_id`` for the zone from the ``domains`` table, and add a row to
239the ``domainmetadata`` table for the domain. Supposing the domain we
240want has an ``id`` of 3, the following SQL statement will enable the Lua
241script ``my.lua`` for that domain:
242
243::
244
245 INSERT INTO domainmetadata (domain_id, kind, content) VALUES (3, "LUA-AXFR-SCRIPT", "/lua/my.lua");
246
247.. warning::
248 The Lua script must both exist and be syntactically
249 correct; if not, the zone transfer is not performed.
250
251Your Lua functions have access to the query codes through a pre-defined
252Lua table called ``pdns``. For example if you want to check for a CNAME
253record you can either compare ``qtype`` to the numeric constant 5 or the
254value ``pdns.CNAME`` -- they are equivalent.
255
256If your function decides to handle a resource record it must return a
257result code of 0 together with a Lua table containing one or more
258replacement records to be stored in the back-end database (if the table
259is empty, no record is added). If you want your record(s) to be appended
260after the matching record, return 1 and table of record(s). If, on the
261other hand, your function decides not to modify a record, it must return
262-1 and an empty table indicating that PowerDNS should handle the
263incoming record as normal.
264
265Consider the following simple example:
266
267::
268
269 function axfrfilter(remoteip, zone, record)
270
271 -- Replace each HINFO records with this TXT
272 if record:qtype() == pdns.HINFO then
273 resp = {}
274 resp[1] = {
8b0f2ac7 275 qname = record:qname():toString(),
0e2063c3
PL
276 qtype = pdns.TXT,
277 ttl = 99,
278 content = "Hello Ahu!"
279 }
280 return 0, resp
281 end
282
283 -- Grab each _tstamp TXT record and add a time stamp
8b0f2ac7 284 if record:qtype() == pdns.TXT and string.starts(record:qname():toString(), "_tstamp.") then
0e2063c3
PL
285 resp = {}
286 resp[1] = {
287 qname = record:qname():toString(),
288 qtype = record:qtype(),
289 ttl = record:ttl(),
290 content = os.date("Ver %Y%m%d-%H:%M")
291 }
292 return 0, resp
293 end
294
295 -- Append A records with this TXT
296 if record:qtype() == pdns.A then
297 resp = {}
298 resp[1] = {
8b0f2ac7 299 qname = record:qname():toString(),
0e2063c3
PL
300 qtype = pdns.TXT,
301 ttl = 99,
302 content = "Hello Ahu, again!"
303 }
304 return 1, resp
305 end
306
307 resp = {}
308 return -1, resp
309 end
310
311 function string.starts(s, start)
312 return s.sub(s, 1, s.len(start)) == start
313 end
314
315Upon an incoming AXFR, PowerDNS calls our ``axfrfilter`` function for
316each record. All HINFO records are replaced by a TXT record with a TTL
317of 99 seconds and the specified string. TXT Records with names starting
318with ``_tstamp.`` get their value (rdata) set to the current time stamp.
319A records are appended with a TXT record. All other records are
320unhandled.