@serve.zone/dcrouter 34.0.0 → 34.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist_ts/00_commitinfo_data.js +1 -1
- package/dist_ts/dns/classes.dns-server-runtime.d.ts +12 -0
- package/dist_ts/dns/classes.dns-server-runtime.js +19 -3
- package/dist_ts/dns/manager.dns-authority.d.ts +49 -10
- package/dist_ts/dns/manager.dns-authority.js +351 -63
- package/dist_ts_interfaces/data/dns-authority.d.ts +64 -7
- package/dist_ts_interfaces/data/dns-authority.js +10 -5
- package/dist_ts_interfaces/requests/dns-authority.d.ts +7 -5
- package/dist_ts_web/00_commitinfo_data.js +1 -1
- package/package.json +4 -2
- package/readme.md +59 -10
- package/ts/00_commitinfo_data.ts +1 -1
- package/ts/dns/classes.dns-server-runtime.ts +21 -2
- package/ts/dns/manager.dns-authority.ts +429 -66
- package/ts_web/00_commitinfo_data.ts +1 -1
|
@@ -16,6 +16,175 @@ const isUsableZoneName = (zoneArg) => {
|
|
|
16
16
|
&& labelArg.length <= 63
|
|
17
17
|
&& /^[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$/.test(labelArg));
|
|
18
18
|
};
|
|
19
|
+
/** Timeout of each DNS-over-HTTPS lookup of a probe (D). */
|
|
20
|
+
const PROBE_DOH_TIMEOUT_MS = 5_000;
|
|
21
|
+
/**
|
|
22
|
+
* Timeout of each attempt of a parent server query (T). A truncated UDP answer
|
|
23
|
+
* is asked again over TCP with its own timeout, so one server costs at most 2·T.
|
|
24
|
+
*/
|
|
25
|
+
const PARENT_QUERY_TIMEOUT_MS = 2_000;
|
|
26
|
+
/**
|
|
27
|
+
* No probe phase starts after this deadline. The phase in flight may still run
|
|
28
|
+
* to its own bound, so a probe ends within the deadline + max(D, 2·T) = 35 s,
|
|
29
|
+
* which is also the longest a claim holds the DNS mutation lock for its probe.
|
|
30
|
+
*/
|
|
31
|
+
const PROBE_DEADLINE_MS = 30_000;
|
|
32
|
+
/** Proper suffixes of the zone tried as its parent zone, nearest first. */
|
|
33
|
+
const PARENT_WALK_LIMIT = 8;
|
|
34
|
+
/** Parent nameserver names whose addresses are looked up. */
|
|
35
|
+
const PARENT_NAME_LIMIT = 8;
|
|
36
|
+
/** Parent servers asked for the referral. */
|
|
37
|
+
const PARENT_SERVER_LIMIT = 4;
|
|
38
|
+
/** Conclusive parent answers needed, from as many different parent nameserver names. */
|
|
39
|
+
const PARENT_AGREEMENT_MINIMUM = 2;
|
|
40
|
+
const describeError = (errorArg) => errorArg instanceof Error ? errorArg.message : String(errorArg);
|
|
41
|
+
const describeDohError = (resultArg) => resultArg.status === 'error'
|
|
42
|
+
? `${resultArg.error.kind}/${resultArg.error.code}: ${resultArg.error.message}`
|
|
43
|
+
: resultArg.status;
|
|
44
|
+
/** The address the probe asks, as `ip:port`, the way smartdns reports servers. */
|
|
45
|
+
const formatParentServer = (addressArg) => plugins.net.isIPv6(addressArg) ? `[${addressArg}]:53` : `${addressArg}:53`;
|
|
46
|
+
const rcodeNames = {
|
|
47
|
+
0: 'NOERROR',
|
|
48
|
+
1: 'FORMERR',
|
|
49
|
+
2: 'SERVFAIL',
|
|
50
|
+
3: 'NXDOMAIN',
|
|
51
|
+
4: 'NOTIMP',
|
|
52
|
+
5: 'REFUSED',
|
|
53
|
+
};
|
|
54
|
+
const describeRcode = (rcodeArg) => rcodeNames[rcodeArg] ?? `RCODE ${rcodeArg}`;
|
|
55
|
+
/**
|
|
56
|
+
* Classify one parent server's answer to the non-recursive NS query for
|
|
57
|
+
* `zoneArg`. Only two shapes are conclusive, and everything else is not:
|
|
58
|
+
*
|
|
59
|
+
* - a referral: RCODE 0, AA=0, an empty answer section, at least one authority
|
|
60
|
+
* NS and every authority NS owned by the zone, and an OPT record echoing DO=1.
|
|
61
|
+
* Without that echo the server may simply not have sent the DS, so a referral
|
|
62
|
+
* without one would not prove that there is none.
|
|
63
|
+
* - a negative: AA=1, NXDOMAIN or NODATA, an empty answer section, and SOA
|
|
64
|
+
* records in the authority section that are all owned by the parent zone.
|
|
65
|
+
*
|
|
66
|
+
* Any other AA=1 answer is inconclusive, an AA=1 referral included: a server
|
|
67
|
+
* that hosts both the parent and the child answers for the child, and such an
|
|
68
|
+
* answer says nothing about the delegation.
|
|
69
|
+
*/
|
|
70
|
+
const classifyParentAnswer = (zoneArg, parentZoneArg, resultArg) => {
|
|
71
|
+
const inconclusive = (detailArg) => ({ outcome: 'inconclusive', detail: detailArg });
|
|
72
|
+
if (resultArg.status === 'error') {
|
|
73
|
+
return inconclusive(`no usable answer (${resultArg.error.kind}/${resultArg.error.code}): ${resultArg.error.message}`);
|
|
74
|
+
}
|
|
75
|
+
if (resultArg.flags.tc)
|
|
76
|
+
return inconclusive('the answer is truncated');
|
|
77
|
+
if (resultArg.flags.aa) {
|
|
78
|
+
const soaOwners = resultArg.authorities
|
|
79
|
+
.filter((recordArg) => recordArg.type === 'SOA')
|
|
80
|
+
.map((recordArg) => normalizeZone(recordArg.name));
|
|
81
|
+
const isNegative = (resultArg.rcode === 0 || resultArg.rcode === 3)
|
|
82
|
+
&& resultArg.answers.length === 0
|
|
83
|
+
&& soaOwners.length > 0
|
|
84
|
+
&& soaOwners.every((ownerArg) => ownerArg === parentZoneArg);
|
|
85
|
+
if (isNegative) {
|
|
86
|
+
return {
|
|
87
|
+
outcome: 'negative',
|
|
88
|
+
detail: `${describeRcode(resultArg.rcode)} from ${parentZoneArg}: no delegation for ${zoneArg}`,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
if (resultArg.answers.some((recordArg) => recordArg.type === 'NS' && normalizeZone(recordArg.name) === zoneArg)) {
|
|
92
|
+
return inconclusive(`authoritative for ${zoneArg} itself (AA=1 NS answer), not a referral from ${parentZoneArg}`);
|
|
93
|
+
}
|
|
94
|
+
return inconclusive(`authoritative ${describeRcode(resultArg.rcode)} that is neither a referral nor a negative from ${parentZoneArg}`);
|
|
95
|
+
}
|
|
96
|
+
if (resultArg.rcode !== 0)
|
|
97
|
+
return inconclusive(`${describeRcode(resultArg.rcode)} without AA`);
|
|
98
|
+
if (resultArg.answers.length > 0)
|
|
99
|
+
return inconclusive('a non-authoritative answer section, not a referral');
|
|
100
|
+
const referralRecords = resultArg.authorities.filter((recordArg) => recordArg.type === 'NS');
|
|
101
|
+
if (referralRecords.length === 0)
|
|
102
|
+
return inconclusive('no NS records in the authority section');
|
|
103
|
+
const foreignOwner = referralRecords.find((recordArg) => normalizeZone(recordArg.name) !== zoneArg);
|
|
104
|
+
if (foreignOwner) {
|
|
105
|
+
return inconclusive(`a referral for ${normalizeZone(foreignOwner.name) || '.'}, not for ${zoneArg}`);
|
|
106
|
+
}
|
|
107
|
+
if (resultArg.edns?.dnssecOk !== true) {
|
|
108
|
+
return inconclusive('the answer does not echo DO=1, so the absence of a DS is not proven');
|
|
109
|
+
}
|
|
110
|
+
const nameservers = [...new Set(referralRecords.map((recordArg) => normalizeNameserver(recordArg.value)).filter(Boolean))].sort();
|
|
111
|
+
if (nameservers.length === 0)
|
|
112
|
+
return inconclusive('referral NS records without a nameserver name');
|
|
113
|
+
const dsPresent = resultArg.authorities.some((recordArg) => recordArg.type === 'DS' && normalizeZone(recordArg.name) === zoneArg);
|
|
114
|
+
return {
|
|
115
|
+
outcome: 'referral',
|
|
116
|
+
nameservers,
|
|
117
|
+
dsPresent,
|
|
118
|
+
detail: `referral to ${nameservers.join(', ')}${dsPresent ? ' with a DS' : ' without a DS'}`,
|
|
119
|
+
};
|
|
120
|
+
};
|
|
121
|
+
/** What "identical" compares: the normalised NS set and DS presence, nothing else. */
|
|
122
|
+
const parentAnswerKey = (answerArg) => answerArg.outcome === 'referral'
|
|
123
|
+
? `referral:${(answerArg.nameservers ?? []).join(',')}|ds:${answerArg.dsPresent === true}`
|
|
124
|
+
: answerArg.outcome;
|
|
125
|
+
/**
|
|
126
|
+
* Turn the parent servers' classified answers into a verdict: at least two
|
|
127
|
+
* conclusive answers, through at least two different parent nameserver names,
|
|
128
|
+
* all identical — any disagreement is undeterminable.
|
|
129
|
+
*/
|
|
130
|
+
const aggregateParentAnswers = (zoneArg, parentZoneArg, expectedNameserversArg, answersArg) => {
|
|
131
|
+
const base = {
|
|
132
|
+
zone: zoneArg,
|
|
133
|
+
expectedNameservers: expectedNameserversArg,
|
|
134
|
+
parentZone: parentZoneArg,
|
|
135
|
+
parentAnswers: answersArg,
|
|
136
|
+
};
|
|
137
|
+
const undeterminable = (detailArg) => ({
|
|
138
|
+
...base,
|
|
139
|
+
verdict: 'undeterminable',
|
|
140
|
+
observedNameservers: [],
|
|
141
|
+
detail: detailArg,
|
|
142
|
+
});
|
|
143
|
+
const conclusive = answersArg.filter((answerArg) => answerArg.outcome !== 'inconclusive');
|
|
144
|
+
if (conclusive.length < PARENT_AGREEMENT_MINIMUM) {
|
|
145
|
+
return undeterminable(`${conclusive.length} of ${answersArg.length} parent server(s) of ${parentZoneArg} gave a conclusive answer `
|
|
146
|
+
+ `for ${zoneArg}; at least ${PARENT_AGREEMENT_MINIMUM} identical ones are needed`);
|
|
147
|
+
}
|
|
148
|
+
if (new Set(conclusive.map(parentAnswerKey)).size > 1) {
|
|
149
|
+
return undeterminable(`the parent servers of ${parentZoneArg} disagree about ${zoneArg}: `
|
|
150
|
+
+ conclusive.map((answerArg) => `${answerArg.server} (${answerArg.nameserver}) ${answerArg.detail}`).join('; '));
|
|
151
|
+
}
|
|
152
|
+
const agreeingNames = [...new Set(conclusive.map((answerArg) => answerArg.nameserver))];
|
|
153
|
+
if (agreeingNames.length < PARENT_AGREEMENT_MINIMUM) {
|
|
154
|
+
return undeterminable(`the conclusive answers for ${zoneArg} all came through one parent nameserver name (${agreeingNames.join(', ')}); `
|
|
155
|
+
+ `at least ${PARENT_AGREEMENT_MINIMUM} different names are needed`);
|
|
156
|
+
}
|
|
157
|
+
const agreed = conclusive[0];
|
|
158
|
+
if (agreed.outcome === 'negative') {
|
|
159
|
+
return {
|
|
160
|
+
...base,
|
|
161
|
+
verdict: 'not-delegated',
|
|
162
|
+
observedNameservers: [],
|
|
163
|
+
detail: `${parentZoneArg} has no delegation for ${zoneArg}`,
|
|
164
|
+
};
|
|
165
|
+
}
|
|
166
|
+
const delegatedTo = agreed.nameservers ?? [];
|
|
167
|
+
const dsPresent = agreed.dsPresent === true;
|
|
168
|
+
const ours = delegatedTo.filter((nameserverArg) => expectedNameserversArg.includes(nameserverArg));
|
|
169
|
+
if (ours.length === 0) {
|
|
170
|
+
return {
|
|
171
|
+
...base,
|
|
172
|
+
verdict: 'not-delegated',
|
|
173
|
+
observedNameservers: delegatedTo,
|
|
174
|
+
dsPresent,
|
|
175
|
+
detail: `${parentZoneArg} delegates ${zoneArg} to ${delegatedTo.join(', ')}, which does not include any of our `
|
|
176
|
+
+ `nameservers (${expectedNameserversArg.join(', ')})`,
|
|
177
|
+
};
|
|
178
|
+
}
|
|
179
|
+
return {
|
|
180
|
+
...base,
|
|
181
|
+
verdict: 'delegated',
|
|
182
|
+
observedNameservers: delegatedTo,
|
|
183
|
+
dsPresent,
|
|
184
|
+
detail: `${parentZoneArg} delegates ${zoneArg} to ${delegatedTo.join(', ')}`
|
|
185
|
+
+ (dsPresent ? `; ${parentZoneArg} publishes a DS for ${zoneArg}` : ''),
|
|
186
|
+
};
|
|
187
|
+
};
|
|
19
188
|
/**
|
|
20
189
|
* DnsAuthorityManager — owns which zones dcrouter may answer for
|
|
21
190
|
* authoritatively, and proves that claim rather than accepting it.
|
|
@@ -30,9 +199,9 @@ const isUsableZoneName = (zoneArg) => {
|
|
|
30
199
|
* any domain and manufacture that proof — the identical self-assertion vector
|
|
31
200
|
* that `createDcrouterDomain` used to have.
|
|
32
201
|
*
|
|
33
|
-
* So a zone earns authority by delegation instead: its
|
|
34
|
-
* name our `dnsNsDomains`. An ops-API caller cannot fake that without
|
|
35
|
-
* controlling the domain, so the proof stays unforgeable while becoming
|
|
202
|
+
* So a zone earns authority by delegation instead: its delegation in the parent
|
|
203
|
+
* zone must name our `dnsNsDomains`. An ops-API caller cannot fake that without
|
|
204
|
+
* actually controlling the domain, so the proof stays unforgeable while becoming
|
|
36
205
|
* mutable at runtime. It is also the comparison that was missing — claimed
|
|
37
206
|
* authority versus real delegation, checked by the mechanism itself rather than
|
|
38
207
|
* by an audit bolted on afterwards.
|
|
@@ -180,18 +349,43 @@ export class DnsAuthorityManager {
|
|
|
180
349
|
// Delegation probe
|
|
181
350
|
// ==========================================================================
|
|
182
351
|
/**
|
|
183
|
-
* Ask the
|
|
352
|
+
* Ask the parent zone's own servers whether `zone` is delegated to our
|
|
353
|
+
* nameservers.
|
|
184
354
|
*
|
|
185
|
-
*
|
|
186
|
-
*
|
|
187
|
-
*
|
|
188
|
-
*
|
|
189
|
-
*
|
|
190
|
-
*
|
|
355
|
+
* A recursive lookup of the zone cannot prove this. For a zone delegated to
|
|
356
|
+
* us but not claimed yet, a public resolver follows the delegation to our
|
|
357
|
+
* servers, which REFUSE the zone because it is not claimed, so the resolver
|
|
358
|
+
* answers SERVFAIL and the zone could never be claimed. The delegation itself
|
|
359
|
+
* lives in the parent zone, so the probe reads it there:
|
|
360
|
+
*
|
|
361
|
+
* 1. Find the parent zone over DNS-over-HTTPS: the nearest proper suffix of
|
|
362
|
+
* the zone with an NS RRset (at most 8 levels). The zone itself, and every
|
|
363
|
+
* name below it, is never looked up over DoH: that is the circular query.
|
|
364
|
+
* A failed lookup at any level is undeterminable; a level is never
|
|
365
|
+
* skipped, which could pick a grandparent.
|
|
366
|
+
* 2. Look up A and AAAA of up to 8 parent nameserver names (sorted, names at
|
|
367
|
+
* or below the zone dropped) over DoH, and pick up to 4 distinct addresses:
|
|
368
|
+
* one per name first, IPv4 before IPv6, then further addresses round by
|
|
369
|
+
* round. Fewer than 2 names with an address is undeterminable.
|
|
370
|
+
* 3. Ask each picked server, in parallel, for the zone's NS with RD=0 and
|
|
371
|
+
* DO=1, over UDP (TCP when truncated). A signed parent then sends the DS
|
|
372
|
+
* with the referral, so DS presence needs no further query.
|
|
373
|
+
* 4. Classify every answer (`classifyParentAnswer`) and require at least 2
|
|
374
|
+
* identical conclusive answers through at least 2 different parent
|
|
375
|
+
* nameserver names (`aggregateParentAnswers`). Glue, TTLs, case and order
|
|
376
|
+
* are not compared.
|
|
377
|
+
*
|
|
378
|
+
* DoH never decides a verdict; only the parent's servers do. The DoH
|
|
379
|
+
* lookups never use the system resolver: on a dcrouter host that may be
|
|
380
|
+
* dcrouter itself, which would make the probe self-confirming.
|
|
191
381
|
*
|
|
192
382
|
* The three verdicts are kept distinct on purpose. A timeout is not evidence
|
|
193
383
|
* that a zone is not ours; collapsing 'undeterminable' into 'not-delegated'
|
|
194
384
|
* would let a transient resolver fault revoke authority.
|
|
385
|
+
*
|
|
386
|
+
* Known limitation: the parent servers of a zone below a zone we already
|
|
387
|
+
* serve are our own, which answer for the parent authoritatively, so such a
|
|
388
|
+
* zone is undeterminable.
|
|
195
389
|
*/
|
|
196
390
|
probeDelegation(zoneArg) {
|
|
197
391
|
if (this.stopped)
|
|
@@ -213,7 +407,7 @@ export class DnsAuthorityManager {
|
|
|
213
407
|
return new plugins.smartdns.dnsClientMod.Smartdns({
|
|
214
408
|
strategy: 'doh',
|
|
215
409
|
allowDohFallback: false,
|
|
216
|
-
timeoutMs:
|
|
410
|
+
timeoutMs: PROBE_DOH_TIMEOUT_MS,
|
|
217
411
|
});
|
|
218
412
|
}
|
|
219
413
|
async probeDelegationUnlocked(zoneArg) {
|
|
@@ -242,65 +436,146 @@ export class DnsAuthorityManager {
|
|
|
242
436
|
const smartdnsClient = this.createProbeClient();
|
|
243
437
|
this.ownedProbeClients.add(smartdnsClient);
|
|
244
438
|
try {
|
|
245
|
-
|
|
246
|
-
|
|
247
|
-
|
|
439
|
+
const deadline = Date.now() + PROBE_DEADLINE_MS;
|
|
440
|
+
const undeterminable = (detailArg, parentZoneArg) => ({
|
|
441
|
+
zone,
|
|
442
|
+
verdict: 'undeterminable',
|
|
443
|
+
observedNameservers: [],
|
|
444
|
+
expectedNameservers,
|
|
445
|
+
detail: detailArg,
|
|
446
|
+
...(parentZoneArg ? { parentZone: parentZoneArg } : {}),
|
|
447
|
+
});
|
|
448
|
+
const parent = await this.findParentZone(smartdnsClient, zone, deadline);
|
|
449
|
+
if (parent.status === 'failed')
|
|
450
|
+
return undeterminable(parent.detail);
|
|
451
|
+
if (Date.now() >= deadline) {
|
|
452
|
+
return undeterminable('the probe deadline passed before the parent servers were resolved', parent.parentZone);
|
|
248
453
|
}
|
|
249
|
-
|
|
250
|
-
|
|
251
|
-
|
|
252
|
-
|
|
253
|
-
|
|
254
|
-
expectedNameservers,
|
|
255
|
-
detail: `delegation lookup threw: ${error.message}`,
|
|
256
|
-
};
|
|
454
|
+
const selection = await this.selectParentServers(smartdnsClient, zone, parent.parentZone, parent.nameservers);
|
|
455
|
+
if (selection.status === 'failed')
|
|
456
|
+
return undeterminable(selection.detail, parent.parentZone);
|
|
457
|
+
if (Date.now() >= deadline) {
|
|
458
|
+
return undeterminable('the probe deadline passed before the parent servers were asked', parent.parentZone);
|
|
257
459
|
}
|
|
258
|
-
|
|
259
|
-
|
|
260
|
-
|
|
261
|
-
|
|
262
|
-
|
|
263
|
-
|
|
264
|
-
|
|
265
|
-
|
|
460
|
+
const answers = await Promise.all(selection.servers.map((serverArg) => this.askParentServer(smartdnsClient, zone, parent.parentZone, serverArg)));
|
|
461
|
+
return aggregateParentAnswers(zone, parent.parentZone, expectedNameservers, answers);
|
|
462
|
+
}
|
|
463
|
+
finally {
|
|
464
|
+
// Keep ownership if confirmed termination fails; stop() can retry it.
|
|
465
|
+
await smartdnsClient.terminate();
|
|
466
|
+
this.ownedProbeClients.delete(smartdnsClient);
|
|
467
|
+
}
|
|
468
|
+
}
|
|
469
|
+
/** One DoH lookup; a thrown lookup is a failed one. */
|
|
470
|
+
async lookUpOverDoh(clientArg, nameArg, typeArg) {
|
|
471
|
+
try {
|
|
472
|
+
return await clientArg.queryRecords(nameArg, typeArg);
|
|
473
|
+
}
|
|
474
|
+
catch (error) {
|
|
475
|
+
return { status: 'thrown', message: describeError(error) };
|
|
476
|
+
}
|
|
477
|
+
}
|
|
478
|
+
/** Step 1: the nearest proper suffix of the zone with an NS RRset, over DoH. */
|
|
479
|
+
async findParentZone(clientArg, zoneArg, deadlineArg) {
|
|
480
|
+
const labels = zoneArg.split('.');
|
|
481
|
+
const candidates = labels.slice(1).map((_labelArg, indexArg) => labels.slice(indexArg + 1).join('.'));
|
|
482
|
+
for (const [index, candidate] of candidates.entries()) {
|
|
483
|
+
if (index >= PARENT_WALK_LIMIT) {
|
|
484
|
+
return { status: 'failed', detail: `no parent zone of ${zoneArg} found within ${PARENT_WALK_LIMIT} levels` };
|
|
266
485
|
}
|
|
267
|
-
if (
|
|
268
|
-
return {
|
|
269
|
-
zone,
|
|
270
|
-
verdict: 'not-delegated',
|
|
271
|
-
observedNameservers: [],
|
|
272
|
-
expectedNameservers,
|
|
273
|
-
detail: result.missingReason === 'nxdomain'
|
|
274
|
-
? `${zone} does not exist in public DNS`
|
|
275
|
-
: `${zone} has no NS records in public DNS`,
|
|
276
|
-
};
|
|
486
|
+
if (Date.now() >= deadlineArg) {
|
|
487
|
+
return { status: 'failed', detail: `the probe deadline passed while looking for the parent zone of ${zoneArg}` };
|
|
277
488
|
}
|
|
278
|
-
const
|
|
279
|
-
|
|
280
|
-
|
|
281
|
-
|
|
282
|
-
if (
|
|
283
|
-
return {
|
|
284
|
-
zone,
|
|
285
|
-
verdict: 'not-delegated',
|
|
286
|
-
observedNameservers,
|
|
287
|
-
expectedNameservers,
|
|
288
|
-
detail: `${zone} is delegated to ${observedNameservers.join(', ') || 'nothing'}, which does not include any of our nameservers (${expectedNameservers.join(', ')})`,
|
|
289
|
-
};
|
|
489
|
+
const result = await this.lookUpOverDoh(clientArg, candidate, 'NS');
|
|
490
|
+
if (result.status === 'thrown') {
|
|
491
|
+
return { status: 'failed', detail: `parent zone lookup for ${candidate} threw: ${result.message}` };
|
|
492
|
+
}
|
|
493
|
+
if (result.status === 'error') {
|
|
494
|
+
return { status: 'failed', detail: `parent zone lookup for ${candidate} failed (${describeDohError(result)})` };
|
|
290
495
|
}
|
|
496
|
+
if (result.status === 'missing')
|
|
497
|
+
continue;
|
|
498
|
+
const nameservers = [...new Set(result.records
|
|
499
|
+
.filter((recordArg) => recordArg.type === 'NS' && normalizeZone(recordArg.name) === candidate)
|
|
500
|
+
.map((recordArg) => normalizeNameserver(String(recordArg.value ?? '')))
|
|
501
|
+
.filter(Boolean))];
|
|
502
|
+
if (nameservers.length === 0)
|
|
503
|
+
continue;
|
|
504
|
+
return { status: 'found', parentZone: candidate, nameservers };
|
|
505
|
+
}
|
|
506
|
+
return { status: 'failed', detail: `no parent zone of ${zoneArg} found` };
|
|
507
|
+
}
|
|
508
|
+
/**
|
|
509
|
+
* Step 2: up to 4 distinct parent server addresses over DoH, one per parent
|
|
510
|
+
* nameserver name first. An address belongs to the first name (in sorted
|
|
511
|
+
* order) that resolves to it, so one server never counts for two names.
|
|
512
|
+
*/
|
|
513
|
+
async selectParentServers(clientArg, zoneArg, parentZoneArg, nameserversArg) {
|
|
514
|
+
const names = [...new Set(nameserversArg)]
|
|
515
|
+
.filter((nameArg) => nameArg !== zoneArg && !nameArg.endsWith(`.${zoneArg}`))
|
|
516
|
+
.sort()
|
|
517
|
+
.slice(0, PARENT_NAME_LIMIT);
|
|
518
|
+
const addressesOf = (resultArg, familyArg) => resultArg.status === 'success'
|
|
519
|
+
? [...new Set(resultArg.records
|
|
520
|
+
.map((recordArg) => String(recordArg.value ?? '').trim().toLowerCase())
|
|
521
|
+
.filter((addressArg) => plugins.net.isIP(addressArg) === familyArg))].sort()
|
|
522
|
+
: [];
|
|
523
|
+
const resolved = await Promise.all(names.map(async (nameserverArg) => {
|
|
524
|
+
const [ipv4, ipv6] = await Promise.all([
|
|
525
|
+
this.lookUpOverDoh(clientArg, nameserverArg, 'A'),
|
|
526
|
+
this.lookUpOverDoh(clientArg, nameserverArg, 'AAAA'),
|
|
527
|
+
]);
|
|
528
|
+
return { nameserver: nameserverArg, addresses: [...addressesOf(ipv4, 4), ...addressesOf(ipv6, 6)] };
|
|
529
|
+
}));
|
|
530
|
+
const claimed = new Set();
|
|
531
|
+
const perName = resolved
|
|
532
|
+
.map((entryArg) => ({
|
|
533
|
+
nameserver: entryArg.nameserver,
|
|
534
|
+
addresses: entryArg.addresses.filter((addressArg) => {
|
|
535
|
+
if (claimed.has(addressArg))
|
|
536
|
+
return false;
|
|
537
|
+
claimed.add(addressArg);
|
|
538
|
+
return true;
|
|
539
|
+
}),
|
|
540
|
+
}))
|
|
541
|
+
.filter((entryArg) => entryArg.addresses.length > 0);
|
|
542
|
+
if (perName.length < PARENT_AGREEMENT_MINIMUM) {
|
|
291
543
|
return {
|
|
292
|
-
|
|
293
|
-
|
|
294
|
-
|
|
295
|
-
expectedNameservers,
|
|
296
|
-
detail: `${zone} is delegated to ${matches.join(', ')}`,
|
|
544
|
+
status: 'failed',
|
|
545
|
+
detail: `only ${perName.length} of the ${names.length} usable nameserver name(s) of ${parentZoneArg} `
|
|
546
|
+
+ `(${names.join(', ') || 'none'}) have a resolvable address; at least ${PARENT_AGREEMENT_MINIMUM} are needed`,
|
|
297
547
|
};
|
|
298
548
|
}
|
|
299
|
-
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
549
|
+
const servers = [];
|
|
550
|
+
for (let round = 0; servers.length < PARENT_SERVER_LIMIT; round++) {
|
|
551
|
+
const picks = perName
|
|
552
|
+
.filter((entryArg) => round < entryArg.addresses.length)
|
|
553
|
+
.map((entryArg) => ({ address: entryArg.addresses[round], nameserver: entryArg.nameserver }));
|
|
554
|
+
if (picks.length === 0)
|
|
555
|
+
break;
|
|
556
|
+
servers.push(...picks.slice(0, PARENT_SERVER_LIMIT - servers.length));
|
|
303
557
|
}
|
|
558
|
+
return { status: 'selected', servers };
|
|
559
|
+
}
|
|
560
|
+
/** Step 3: the non-recursive NS query for the zone to one parent server. */
|
|
561
|
+
async askParentServer(clientArg, zoneArg, parentZoneArg, serverArg) {
|
|
562
|
+
const identity = { server: formatParentServer(serverArg.address), nameserver: serverArg.nameserver };
|
|
563
|
+
let result;
|
|
564
|
+
try {
|
|
565
|
+
result = await clientArg.queryServer({
|
|
566
|
+
server: serverArg.address,
|
|
567
|
+
name: zoneArg,
|
|
568
|
+
type: 'NS',
|
|
569
|
+
recursionDesired: false,
|
|
570
|
+
dnssecOk: true,
|
|
571
|
+
transport: 'udp',
|
|
572
|
+
timeoutMs: PARENT_QUERY_TIMEOUT_MS,
|
|
573
|
+
});
|
|
574
|
+
}
|
|
575
|
+
catch (error) {
|
|
576
|
+
return { ...identity, outcome: 'inconclusive', detail: `the query threw: ${describeError(error)}` };
|
|
577
|
+
}
|
|
578
|
+
return { ...identity, ...classifyParentAnswer(zoneArg, parentZoneArg, result) };
|
|
304
579
|
}
|
|
305
580
|
// ==========================================================================
|
|
306
581
|
// Mutations
|
|
@@ -308,6 +583,8 @@ export class DnsAuthorityManager {
|
|
|
308
583
|
/**
|
|
309
584
|
* Claim authority over a zone, but only against a positive delegation proof.
|
|
310
585
|
* An undeterminable probe refuses the mutation — never assume either way.
|
|
586
|
+
* A delegation whose parent zone publishes a DS for the zone is refused as
|
|
587
|
+
* well (`dsPresent`); the DS has to be removed at the registrar first.
|
|
311
588
|
*/
|
|
312
589
|
async verifyZone(zoneArg, verifiedBy) {
|
|
313
590
|
const zone = normalizeZone(zoneArg);
|
|
@@ -326,6 +603,14 @@ export class DnsAuthorityManager {
|
|
|
326
603
|
: `Cannot verify ${zone}: ${probe.detail}`,
|
|
327
604
|
};
|
|
328
605
|
}
|
|
606
|
+
if (probe.dsPresent) {
|
|
607
|
+
return {
|
|
608
|
+
success: false,
|
|
609
|
+
probe,
|
|
610
|
+
message: `Cannot verify ${zone}: ${probe.parentZone ?? 'the parent zone'} publishes a DS for ${zone}, `
|
|
611
|
+
+ 'and dcrouter refuses zones with a DS. Remove the DS at the registrar, then verify again.',
|
|
612
|
+
};
|
|
613
|
+
}
|
|
329
614
|
const entry = {
|
|
330
615
|
zone,
|
|
331
616
|
origin: 'verified',
|
|
@@ -460,7 +745,10 @@ export class DnsAuthorityManager {
|
|
|
460
745
|
observedNameservers: probe.observedNameservers,
|
|
461
746
|
expectedNameservers: probe.expectedNameservers,
|
|
462
747
|
detail: `${zone} is delegated to ${probe.observedNameservers.join(', ')} but is not in the authority set, `
|
|
463
|
-
+ 'so dcrouter refuses to serve it authoritatively and will not request certificates for it'
|
|
748
|
+
+ 'so dcrouter refuses to serve it authoritatively and will not request certificates for it'
|
|
749
|
+
+ (probe.dsPresent
|
|
750
|
+
? `; ${probe.parentZone ?? 'the parent zone'} publishes a DS for ${zone}, which blocks the claim until it is removed`
|
|
751
|
+
: ''),
|
|
464
752
|
});
|
|
465
753
|
}
|
|
466
754
|
// Direction 2: a verified zone whose delegation moved away from us.
|
|
@@ -522,4 +810,4 @@ export class DnsAuthorityManager {
|
|
|
522
810
|
}
|
|
523
811
|
}
|
|
524
812
|
}
|
|
525
|
-
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFuYWdlci5kbnMtYXV0aG9yaXR5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvZG5zL21hbmFnZXIuZG5zLWF1dGhvcml0eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUF1QnRFLE1BQU0sYUFBYSxHQUFHLENBQUMsT0FBZSxFQUFVLEVBQUUsQ0FDaEQsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFFbEQsZ0VBQWdFO0FBQ2hFLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxhQUFxQixFQUFVLEVBQUUsQ0FDNUQsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFFeEQsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLE9BQWUsRUFBVyxFQUFFO0lBQ3BELElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxHQUFHO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDbkQsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUMxRixNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2xDLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDcEMsT0FBTyxN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
|
|
813
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWFuYWdlci5kbnMtYXV0aG9yaXR5LmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vdHMvZG5zL21hbmFnZXIuZG5zLWF1dGhvcml0eS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEtBQUssT0FBTyxNQUFNLGVBQWUsQ0FBQztBQUN6QyxPQUFPLEVBQUUsTUFBTSxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQ3RDLE9BQU8sRUFBRSxlQUFlLEVBQUUsU0FBUyxFQUFFLE1BQU0sMEJBQTBCLENBQUM7QUF3QnRFLE1BQU0sYUFBYSxHQUFHLENBQUMsT0FBZSxFQUFVLEVBQUUsQ0FDaEQsT0FBTyxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFFbEQsZ0VBQWdFO0FBQ2hFLE1BQU0sbUJBQW1CLEdBQUcsQ0FBQyxhQUFxQixFQUFVLEVBQUUsQ0FDNUQsYUFBYSxDQUFDLElBQUksRUFBRSxDQUFDLFdBQVcsRUFBRSxDQUFDLE9BQU8sQ0FBQyxLQUFLLEVBQUUsRUFBRSxDQUFDLENBQUM7QUFFeEQsTUFBTSxnQkFBZ0IsR0FBRyxDQUFDLE9BQWUsRUFBVyxFQUFFO0lBQ3BELElBQUksQ0FBQyxPQUFPLElBQUksT0FBTyxDQUFDLE1BQU0sR0FBRyxHQUFHO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDbkQsSUFBSSxPQUFPLENBQUMsUUFBUSxDQUFDLEdBQUcsQ0FBQyxJQUFJLE9BQU8sQ0FBQyxRQUFRLENBQUMsR0FBRyxDQUFDLElBQUksT0FBTyxDQUFDLFFBQVEsQ0FBQyxHQUFHLENBQUM7UUFBRSxPQUFPLEtBQUssQ0FBQztJQUMxRixNQUFNLE1BQU0sR0FBRyxPQUFPLENBQUMsS0FBSyxDQUFDLEdBQUcsQ0FBQyxDQUFDO0lBQ2xDLElBQUksTUFBTSxDQUFDLE1BQU0sR0FBRyxDQUFDO1FBQUUsT0FBTyxLQUFLLENBQUM7SUFDcEMsT0FBTyxN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
|